@lmctl-ai/lmctl 0.1.42 → 0.1.43

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 +338 -338
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -1,20 +1,20 @@
1
- var LT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{for(var r in e)LT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Dr,readdirSync as CT,readFileSync as MT}from"node:fs";import{homedir as DT,platform as If}from"node:os";import{join as Tt}from"node:path";function mr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Tt(DT(),PT)}function jn(){return Tt(mr(),xf)}function pr(){return Tt(mr(),FT)}function kt(t){return Tt(pr(),t)}function Wt(t){return Tt(kt(t),xf)}function Ha(){let t=[],e=new Set,r=o=>{Dr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:jn(),kind:"legacy"});let n=pr();if(!Dr(n))return t;let s;try{s=CT(n)}catch{return t}for(let o of s.sort())qe(o)&&r({workspace_name:o,db_path:Wt(o),kind:"workspace"});return t}function Ja(t){return Tt(kt(t),"projects")}function Bs(){return Tt(mr(),UT)}function qe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function qs(){let t=Bs();if(!Dr(t))return null;try{let e=MT(t,"utf8").trim();return e.length===0||!qe(e)?null:e}catch{return null}}function Nn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&qe(t)?t:qs()}function ce(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Nn();if(e!==null)return Wt(e);let r=jn();return Dr(r)||!Dr(pr())?r:Wt($f)}function qT(t,e=If()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function jf(t,e=process.stderr,r=If()){qT(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
- `)}function Xa(){return Tt(mr(),WT)}function Nf(){return Tt(mr(),BT)}function HT(){try{return Dr(Xa())}catch{return!1}}function Af(t=process.stderr){HT()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
- `)}var PT,xf,FT,UT,$f,WT,BT,hr,Ve=b(()=>{"use strict";PT=".lmctl",xf="state.db",FT="workspaces",UT="active-workspace",$f="default",WT="profiles",BT="active-profile";hr={default:$f}});function VT(t){for(let e of GT)if(t.startsWith(e))return!0;if(t.startsWith("172.")){let e=Number(t.split(".")[1]);if(Number.isFinite(e)&&e>=16&&e<=31)return!0}return!!t.startsWith("169.254.")}function KT(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function ZT(t){let e=t.split(".");if(e.length!==4)return!1;for(let r of e){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function An(t){let e=t;for(let{re:r,replacement:n}of XT)e=e.replace(r,n);return e=e.replace(YT,r=>!ZT(r)||VT(r)?r:Rf),e=e.replace(zT,r=>KT(r)?r:Rf),e}function Rn(t){return t.split(`
1
+ var LT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{for(var r in e)LT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Dr,readdirSync as CT,readFileSync as MT}from"node:fs";import{homedir as DT,platform as $f}from"node:os";import{join as Tt}from"node:path";function mr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Tt(DT(),PT)}function jn(){return Tt(mr(),jf)}function pr(){return Tt(mr(),FT)}function kt(t){return Tt(pr(),t)}function Wt(t){return Tt(kt(t),jf)}function Ja(){let t=[],e=new Set,r=o=>{Dr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:jn(),kind:"legacy"});let n=pr();if(!Dr(n))return t;let s;try{s=CT(n)}catch{return t}for(let o of s.sort())qe(o)&&r({workspace_name:o,db_path:Wt(o),kind:"workspace"});return t}function Xa(t){return Tt(kt(t),"projects")}function Bs(){return Tt(mr(),UT)}function qe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function qs(){let t=Bs();if(!Dr(t))return null;try{let e=MT(t,"utf8").trim();return e.length===0||!qe(e)?null:e}catch{return null}}function Nn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&qe(t)?t:qs()}function ue(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Nn();if(e!==null)return Wt(e);let r=jn();return Dr(r)||!Dr(pr())?r:Wt(Nf)}function qT(t,e=$f()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Af(t,e=process.stderr,r=$f()){qT(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
+ `)}function Ga(){return Tt(mr(),WT)}function Rf(){return Tt(mr(),BT)}function HT(){try{return Dr(Ga())}catch{return!1}}function Of(t=process.stderr){HT()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
+ `)}var PT,jf,FT,UT,Nf,WT,BT,hr,Ve=b(()=>{"use strict";PT=".lmctl",jf="state.db",FT="workspaces",UT="active-workspace",Nf="default",WT="profiles",BT="active-profile";hr={default:Nf}});function VT(t){for(let e of GT)if(t.startsWith(e))return!0;if(t.startsWith("172.")){let e=Number(t.split(".")[1]);if(Number.isFinite(e)&&e>=16&&e<=31)return!0}return!!t.startsWith("169.254.")}function KT(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function ZT(t){let e=t.split(".");if(e.length!==4)return!1;for(let r of e){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function An(t){let e=t;for(let{re:r,replacement:n}of XT)e=e.replace(r,n);return e=e.replace(YT,r=>!ZT(r)||VT(r)?r:Lf),e=e.replace(zT,r=>KT(r)?r:Lf),e}function Rn(t){return t.split(`
4
4
  `).map(e=>An(e)).join(`
5
- `)}function Lf(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:nt}:{key:t,value:An(e)}}function Bt(t){if(typeof t=="string")return An(t);if(Array.isArray(t))return t.map(e=>Bt(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?nt:Bt(n):e[r]=Bt(n)}return e}return t}function Cf(t,e){for(let{name:r,re:n}of QT){let s=e.match(n);if(s!==null&&!s[0].includes(nt))throw new _r(t,r)}}var nt,JT,Rf,Of,XT,GT,YT,zT,QT,_r,Hs=b(()=>{"use strict";nt="[REDACTED]",JT="[REDACTED_EMAIL]",Rf="[REDACTED_IP]",Of="[USER]",XT=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${nt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${nt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${nt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:nt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:nt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:nt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:nt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${nt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Of}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Of}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:JT}],GT=["127.","10.","192.168.","0.0.0.0"];YT=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,zT=/\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;QT=[{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"'`]+/}],_r=class extends Error{bundlePath;patternName;constructor(e,r){super(`sanitization failed: ${r} pattern matched in ${e}`),this.bundlePath=e,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as Ga}from"node:child_process";import{readFileSync as ek}from"node:fs";import{readFile as Ka,stat as Mf}from"node:fs/promises";import{homedir as tk}from"node:os";import{join as rk}from"node:path";import{fileURLToPath as nk}from"node:url";function st(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(ek(nk(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Df(t){let e=new Set(t.include??Js),r={};return e.has("serve")&&(r.serve=await ok(t)),e.has("db")&&(r.db=ik(t)),e.has("runs")&&(r.runs=ak(t)),e.has("jobs")&&(r.jobs=lk(t)),e.has("attentions")&&(r.attentions=ck(t)),e.has("env")&&(r.env=await uk(t)),e.has("intents")&&(r.intents=await fk(t)),r}async function ok(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await Ka(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,o="pidfile")}catch{}let i=null;if(s!==null)try{process.kill(s,0),i=!0}catch{i=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let d=(await Ka(r,"utf8")).split(`
5
+ `)}function Mf(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:nt}:{key:t,value:An(e)}}function Bt(t){if(typeof t=="string")return An(t);if(Array.isArray(t))return t.map(e=>Bt(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?nt:Bt(n):e[r]=Bt(n)}return e}return t}function Df(t,e){for(let{name:r,re:n}of QT){let s=e.match(n);if(s!==null&&!s[0].includes(nt))throw new _r(t,r)}}var nt,JT,Lf,Cf,XT,GT,YT,zT,QT,_r,Hs=b(()=>{"use strict";nt="[REDACTED]",JT="[REDACTED_EMAIL]",Lf="[REDACTED_IP]",Cf="[USER]",XT=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${nt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${nt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${nt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:nt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:nt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:nt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:nt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${nt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Cf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Cf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:JT}],GT=["127.","10.","192.168.","0.0.0.0"];YT=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,zT=/\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;QT=[{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"'`]+/}],_r=class extends Error{bundlePath;patternName;constructor(e,r){super(`sanitization failed: ${r} pattern matched in ${e}`),this.bundlePath=e,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as Va}from"node:child_process";import{readFileSync as ek}from"node:fs";import{readFile as Ya,stat as Pf}from"node:fs/promises";import{homedir as tk}from"node:os";import{join as rk}from"node:path";import{fileURLToPath as nk}from"node:url";function st(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(ek(nk(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Ff(t){let e=new Set(t.include??Js),r={};return e.has("serve")&&(r.serve=await ok(t)),e.has("db")&&(r.db=ik(t)),e.has("runs")&&(r.runs=ak(t)),e.has("jobs")&&(r.jobs=lk(t)),e.has("attentions")&&(r.attentions=ck(t)),e.has("env")&&(r.env=await uk(t)),e.has("intents")&&(r.intents=await fk(t)),r}async function ok(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await Ya(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,o="pidfile")}catch{}let i=null;if(s!==null)try{process.kill(s,0),i=!0}catch{i=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let d=(await Ya(r,"utf8")).split(`
6
6
  `),f=d.slice(Math.max(0,d.length-n));c=f.length,a=Rn(f.join(`
7
7
  `))}catch(u){l=`serve log unreadable: ${u instanceof Error?u.message:String(u)}`}return{pid:s,pid_source:o,pid_alive:i,log_tail_lines:c,log_tail:a,log_note:l}}function ik(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(i=>i.integrity_check??JSON.stringify(i)).join(`
8
- `)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function ak(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),o=e.query(`SELECT ${Va} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${Va} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${Va} FROM run
8
+ `)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function ak(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),o=e.query(`SELECT ${Ka} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${Ka} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.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:Bt(o),stale:Bt(a),paused:Bt(i)}}function lk(t){let{dal:e}=t,r=e.query("SELECT status, COUNT(*) AS c FROM job GROUP BY status"),n={pending:0,running:0,done:0,failed:0,paused:0};for(let{status:i,c:a}of r)i==="queued"?n.pending+=a:i==="running"?n.running+=a:i==="done"||i==="succeeded"?n.done+=a:i==="failed"?n.failed+=a:i==="paused"&&(n.paused+=a);let s=e.query("SELECT id FROM job WHERE status IN ('queued', 'available') ORDER BY id DESC LIMIT 100"),o=e.query("SELECT id FROM job WHERE status = 'running' ORDER BY id DESC LIMIT 100");return{queue_state:n,pending_ids:s.map(i=>i.id),running_ids:o.map(i=>i.id)}}function ck(t){let{dal:e}=t,r=e.query(`SELECT id, kind, severity, project_id, run_id, external_object_id, requires_user, created_at
12
- FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:Bt(r)}}async function uk(t){let e=st(),r=process.version,n=Ga("uname",["-a"],{encoding:"utf8"}),s=Rn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Mf(i);let u=Ga("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Mf(a);let u=Ga("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Rn(o.join(`
13
- `)),c=[];for(let u of sk){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Lf(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function dk(){return process.env.LMCTL_INTENT_LOG??rk(tk(),".lmctl","recent-intents.log")}async function fk(t){let e=t.intentLog??dk(),r=t.intentLogTailLines??500;try{let s=(await Ka(e,"utf8")).split(`
12
+ FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:Bt(r)}}async function uk(t){let e=st(),r=process.version,n=Va("uname",["-a"],{encoding:"utf8"}),s=Rn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Pf(i);let u=Va("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Pf(a);let u=Va("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Rn(o.join(`
13
+ `)),c=[];for(let u of sk){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Mf(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function dk(){return process.env.LMCTL_INTENT_LOG??rk(tk(),".lmctl","recent-intents.log")}async function fk(t){let e=t.intentLog??dk(),r=t.intentLogTailLines??500;try{let s=(await Ya(e,"utf8")).split(`
14
14
  `).filter(i=>i.length>0),o=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:o.length,tail:Rn(o.join(`
15
- `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Js,sk,Va,On=b(()=>{"use strict";Hs();Js=["serve","db","runs","jobs","attentions","env","intents"];sk=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];Va=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as Uf,appendFileSync as mk,mkdirSync as pk,existsSync as VB,readdirSync as KB,unlinkSync as YB}from"node:fs";import{join as Gs,dirname as hk}from"node:path";import{homedir as _k}from"node:os";function za(){return Gs(_k(),".lmctl")}function Wf(){Ya=!0,process.env.LMCTL_DEBUG="1"}function Se(){if(Ya)return!0;let t=Date.now();return t-Ff>=gk&&(Pf=Ek(),Ff=t),Pf}function wk(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function vt(t,e){if(e?.verbose){if(!Ya)return}else if(!e?.always&&!Se())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,...t};mk(Xs,JSON.stringify(r)+`
16
- `)}catch{}}function yk(){if(!Xs){let e=wk().slice(0,13).replace("T","-");Xs=Gs(za(),`debug-${e}.log`)}pk(hk(Xs),{recursive:!0})}function Vs(...t){vt({event:"legacy",msg:t.join(" ")})}function mt(...t){vt({event:"legacy",msg:t.join(" ")},{verbose:!0})}function Y(t){vt(t,{always:!0})}function Ek(){return bk()||Sk()}function bk(){try{let t=Uf(Gs(za(),"config.toml"),"utf-8");for(let e of t.split(`
17
- `)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Sk(){try{let t=Uf(Gs(za(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Ya,Pf,Ff,gk,Xs,je=b(()=>{"use strict";Ya=!1,Pf=!1,Ff=0,gk=5e3;Xs=null});function pt(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function qt(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Ln(t,e){return!qt(t)||pt(t)?null:`${e} must use https://: ${t}`}async function gr(t,e){let r=Ln(t,e.description);if(r!==null||!pt(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Bf(t,e.description,n,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw Bf(t,e.description,n,a)}}finally{clearTimeout(o)}}function Bf(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var Ks=b(()=>{"use strict"});import{existsSync as Fk}from"node:fs";import{createRequire as Uk}from"node:module";function Wk(){return Qa===null&&(Qa=Uk(import.meta.url)("node:sqlite").DatabaseSync),Qa}function el(t){return t.length===1&&Bk(t[0])?[t[0]]:t}function Bk(t){if(!nl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function nl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Qa,tl,Ys,rl,sl=b(()=>{"use strict";Qa=null;tl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!Fk(e))throw new Error("unable to open database file");this.name=e,this.handle=new(Wk())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new rl(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=e(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let r=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},Ys=tl,rl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...el(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...el(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...el(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&nl(e)?Object.values(e):nl(e)?{...e}:e}}});import{existsSync as qk,mkdirSync as Hk,readFileSync as Jk}from"node:fs";import{homedir as Xk}from"node:os";import{dirname as Hf,join as Gk,resolve as Jf}from"node:path";import{fileURLToPath as Vk,pathToFileURL as Kk}from"node:url";function il(t){t.dbPath!==":memory:"&&Hk(Hf(t.dbPath),{recursive:!0});let e=new Ys(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Gf(e);return r===0&&(e.exec(Jk(Yk,"utf8")),e.pragma(`user_version = ${ol}`)),Zk(e,r),e}function Zk(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
15
+ `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Js,sk,Ka,On=b(()=>{"use strict";Hs();Js=["serve","db","runs","jobs","attentions","env","intents"];sk=["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 Bf,appendFileSync as mk,mkdirSync as pk,existsSync as VB,readdirSync as KB,unlinkSync as YB}from"node:fs";import{join as Gs,dirname as hk}from"node:path";import{homedir as _k}from"node:os";function Za(){return Gs(_k(),".lmctl")}function qf(){za=!0,process.env.LMCTL_DEBUG="1"}function Se(){if(za)return!0;let t=Date.now();return t-Wf>=gk&&(Uf=Ek(),Wf=t),Uf}function wk(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function vt(t,e){if(e?.verbose){if(!za)return}else if(!e?.always&&!Se())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,...t};mk(Xs,JSON.stringify(r)+`
16
+ `)}catch{}}function yk(){if(!Xs){let e=wk().slice(0,13).replace("T","-");Xs=Gs(Za(),`debug-${e}.log`)}pk(hk(Xs),{recursive:!0})}function Vs(...t){vt({event:"legacy",msg:t.join(" ")})}function mt(...t){vt({event:"legacy",msg:t.join(" ")},{verbose:!0})}function Z(t){vt(t,{always:!0})}function Ek(){return bk()||Sk()}function bk(){try{let t=Bf(Gs(Za(),"config.toml"),"utf-8");for(let e of t.split(`
17
+ `)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Sk(){try{let t=Bf(Gs(Za(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var za,Uf,Wf,gk,Xs,je=b(()=>{"use strict";za=!1,Uf=!1,Wf=0,gk=5e3;Xs=null});function pt(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function qt(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Ln(t,e){return!qt(t)||pt(t)?null:`${e} must use https://: ${t}`}async function gr(t,e){let r=Ln(t,e.description);if(r!==null||!pt(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Hf(t,e.description,n,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw Hf(t,e.description,n,a)}}finally{clearTimeout(o)}}function Hf(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var Ks=b(()=>{"use strict"});import{existsSync as Fk}from"node:fs";import{createRequire as Uk}from"node:module";function Wk(){return el===null&&(el=Uk(import.meta.url)("node:sqlite").DatabaseSync),el}function tl(t){return t.length===1&&Bk(t[0])?[t[0]]:t}function Bk(t){if(!sl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function sl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var el,rl,Ys,nl,ol=b(()=>{"use strict";el=null;rl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!Fk(e))throw new Error("unable to open database file");this.name=e,this.handle=new(Wk())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new nl(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=e(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let r=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},Ys=rl,nl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...tl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...tl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...tl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&sl(e)?Object.values(e):sl(e)?{...e}:e}}});import{existsSync as qk,mkdirSync as Hk,readFileSync as Jk}from"node:fs";import{homedir as Xk}from"node:os";import{dirname as Xf,join as Gk,resolve as Gf}from"node:path";import{fileURLToPath as Vk,pathToFileURL as Kk}from"node:url";function al(t){t.dbPath!==":memory:"&&Hk(Xf(t.dbPath),{recursive:!0});let e=new Ys(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Kf(e);return r===0&&(e.exec(Jk(Yk,"utf8")),e.pragma(`user_version = ${il}`)),Zk(e,r),e}function Zk(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
18
18
  CREATE TABLE IF NOT EXISTS session_size (
19
19
  id INTEGER PRIMARY KEY AUTOINCREMENT,
20
20
  team_name TEXT NOT NULL,
@@ -454,9 +454,9 @@ var LT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
454
454
  ORDER BY id ASC;
455
455
  DROP TABLE team_connection;
456
456
  ALTER TABLE team_connection_v37 RENAME TO team_connection;
457
- `),t.pragma("user_version = 37"),r=37),r<38&&r!==0&&(Ne(t,"agent_inflight").has("active_count")||t.exec("ALTER TABLE agent_inflight ADD COLUMN active_count INTEGER NOT NULL DEFAULT 1;"),t.exec("DROP TABLE IF EXISTS team_connection;"),t.pragma("user_version = 38"),r=38),qk(zk)}function Ne(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function Qk(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Gf(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function ev(){return process.env.LMCTL_DB??Gk(Xk(),".lmctl","state.db")}var Xf,Yk,zk,ol,al=b(()=>{"use strict";sl();Xf=Hf(Vk(import.meta.url)),Yk=Jf(Xf,"schema.sql"),zk=Jf(Xf,"migrations"),ol=38;if(process.argv[1]&&import.meta.url===Kk(process.argv[1]).href){let t=il({dbPath:process.argv[2]??ev()});try{process.stdout.write(`migrated user_version=${Gf(t)}
458
- `)}finally{t.close()}}});function Pr(t){return typeof t=="string"&&tv.has(t)}function Yf(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${zs[0]}`,` STANCE: ${zs[1]}`,` STANCE: ${zs[2]}`,` STANCE: ${Vf}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
459
- `)}var Vf,zs,tv,Cn,Kf,ll,Zs,Mn=b(()=>{"use strict";Vf="other",zs=["not_enough_information","dont_know","other_work"],tv=new Set([Vf,...zs]),Cn="@abort",Kf="invalid_decision",ll="escalation_aborted",Zs="workflow_escalation"});import{randomUUID as rv}from"node:crypto";function ve(t){return t.provider_resolved??t.provider}function D(){return new Date().toISOString()}function pe(t){return new cl(il({dbPath:t.path}))}function zf(t,e,r){let n=Zf(e);if(n.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Zf(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let u of i(l))a(u)}finally{o.pop()}s.add(l)}};a(t)}function Zf(t){let e=nv(t),r=e===null?null:sv(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))ul(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function nv(t){try{let e=JSON.parse(t);return ul(e)?e:null}catch{return null}}function sv(t,e){let r=t[e];return ul(r)?r:null}function ul(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ov(t){return{insertWorkflow:t.prepare(`
457
+ `),t.pragma("user_version = 37"),r=37),r<38&&r!==0&&(Ne(t,"agent_inflight").has("active_count")||t.exec("ALTER TABLE agent_inflight ADD COLUMN active_count INTEGER NOT NULL DEFAULT 1;"),t.exec("DROP TABLE IF EXISTS team_connection;"),t.pragma("user_version = 38"),r=38),qk(zk)}function Ne(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function Qk(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Kf(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function ev(){return process.env.LMCTL_DB??Gk(Xk(),".lmctl","state.db")}var Vf,Yk,zk,il,ll=b(()=>{"use strict";ol();Vf=Xf(Vk(import.meta.url)),Yk=Gf(Vf,"schema.sql"),zk=Gf(Vf,"migrations"),il=38;if(process.argv[1]&&import.meta.url===Kk(process.argv[1]).href){let t=al({dbPath:process.argv[2]??ev()});try{process.stdout.write(`migrated user_version=${Kf(t)}
458
+ `)}finally{t.close()}}});function Pr(t){return typeof t=="string"&&tv.has(t)}function Zf(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${zs[0]}`,` STANCE: ${zs[1]}`,` STANCE: ${zs[2]}`,` STANCE: ${Yf}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
459
+ `)}var Yf,zs,tv,Cn,zf,cl,Zs,Mn=b(()=>{"use strict";Yf="other",zs=["not_enough_information","dont_know","other_work"],tv=new Set([Yf,...zs]),Cn="@abort",zf="invalid_decision",cl="escalation_aborted",Zs="workflow_escalation"});import{randomUUID as rv}from"node:crypto";function ve(t){return t.provider_resolved??t.provider}function M(){return new Date().toISOString()}function pe(t){return new ul(al({dbPath:t.path}))}function Qf(t,e,r){let n=em(e);if(n.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return em(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let u of i(l))a(u)}finally{o.pop()}s.add(l)}};a(t)}function em(t){let e=nv(t),r=e===null?null:sv(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))dl(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function nv(t){try{let e=JSON.parse(t);return dl(e)?e:null}catch{return null}}function sv(t,e){let r=t[e];return dl(r)?r:null}function dl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ov(t){return{insertWorkflow:t.prepare(`
460
460
  INSERT INTO workflow (name, version, definition_schema_version, definition, created_at)
461
461
  VALUES (?, ?, ?, ?, ?)
462
462
  `),setWorkflowSource:t.prepare("UPDATE workflow SET source_uri = ?, source_sha256 = ? WHERE id = ?"),getWorkflow:t.prepare("SELECT * FROM workflow WHERE id = ?"),findWorkflowVersion:t.prepare("SELECT * FROM workflow WHERE name = ? AND version = ?"),findWorkflowLatest:t.prepare("SELECT * FROM workflow WHERE name = ? ORDER BY version DESC LIMIT 1"),updateWorkflowActiveVersion:t.prepare("UPDATE workflow SET active_version_id = ? WHERE id = ?"),updateWorkflowActiveVersionAndDefinition:t.prepare(`
@@ -909,10 +909,10 @@ var LT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
909
909
  AND sender_teamfile = ?
910
910
  AND sender_alias = ?
911
911
  AND active_count > 1
912
- `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function iv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var cl,Pe=b(()=>{"use strict";al();Mn();cl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=ov(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,o,i)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=o)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>iv("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==Zs)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Cn&&!a.includes(n))return{resumed:!1,reason:Kf};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.stmts.acquireAgentInflight.get({...r,stale_before:n.stale_before??null,force:n.force===!0?1:0}),o=s!==void 0?{acquired:!0,current:s}:{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}}}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){zf(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,D()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,D());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){zf(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,D());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,D())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,D());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,D()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,D(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(D(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,D());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,D());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,D(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,D());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",D());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,D());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=D(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,D(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,D(),e)??null}closeIssue(e,r,n){let s=D(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,D(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,D(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=D();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=rv(),s=D();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=D(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,D())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??D(),e.dedupe_key??null,e.concurrency_key??null,D());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:D();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,D()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,D()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??D(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,D());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=D(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,D(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(D(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,D(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,D())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,D());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,D(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??D(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,D());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,D()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,D()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,D());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(D(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=D();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??D());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,D())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,D())}}});import{realpathSync as av}from"node:fs";import{resolve as lv}from"node:path";function dl(t){let e=lv(t);try{return av(e)}catch{return e}}var Qf=b(()=>{"use strict"});import{platform as em}from"node:os";function ht(t){let e=new Dn;for(let r of t)e.registerAdapter(r);return e}var Dn,fl=b(()=>{"use strict";Qf();Dn=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=dl(e.workspace);o=o.filter(a=>dl(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=em()==="darwin"||em()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as tm}from"node:fs";import{createInterface as rm}from"node:readline";import{stat as cv}from"node:fs/promises";import{homedir as uv}from"node:os";async function*Fe(t){let e=tm(t,{encoding:"utf-8"}),r=rm({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Le(t,e){let r=[],n=tm(t,{encoding:"utf-8"}),s=rm({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Ie(t){let e=await cv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function ue(t){return t.replace(/\\n/g,`
913
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Te,Ht=b(()=>{"use strict";Te=uv()});import{readdir as Qs,stat as nm,unlink as dv}from"node:fs/promises";import{join as Fr,basename as sm}from"node:path";function fv(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function mv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return ue(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function om(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Fe(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var eo,im=b(()=>{"use strict";Ht();eo=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Fr(Te,".claude"),this.projectsDir=Fr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Qs(this.projectsDir)}catch{return e}for(let n of r){let s=Fr(this.projectsDir,n);if(!(await nm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Qs(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=sm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Fr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Le(e,50),s=await Ie(e),o="",i,a,l,c,u,d;for(let m of n)if(!fv(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=G(p.trim(),80)),u=G(p.trim(),80)}}if(!o)return null;let f=await om(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Ie(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Fe(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:mv(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=G(_.trim(),80)),d=G(_.trim(),80),s.push({role:"user",timestamp:g,content:ue(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let E=typeof T.content=="string"?ue(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:T.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:ue(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await om(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await dv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Qs(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Fr(this.projectsDir,i);if(!(await nm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Qs(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=sm(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Fr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Le(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function to(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function hv(t,e,r){if(!r)return"";let n=t.tools[e]??ml[e],s=n?.profiles?.[r]?.flags??ml[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function am(t,e){return!!t.tools[e]}function lm(t,e,r,n,s){let o=t.tools[e]??ml[e],i;if(o?.agent){let l=to(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=pv[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(to).join(" ");i=`printf '%s\\n' ${to(n)} | ${u}`}else i=c.map(to).join(" ")}let a=hv(t,e,s);return a&&(i+=" "+a),i}var ml,pv,cm=b(()=>{"use strict";ml={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:""}}}},pv={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 um(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var dm=b(()=>{"use strict"});var _v,xe,ro,It=b(()=>{"use strict";_v="ACK: waiting for explicit lmctl task.",xe=`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: ${_v}`,ro=`send this exact lmctl seed instruction: "${xe}"`});function Ke(t,e){return e===void 0||e.length===0?t:{...t??process.env,[pl]:e}}var pl,Jt=b(()=>{"use strict";pl="LMCTL_SELF_SESSIONID"});import{spawn as fm}from"node:child_process";import{mkdirSync as gv}from"node:fs";var hl,Oe,Xt=b(()=>{"use strict";cm();dm();It();Jt();hl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Oe=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===xe?r:n)}seed(e,r){return gv(e,{recursive:!0}),new Promise(n=>{let s;try{s=fm(this.binary,this.seedArgsFor(r),{cwd:e,stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
914
- `:this.seedStdin;i&&s.stdin?.write(i),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:o.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:ro,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&am(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,o,i,a="",l,c=()=>{e<=0||(clearTimeout(o),o=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(o)};n.signal&&(n.signal.aborted?(i="external",s.abort()):n.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),c();let d={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),i==="external"?new hl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=lm(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=um(r.env),c=fm(s,{shell:!0,cwd:r.cwd,env:Ke(r.env,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function so(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new $t(t,r,e)}var Ye,ye,xt,no,$t,Ur=b(()=>{"use strict";Ye=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends Ye{},xt=class extends Ye{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},no=class extends Ye{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},$t=class extends Ye{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as gl from"node:child_process";function yv(t){if(typeof gl.spawnSync=="function")try{gl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function mm(t){return t.exitCode!==null||t.signalCode!==null}function _l(t,e){return mm(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(o),r(!0))},o=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function ot(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,o=e.killDelayMs??5e3,i=e.platform??process.platform,a=e.runTaskkill??yv;if(mm(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await _l(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await _l(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await _l(t,wv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var wv,oo=b(()=>{"use strict";wv=1e3});function pm(t){Se()&&process.stderr.write(`[debug] ${t}
915
- `)}function Wr(t,e){let r=bv[t];if(r)return r[e]??r.yolo}function Tv(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function Gt(t,e,r="yolo"){if(Sv.has(t)){pm(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?Wr(t,"plan"):Ev[t];if(!n){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw Y({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ye(s)}if(!Tv(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw Y({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new ye(o)}pm(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var Ev,bv,Sv,Pn=b(()=>{"use strict";Ur();je();Ev={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},bv={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"]}};Sv=new Set(["codex","opencode"])});import{spawn as kv}from"node:child_process";import{existsSync as vv}from"node:fs";function xv(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
912
+ `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function iv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var ul,Pe=b(()=>{"use strict";ll();Mn();ul=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=ov(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,o,i)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=o)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>iv("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==Zs)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Cn&&!a.includes(n))return{resumed:!1,reason:zf};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.stmts.acquireAgentInflight.get({...r,stale_before:n.stale_before??null,force:n.force===!0?1:0}),o=s!==void 0?{acquired:!0,current:s}:{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}}}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){Qf(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,M()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,M());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){Qf(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,M());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,M())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,M());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,M()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,M(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(M(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,M());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,M());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,M(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,M());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",M());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,M());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=M(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,M(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,M(),e)??null}closeIssue(e,r,n){let s=M(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,M(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,M(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=M();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,M(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,M(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=rv(),s=M();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=M(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,M())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??M(),e.dedupe_key??null,e.concurrency_key??null,M());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:M();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,M()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,M()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??M(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,M());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=M(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,M(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(M(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,M(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,M())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,M());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,M(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??M(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,M());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,M()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,M()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,M());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(M(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=M();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??M());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,M())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,M())}}});import{realpathSync as av}from"node:fs";import{resolve as lv}from"node:path";function fl(t){let e=lv(t);try{return av(e)}catch{return e}}var tm=b(()=>{"use strict"});import{platform as rm}from"node:os";function ht(t){let e=new Dn;for(let r of t)e.registerAdapter(r);return e}var Dn,ml=b(()=>{"use strict";tm();Dn=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=fl(e.workspace);o=o.filter(a=>fl(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=rm()==="darwin"||rm()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as nm}from"node:fs";import{createInterface as sm}from"node:readline";import{stat as cv}from"node:fs/promises";import{homedir as uv}from"node:os";async function*Fe(t){let e=nm(t,{encoding:"utf-8"}),r=sm({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Le(t,e){let r=[],n=nm(t,{encoding:"utf-8"}),s=sm({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Ie(t){let e=await cv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
913
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function V(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Te,Ht=b(()=>{"use strict";Te=uv()});import{readdir as Qs,stat as om,unlink as dv}from"node:fs/promises";import{join as Fr,basename as im}from"node:path";function fv(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function mv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function am(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Fe(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var eo,lm=b(()=>{"use strict";Ht();eo=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Fr(Te,".claude"),this.projectsDir=Fr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Qs(this.projectsDir)}catch{return e}for(let n of r){let s=Fr(this.projectsDir,n);if(!(await om(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Qs(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=im(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Fr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Le(e,50),s=await Ie(e),o="",i,a,l,c,u,d;for(let m of n)if(!fv(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=V(p.trim(),80)),u=V(p.trim(),80)}}if(!o)return null;let f=await am(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Ie(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Fe(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:mv(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=V(_.trim(),80)),d=V(_.trim(),80),s.push({role:"user",timestamp:g,content:de(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let E=typeof T.content=="string"?de(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:T.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:de(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await am(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await dv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Qs(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Fr(this.projectsDir,i);if(!(await om(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Qs(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=im(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Fr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Le(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function to(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function hv(t,e,r){if(!r)return"";let n=t.tools[e]??pl[e],s=n?.profiles?.[r]?.flags??pl[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function cm(t,e){return!!t.tools[e]}function um(t,e,r,n,s){let o=t.tools[e]??pl[e],i;if(o?.agent){let l=to(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=pv[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(to).join(" ");i=`printf '%s\\n' ${to(n)} | ${u}`}else i=c.map(to).join(" ")}let a=hv(t,e,s);return a&&(i+=" "+a),i}var pl,pv,dm=b(()=>{"use strict";pl={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}}},pv={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 fm(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var mm=b(()=>{"use strict"});var _v,xe,ro,It=b(()=>{"use strict";_v="ACK: waiting for explicit lmctl task.",xe=`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: ${_v}`,ro=`send this exact lmctl seed instruction: "${xe}"`});function Ke(t,e){return e===void 0||e.length===0?t:{...t??process.env,[hl]:e}}var hl,Jt=b(()=>{"use strict";hl="LMCTL_SELF_SESSIONID"});import{spawn as pm}from"node:child_process";import{mkdirSync as gv}from"node:fs";var _l,Oe,Xt=b(()=>{"use strict";dm();mm();It();Jt();_l=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Oe=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===xe?r:n)}seed(e,r){return gv(e,{recursive:!0}),new Promise(n=>{let s;try{s=pm(this.binary,this.seedArgsFor(r),{cwd:e,stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
914
+ `:this.seedStdin;i&&s.stdin?.write(i),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:o.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:ro,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&cm(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,o,i,a="",l,c=()=>{e<=0||(clearTimeout(o),o=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(o)};n.signal&&(n.signal.aborted?(i="external",s.abort()):n.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),c();let d={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),i==="external"?new _l("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=um(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=fm(r.env),c=pm(s,{shell:!0,cwd:r.cwd,env:Ke(r.env,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function so(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new $t(t,r,e)}var Ye,ye,xt,no,$t,Ur=b(()=>{"use strict";Ye=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends Ye{},xt=class extends Ye{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},no=class extends Ye{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},$t=class extends Ye{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as wl from"node:child_process";function yv(t){if(typeof wl.spawnSync=="function")try{wl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function hm(t){return t.exitCode!==null||t.signalCode!==null}function gl(t,e){return hm(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(o),r(!0))},o=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function ot(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,o=e.killDelayMs??5e3,i=e.platform??process.platform,a=e.runTaskkill??yv;if(hm(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await gl(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await gl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await gl(t,wv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var wv,oo=b(()=>{"use strict";wv=1e3});function _m(t){Se()&&process.stderr.write(`[debug] ${t}
915
+ `)}function Wr(t,e){let r=bv[t];if(r)return r[e]??r.yolo}function Tv(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function Gt(t,e,r="yolo"){if(Sv.has(t)){_m(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?Wr(t,"plan"):Ev[t];if(!n){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw Z({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ye(s)}if(!Tv(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw Z({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new ye(o)}_m(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var Ev,bv,Sv,Pn=b(()=>{"use strict";Ur();je();Ev={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},bv={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"]}};Sv=new Set(["codex","opencode"])});import{spawn as kv}from"node:child_process";import{existsSync as vv}from"node:fs";function xv(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
916
916
 
917
917
  --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
918
918
 
@@ -920,49 +920,49 @@ var LT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
920
920
  One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return e?`Original provider error:
921
921
  ${e}
922
922
 
923
- ${r}`:r}function hm(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||Iv[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=Wr(s,a)??Av[s]??["--dangerously-skip-permissions"];i.push(...l);try{Gt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!vv(e.cwd))return Y({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=kv(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Y({event:"transport_abort",provider:s,phase:"pre_spawn"}),ot(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Y({event:"transport_abort",provider:s}),ot(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=$v({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=d.sawResult();d.processLine(g),!_&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
924
- `);f=_.pop()||"";for(let T of _)m(T)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{Y({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new ye(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(mt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(Y({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(Nv({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
925
- `),mt(`stream-json: prompt sent (${t.length} chars)`)})}var Iv,Av,_m=b(()=>{"use strict";Ur();oo();Pn();je();Jt();Iv={claude:"claude",qwen:"qwen"};Av={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as Rv,constants as Ov}from"node:fs";import{delimiter as Lv,join as Cv}from"node:path";function Mv(t,e=process.env){let r=e.PATH??"";for(let n of r.split(Lv))if(n)try{return Rv(Cv(n,t),Ov.X_OK),!0}catch{}return!1}function Dv(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Br(t,e,r={}){if(Mv(t,r.env))return;(r.warn??console.warn)(Dv(t,e))}var io=b(()=>{"use strict"});function gm(t={}){return Br("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${Fv}`]}var Pv,Fv,wm=b(()=>{"use strict";io();Pv=864e5,Fv=Pv/1e3});import{spawn as Uv}from"node:child_process";import{createInterface as Wv}from"node:readline";import{existsSync as Bv,readFileSync as qv}from"node:fs";import{fileURLToPath as Hv}from"node:url";function Jv(t){return t==="plan"?"read-only":"danger-full-access"}function Gv(){return{clientInfo:{name:"lmctl",title:"lmctl",version:Xv},capabilities:{experimentalApi:!1}}}function Vt(t,e){mt(`[codex:${t}] ${JSON.stringify(e)}`)}function Vv(){return{agentItems:new Map,resultText:""}}function ym(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function Kv(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function Yv(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function zv(){return{pendingCodexError:null}}function Zv(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
923
+ ${r}`:r}function gm(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||Iv[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=Wr(s,a)??Av[s]??["--dangerously-skip-permissions"];i.push(...l);try{Gt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!vv(e.cwd))return Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=kv(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:s,phase:"pre_spawn"}),ot(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:s}),ot(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=$v({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=d.sawResult();d.processLine(g),!_&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
924
+ `);f=_.pop()||"";for(let T of _)m(T)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new ye(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(mt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(Z({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(Nv({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
925
+ `),mt(`stream-json: prompt sent (${t.length} chars)`)})}var Iv,Av,wm=b(()=>{"use strict";Ur();oo();Pn();je();Jt();Iv={claude:"claude",qwen:"qwen"};Av={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as Rv,constants as Ov}from"node:fs";import{delimiter as Lv,join as Cv}from"node:path";function Mv(t,e=process.env){let r=e.PATH??"";for(let n of r.split(Lv))if(n)try{return Rv(Cv(n,t),Ov.X_OK),!0}catch{}return!1}function Dv(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Br(t,e,r={}){if(Mv(t,r.env))return;(r.warn??console.warn)(Dv(t,e))}var io=b(()=>{"use strict"});function ao(t={}){return Br("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${Fv}`]}var Pv,Fv,yl=b(()=>{"use strict";io();Pv=864e5,Fv=Pv/1e3});import{spawn as Uv}from"node:child_process";import{createInterface as Wv}from"node:readline";import{existsSync as Bv,readFileSync as qv}from"node:fs";import{fileURLToPath as Hv}from"node:url";function Jv(t){return t==="plan"?"read-only":"danger-full-access"}function Gv(){return{clientInfo:{name:"lmctl",title:"lmctl",version:Xv},capabilities:{experimentalApi:!1}}}function Vt(t,e){mt(`[codex:${t}] ${JSON.stringify(e)}`)}function Vv(){return{agentItems:new Map,resultText:""}}function ym(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function Kv(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function Yv(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function zv(){return{pendingCodexError:null}}function Zv(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
926
926
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
927
927
  ${e}
928
928
 
929
- ${r}`:r}function Qv(t,e){let r=Yv(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function e0(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function Em(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`),e.alias?.toLowerCase()==="lead"&&o.push(...gm());let i=e.permissionMode??"yolo",a=Jv(i);try{Gt("codex",o,i)}catch(R){return n(R)}if(e.cwd&&!Bv(e.cwd))return Y({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let l=Uv(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.threadId)}),c=!1;if(e.signal){if(e.signal.aborted)return c=!0,Y({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ot(l).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,Y({event:"transport_abort",provider:"codex"}),ot(l).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=Wv({input:l.stdout}),d=new Map,f=1,m=e.threadId||"",p="",h=!1,g=!1,_=Date.now(),T=Vv(),E=zv();function v(R,C={}){return new Promise((q,te)=>{let j=f++;d.set(j,{resolve:q,reject:te});let H=JSON.stringify({jsonrpc:"2.0",id:j,method:R,params:C});l.stdin?.write(H+`
930
- `)})}function x(R,C={}){let q=JSON.stringify({jsonrpc:"2.0",method:R,params:C});l.stdin?.write(q+`
931
- `)}u.on("line",R=>{let C;try{C=JSON.parse(R)}catch{return}if(typeof C.id=="number"&&d.has(C.id)){let j=d.get(C.id);if(d.delete(C.id),C.error){let H=C.error,me=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(C.error);j.reject(so(`codex app-server error: ${me}`,H))}else j.resolve(C);e.onEvent?.(C);return}let q=C.method;if(!q){e.onEvent?.(C);return}if(q==="thread/started"){let H=C.params?.thread;H?.id&&(m=H.id)}let te=Se()?j=>{Vt("item.text/buffer-mismatch",{itemId:j.itemId,threadId:j.threadId??null,turnId:j.turnId??null,expectedFromItemText:j.expectedFromItemText,gotFromBuffer:j.gotFromBuffer,expectedLen:j.expectedFromItemText.length,gotLen:j.gotFromBuffer.length})}:void 0;if(q==="turn/started"){let j=C.params,H=j?.turn;H?.id&&(p=H.id),ym(C,T,e.onDelta,te),Se()&&Vt("turn/started",{params:j??null})}if(Se()&&(q==="item/started"||q==="item/completed")){let j=C.params;j?.item?.type==="agentMessage"&&Vt(q,{params:j??null})}if(q==="item/started"||q==="item/agentMessage/delta"||q==="item/completed"){if(q==="item/agentMessage/delta"){let j=C.params;Se()&&Vt("agentMessage/delta",{params:j??null})}ym(C,T,e.onDelta,te)}if(q==="turn/completed"){let j=C.params;if(Se())for(let[me,I]of T.agentItems.entries())I.buffer&&Vt("turn/completed/unflushed-item",{itemId:me,phase:I.phase,bufferLen:I.buffer.length});Kv(T),Se()&&Vt("turn/completed",{params:j??null});let H=e0(C,E);H.shouldReject?(Se()&&Vt("turn/completed/terminal-reject",{message:H.turnError.message}),g=!0,h=!0,l.stdin?.end(),n(H.turnError)):(h=!0,l.stdin?.end())}if(q==="error"){let j=Qv(C,E);if(Se()){let H=C.params,me=H?.error,I=typeof me?.message=="string"?me.message:"(no message)";Vt(j.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:j.willRetry,params:H??null})}}e.onEvent?.(C)});let k="";l.stderr?.on("data",R=>{k+=R.toString()}),l.on("error",R=>{Y({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:R.message}),n(new ye(`Failed to spawn codex app-server: ${R.message}`,{cause:R}))}),l.on("exit",R=>{if(!c&&!g){if(h){r({result:T.resultText,threadId:m,turnId:p,durationMs:Date.now()-_,exitCode:R});return}if(E.pendingCodexError){n(E.pendingCodexError);return}Y({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:R,stderr_tail:k.slice(0,500)}),n(new Error(Zv({exitCode:R,stderr:k})))}}),(async()=>{try{if(await v("initialize",Gv()),x("initialized",{}),e.threadId)try{let R=v("thread/resume",{threadId:e.threadId,sandbox:a,approvalPolicy:"never",...e.model?{model:e.model}:{}}),C=new Promise((q,te)=>setTimeout(()=>te(new Error("resume timeout")),5e3));await Promise.race([R,C]),m=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
932
- `);let C=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(m=C.id)}else{let C=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(m=C.id)}await v("turn/start",{threadId:m,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(R){ot(l).catch(()=>{}),n(R instanceof Error?R:new Error(String(R)))}})()})}var Xv,bm=b(()=>{"use strict";je();je();Ur();oo();Pn();wm();je();Jt();Xv=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(qv(Hv(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Kt(t,e=["high","xhigh"]){return{name:t,reasoning:!0,provider:{npm:"@ai-sdk/github-copilot"},variants:Object.fromEntries(e.map(r=>[r,{reasoningEffort:r,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}}function wl(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:Sm},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Tm.map(t=>[t,{name:t}]))},openrouter:{npm:"@ai-sdk/openai-compatible",name:"OpenRouter",options:{baseURL:"https://openrouter.ai/api/v1",apiKey:"{env:OPENROUTER_API_KEY}"},models:Object.fromEntries(km.map(t=>[t,{name:t}]))}})}function vm(){return[...Object.keys(Sm).map(t=>`github-copilot/${t}`),...Tm.map(t=>`deepseek/${t}`),...km.map(t=>`openrouter/${t}`)].sort()}var Sm,Tm,km,yl=b(()=>{"use strict";Sm={"gpt-4.1":{name:"GPT-4.1"},"gpt-4.1-2025-04-14":{name:"GPT-4.1 (2025-04-14)"},"gpt-4o-mini":{name:"GPT-4o mini"},"gpt-4o-mini-2024-07-18":{name:"GPT-4o mini (2024-07-18)"},"gpt-5-mini":Kt("GPT-5 mini",["high"]),"gpt-5.2":Kt("GPT-5.2"),"gpt-5.2-codex":Kt("GPT-5.2 Codex"),"gpt-5.3-codex":Kt("GPT-5.3 Codex"),"gpt-5.4":Kt("GPT-5.4"),"gpt-5.4-mini":Kt("GPT-5.4 mini"),"gpt-5.4-nano":Kt("GPT-5.4 nano"),"gpt-5.5":Kt("GPT-5.5")},Tm=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],km=["qwen/qwen3-coder","qwen/qwen3-coder-plus","qwen/qwen3-coder-flash","qwen/qwen3.5-9b","qwen/qwen3.5-397b-a17b","qwen/qwen3.5-plus-20260420","qwen/qwen3.6-flash","qwen/qwen3.6-plus","qwen/qwen3.6-max-preview","qwen/qwen3.7-plus"]});import{existsSync as jm,mkdirSync as t0,readFileSync as Nm,writeFileSync as Im}from"node:fs";import{join as Fn,resolve as r0}from"node:path";function $m(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:n0}}function s0(t,e){return JSON.stringify(t)===JSON.stringify(e)}function ao(t){return structuredClone(t)}function Am(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function El(t,e,r={existsSync:jm,readFileSync:Nm}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=r0(e,s.sessiondir??e);for(let i of o0(o)){let a=i0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Am(a.permission)||n.push(`[${s.alias}] ${i} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function o0(t){return[Fn(t,".opencode","opencode.jsonc"),Fn(t,"opencode.jsonc"),Fn(t,"opencode.json")]}function i0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(a0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function a0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
933
- `;)o+=1;o<t.length&&(e+=t[o]);continue}if(i==="/"&&a==="*"){for(o+=2;o<t.length&&!(t[o]==="*"&&t[o+1]==="/");)o+=1;o+=1;continue}e+=i}return e.replace(/,\s*([}\]])/g,"$1")}function lo(t,e={}){let r=Fn(t,".opencode"),n=Fn(r,"opencode.json");if(Br("lmctl","lmctl_chat",e),!jm(n)){t0(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:wl(),mcp:{lmctl:$m()}},null,2);return Im(n,l+`
934
- `,"utf-8"),!0}let s;try{s=JSON.parse(Nm(n,"utf-8"))}catch{return console.log(xm.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(xm.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;s.permission===void 0&&(s.permission="allow",o=!0),Am(s.permission)||Y({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),l0(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=$m();return s0(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&Im(n,JSON.stringify(s,null,2)+`
935
- `,"utf-8"),o}function l0(t){let e=wl(),r=jt(t.provider)?t.provider:{},n=!jt(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=ao(o),n=!0;continue}if(!jt(i))continue;let a={...i};a.npm===void 0&&(a.npm=o.npm,n=!0),a.name===void 0&&(a.name=o.name,n=!0);let l=jt(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=ao(d),n=!0);a.options=l;let c=jt(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models)){if(c[u]===void 0){c[u]=ao(d),n=!0;continue}let f=c[u];if(jt(f)&&jt(d)){let m={...f};Rm(m,d)&&(c[u]=m,n=!0)}}a.models=c,r[s]=a}return n&&(t.provider=r),n}function jt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Rm(t,e){let r=!1;for(let[n,s]of Object.entries(e)){if(t[n]===void 0){t[n]=ao(s),r=!0;continue}jt(t[n])&&jt(s)&&Rm(t[n],s)&&(r=!0)}return r}var xm,n0,co=b(()=>{"use strict";je();yl();io();xm={yellow:t=>t},n0=864e5});import{spawn as c0}from"node:child_process";import{existsSync as u0}from"node:fs";import{createInterface as d0}from"node:readline";function f0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
929
+ ${r}`:r}function Qv(t,e){let r=Yv(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function e0(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function Em(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`),(e.isLead??e.alias?.toLowerCase()==="lead")&&o.push(...ao());let a=e.permissionMode??"yolo",l=Jv(a);try{Gt("codex",o,a)}catch(q){return n(q)}if(e.cwd&&!Bv(e.cwd))return Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Uv(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ot(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:"codex"}),ot(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Wv({input:c.stdout}),f=new Map,m=1,p=e.threadId||"",h="",g=!1,_=!1,T=Date.now(),E=Vv(),v=zv();function I(q,O={}){return new Promise((G,A)=>{let F=m++;f.set(F,{resolve:G,reject:A});let z=JSON.stringify({jsonrpc:"2.0",id:F,method:q,params:O});c.stdin?.write(z+`
930
+ `)})}function k(q,O={}){let G=JSON.stringify({jsonrpc:"2.0",method:q,params:O});c.stdin?.write(G+`
931
+ `)}d.on("line",q=>{let O;try{O=JSON.parse(q)}catch{return}if(typeof O.id=="number"&&f.has(O.id)){let F=f.get(O.id);if(f.delete(O.id),O.error){let z=O.error,x=typeof z?.message=="string"&&z.message.length>0?z.message:JSON.stringify(O.error);F.reject(so(`codex app-server error: ${x}`,z))}else F.resolve(O);e.onEvent?.(O);return}let G=O.method;if(!G){e.onEvent?.(O);return}if(G==="thread/started"){let z=O.params?.thread;z?.id&&(p=z.id)}let A=Se()?F=>{Vt("item.text/buffer-mismatch",{itemId:F.itemId,threadId:F.threadId??null,turnId:F.turnId??null,expectedFromItemText:F.expectedFromItemText,gotFromBuffer:F.gotFromBuffer,expectedLen:F.expectedFromItemText.length,gotLen:F.gotFromBuffer.length})}:void 0;if(G==="turn/started"){let F=O.params,z=F?.turn;z?.id&&(h=z.id),ym(O,E,e.onDelta,A),Se()&&Vt("turn/started",{params:F??null})}if(Se()&&(G==="item/started"||G==="item/completed")){let F=O.params;F?.item?.type==="agentMessage"&&Vt(G,{params:F??null})}if(G==="item/started"||G==="item/agentMessage/delta"||G==="item/completed"){if(G==="item/agentMessage/delta"){let F=O.params;Se()&&Vt("agentMessage/delta",{params:F??null})}ym(O,E,e.onDelta,A)}if(G==="turn/completed"){let F=O.params;if(Se())for(let[x,$]of E.agentItems.entries())$.buffer&&Vt("turn/completed/unflushed-item",{itemId:x,phase:$.phase,bufferLen:$.buffer.length});Kv(E),Se()&&Vt("turn/completed",{params:F??null});let z=e0(O,v);z.shouldReject?(Se()&&Vt("turn/completed/terminal-reject",{message:z.turnError.message}),_=!0,g=!0,c.stdin?.end(),n(z.turnError)):(g=!0,c.stdin?.end())}if(G==="error"){let F=Qv(O,v);if(Se()){let z=O.params,x=z?.error,$=typeof x?.message=="string"?x.message:"(no message)";Vt(F.willRetry?"error/retry":"error/terminal-deferred",{message:$,willRetry:F.willRetry,params:z??null})}}e.onEvent?.(O)});let P="";c.stderr?.on("data",q=>{P+=q.toString()}),c.on("error",q=>{Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:q.message}),n(new ye(`Failed to spawn codex app-server: ${q.message}`,{cause:q}))}),c.on("exit",q=>{if(!u&&!_){if(g){r({result:E.resultText,threadId:p,turnId:h,durationMs:Date.now()-T,exitCode:q});return}if(v.pendingCodexError){n(v.pendingCodexError);return}Z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:q,stderr_tail:P.slice(0,500)}),n(new Error(Zv({exitCode:q,stderr:P})))}}),(async()=>{try{if(await I("initialize",Gv()),k("initialized",{}),e.threadId)try{let q=I("thread/resume",{threadId:e.threadId,sandbox:l,approvalPolicy:"never",...e.model?{model:e.model}:{}}),O=new Promise((G,A)=>setTimeout(()=>A(new Error("resume timeout")),5e3));await Promise.race([q,O]),p=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
932
+ `);let O=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;O?.id&&(p=O.id)}else{let O=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;O?.id&&(p=O.id)}await I("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(q){ot(c).catch(()=>{}),n(q instanceof Error?q:new Error(String(q)))}})()})}var Xv,bm=b(()=>{"use strict";je();je();Ur();oo();Pn();yl();je();Jt();Xv=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(qv(Hv(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Kt(t,e=["high","xhigh"]){return{name:t,reasoning:!0,provider:{npm:"@ai-sdk/github-copilot"},variants:Object.fromEntries(e.map(r=>[r,{reasoningEffort:r,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}}function El(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:Sm},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Tm.map(t=>[t,{name:t}]))},openrouter:{npm:"@ai-sdk/openai-compatible",name:"OpenRouter",options:{baseURL:"https://openrouter.ai/api/v1",apiKey:"{env:OPENROUTER_API_KEY}"},models:Object.fromEntries(km.map(t=>[t,{name:t}]))}})}function vm(){return[...Object.keys(Sm).map(t=>`github-copilot/${t}`),...Tm.map(t=>`deepseek/${t}`),...km.map(t=>`openrouter/${t}`)].sort()}var Sm,Tm,km,bl=b(()=>{"use strict";Sm={"gpt-4.1":{name:"GPT-4.1"},"gpt-4.1-2025-04-14":{name:"GPT-4.1 (2025-04-14)"},"gpt-4o-mini":{name:"GPT-4o mini"},"gpt-4o-mini-2024-07-18":{name:"GPT-4o mini (2024-07-18)"},"gpt-5-mini":Kt("GPT-5 mini",["high"]),"gpt-5.2":Kt("GPT-5.2"),"gpt-5.2-codex":Kt("GPT-5.2 Codex"),"gpt-5.3-codex":Kt("GPT-5.3 Codex"),"gpt-5.4":Kt("GPT-5.4"),"gpt-5.4-mini":Kt("GPT-5.4 mini"),"gpt-5.4-nano":Kt("GPT-5.4 nano"),"gpt-5.5":Kt("GPT-5.5")},Tm=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],km=["qwen/qwen3-coder","qwen/qwen3-coder-plus","qwen/qwen3-coder-flash","qwen/qwen3.5-9b","qwen/qwen3.5-397b-a17b","qwen/qwen3.5-plus-20260420","qwen/qwen3.6-flash","qwen/qwen3.6-plus","qwen/qwen3.6-max-preview","qwen/qwen3.7-plus"]});import{existsSync as jm,mkdirSync as t0,readFileSync as Nm,writeFileSync as Im}from"node:fs";import{join as Fn,resolve as r0}from"node:path";function $m(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:n0}}function s0(t,e){return JSON.stringify(t)===JSON.stringify(e)}function lo(t){return structuredClone(t)}function Am(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function Sl(t,e,r={existsSync:jm,readFileSync:Nm}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=r0(e,s.sessiondir??e);for(let i of o0(o)){let a=i0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Am(a.permission)||n.push(`[${s.alias}] ${i} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function o0(t){return[Fn(t,".opencode","opencode.jsonc"),Fn(t,"opencode.jsonc"),Fn(t,"opencode.json")]}function i0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(a0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function a0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
933
+ `;)o+=1;o<t.length&&(e+=t[o]);continue}if(i==="/"&&a==="*"){for(o+=2;o<t.length&&!(t[o]==="*"&&t[o+1]==="/");)o+=1;o+=1;continue}e+=i}return e.replace(/,\s*([}\]])/g,"$1")}function co(t,e={}){let r=Fn(t,".opencode"),n=Fn(r,"opencode.json");if(Br("lmctl","lmctl_chat",e),!jm(n)){t0(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:El(),mcp:{lmctl:$m()}},null,2);return Im(n,l+`
934
+ `,"utf-8"),!0}let s;try{s=JSON.parse(Nm(n,"utf-8"))}catch{return console.log(xm.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(xm.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;s.permission===void 0&&(s.permission="allow",o=!0),Am(s.permission)||Z({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),l0(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=$m();return s0(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&Im(n,JSON.stringify(s,null,2)+`
935
+ `,"utf-8"),o}function l0(t){let e=El(),r=jt(t.provider)?t.provider:{},n=!jt(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=lo(o),n=!0;continue}if(!jt(i))continue;let a={...i};a.npm===void 0&&(a.npm=o.npm,n=!0),a.name===void 0&&(a.name=o.name,n=!0);let l=jt(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=lo(d),n=!0);a.options=l;let c=jt(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models)){if(c[u]===void 0){c[u]=lo(d),n=!0;continue}let f=c[u];if(jt(f)&&jt(d)){let m={...f};Rm(m,d)&&(c[u]=m,n=!0)}}a.models=c,r[s]=a}return n&&(t.provider=r),n}function jt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Rm(t,e){let r=!1;for(let[n,s]of Object.entries(e)){if(t[n]===void 0){t[n]=lo(s),r=!0;continue}jt(t[n])&&jt(s)&&Rm(t[n],s)&&(r=!0)}return r}var xm,n0,uo=b(()=>{"use strict";je();bl();io();xm={yellow:t=>t},n0=864e5});import{spawn as c0}from"node:child_process";import{existsSync as u0}from"node:fs";import{createInterface as d0}from"node:readline";function f0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
936
936
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
937
937
  ${e}
938
938
 
939
- ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Om(t.slice(n).trimStart())}return Om(b0(t.replace(_0,"")))}function b0(t){let e=g0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(w0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Om(t){let e=[...t.matchAll(y0)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function Cm(t,e){let r=m0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{lo(e.cwd)}catch(x){Y({event:"opencode_config_install_failed",cwd:e.cwd,error_message:x instanceof Error?x.message:String(x)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let x=Wr("gemini","plan"),k=Wr("gemini","yolo");a=a.filter(R=>!(k??[]).includes(R)),x&&a.push(...x)}else e.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
940
- `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Gt(e.tool,a,l)}catch(x){return s(x)}if(e.model&&e.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
941
- `),e.cwd&&!u0(e.cwd))return Y({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=c0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,Y({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),ot(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Y({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),ot(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=d0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1;function T(x,k={}){return new Promise((R,C)=>{let q=p0++;m.set(q,{resolve:R,reject:C});let te=JSON.stringify({jsonrpc:"2.0",id:q,method:x,params:k});vt({event:"acp_send",direction:"SEND",provider:e.tool,method:x,id:q,params:k}),c.stdin?.write(te+`
942
- `)})}f.on("line",x=>{let k;try{k=JSON.parse(x)}catch{return}if(vt({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof k.id=="number"?k.id:void 0,method:typeof k.method=="string"?k.method:void 0,preview:JSON.stringify(k).slice(0,300)}),e.onEvent?.(k),typeof k.id=="number"&&m.has(k.id)){let C=m.get(k.id);if(m.delete(k.id),k.error){let q=k.error,te=typeof q?.message=="string"&&q.message.length>0?q.message:JSON.stringify(k.error);C.reject(so(`ACP RPC error: ${te}`,q))}else C.resolve(k);return}let R=k.method;if(R){if(typeof k.id=="number"){Y({event:"acp_unhandled_request",provider:e.tool,method:R,id:k.id,params:k.params});let C=JSON.stringify({jsonrpc:"2.0",id:k.id,error:{code:-32601,message:`Method not found: ${R} (lmctl does not implement server-side ACP methods)`}});vt({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:k.id,error:"method not found"}),c.stdin?.write(C+`
943
- `);return}if(R==="session/update"){let q=k.params?.update;if(q?.sessionUpdate==="agent_message_chunk"){let j=q.content?.text||"";j&&(h+=j,e.onDelta?.(j))}}}});let E="";c.stderr?.on("data",x=>{E+=x.toString()}),c.on("error",x=>{Y({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:x.message,elapsed_ms:Date.now()-u}),s(new ye(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${x.message}`,{cause:x}))}),c.on("exit",x=>{d||(_?n({result:e.tool==="gemini"?E0(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:x}):(Y({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:x,stderr_tail:E.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(f0({tool:e.tool,exitCode:x,stderr:E})))))});function v(x,k={}){let R=JSON.stringify({jsonrpc:"2.0",method:x,params:k});c.stdin?.write(R+`
939
+ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Om(t.slice(n).trimStart())}return Om(b0(t.replace(_0,"")))}function b0(t){let e=g0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(w0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Om(t){let e=[...t.matchAll(y0)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function Cm(t,e){let r=m0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{co(e.cwd)}catch(I){Z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:I instanceof Error?I.message:String(I)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let I=Wr("gemini","plan"),k=Wr("gemini","yolo");a=a.filter(P=>!(k??[]).includes(P)),I&&a.push(...I)}else e.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
940
+ `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Gt(e.tool,a,l)}catch(I){return s(I)}if(e.model&&e.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
941
+ `),e.cwd&&!u0(e.cwd))return Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=c0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,Z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),ot(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),ot(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=d0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1;function T(I,k={}){return new Promise((P,q)=>{let O=p0++;m.set(O,{resolve:P,reject:q});let G=JSON.stringify({jsonrpc:"2.0",id:O,method:I,params:k});vt({event:"acp_send",direction:"SEND",provider:e.tool,method:I,id:O,params:k}),c.stdin?.write(G+`
942
+ `)})}f.on("line",I=>{let k;try{k=JSON.parse(I)}catch{return}if(vt({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof k.id=="number"?k.id:void 0,method:typeof k.method=="string"?k.method:void 0,preview:JSON.stringify(k).slice(0,300)}),e.onEvent?.(k),typeof k.id=="number"&&m.has(k.id)){let q=m.get(k.id);if(m.delete(k.id),k.error){let O=k.error,G=typeof O?.message=="string"&&O.message.length>0?O.message:JSON.stringify(k.error);q.reject(so(`ACP RPC error: ${G}`,O))}else q.resolve(k);return}let P=k.method;if(P){if(typeof k.id=="number"){Z({event:"acp_unhandled_request",provider:e.tool,method:P,id:k.id,params:k.params});let q=JSON.stringify({jsonrpc:"2.0",id:k.id,error:{code:-32601,message:`Method not found: ${P} (lmctl does not implement server-side ACP methods)`}});vt({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:k.id,error:"method not found"}),c.stdin?.write(q+`
943
+ `);return}if(P==="session/update"){let O=k.params?.update;if(O?.sessionUpdate==="agent_message_chunk"){let A=O.content?.text||"";A&&(h+=A,e.onDelta?.(A))}}}});let E="";c.stderr?.on("data",I=>{E+=I.toString()}),c.on("error",I=>{Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:I.message,elapsed_ms:Date.now()-u}),s(new ye(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${I.message}`,{cause:I}))}),c.on("exit",I=>{d||(_?n({result:e.tool==="gemini"?E0(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:I}):(Z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:I,stderr_tail:E.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(f0({tool:e.tool,exitCode:I,stderr:E})))))});function v(I,k={}){let P=JSON.stringify({jsonrpc:"2.0",method:I,params:k});c.stdin?.write(P+`
944
944
  `)}(async()=>{try{if(await T("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),v("notifications/initialized"),e.sessionId)try{p=(await T("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(k){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${k instanceof Error?k.message:String(k)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
945
- `),p=(await T("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await T("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await T("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),mt(`acp: set_config_option(model=${e.model}) ok`)}catch(k){let R=k instanceof Error?k.message:String(k);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${R}
946
- `)}if(e.effort&&e.tool==="opencode")try{await T("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),mt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(k){let R=k instanceof Error?k.message:String(k);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${R}
947
- `)}mt(`acp: prompt sent (${t.length} chars)`),g=(await T("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,mt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(x){ot(c).catch(()=>{}),s(x instanceof Error?x:new Error(String(x)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var m0,p0,Lm,h0,_0,g0,w0,y0,Mm=b(()=>{"use strict";je();Ur();oo();Pn();co();je();Jt();m0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},p0=1,Lm="(?:png|jpe?g|webp|heic|pdf)",h0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Lm}\\s*`,"gi"),_0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Lm}\\s*`,"i"),g0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,w0=/^STANCE:\s+\S+\s*$/gim,y0=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Dm(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=S0){let n=t.keys().next().value;n!==void 0&&t.delete(n)}t.set(r.id,Date.now()),e(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=t.get(r.id);if(n!==void 0){e({...r,elapsedMs:Date.now()-n}),t.delete(r.id);return}}e(r)}}function T0(){let t=new Map;return(e,r)=>{k0(e,Dm(t,r))}}function k0(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(he(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:he(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
945
+ `),p=(await T("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await T("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await T("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),mt(`acp: set_config_option(model=${e.model}) ok`)}catch(k){let P=k instanceof Error?k.message:String(k);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${P}
946
+ `)}if(e.effort&&e.tool==="opencode")try{await T("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),mt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(k){let P=k instanceof Error?k.message:String(k);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${P}
947
+ `)}mt(`acp: prompt sent (${t.length} chars)`),g=(await T("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,mt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(I){ot(c).catch(()=>{}),s(I instanceof Error?I:new Error(String(I)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var m0,p0,Lm,h0,_0,g0,w0,y0,Mm=b(()=>{"use strict";je();Ur();oo();Pn();uo();je();Jt();m0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},p0=1,Lm="(?:png|jpe?g|webp|heic|pdf)",h0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Lm}\\s*`,"gi"),_0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Lm}\\s*`,"i"),g0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,w0=/^STANCE:\s+\S+\s*$/gim,y0=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Dm(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=S0){let n=t.keys().next().value;n!==void 0&&t.delete(n)}t.set(r.id,Date.now()),e(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=t.get(r.id);if(n!==void 0){e({...r,elapsedMs:Date.now()-n}),t.delete(r.id);return}}e(r)}}function T0(){let t=new Map;return(e,r)=>{k0(e,Dm(t,r))}}function k0(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(he(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:he(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
948
948
  `).length} lines, ${d.length} chars`;else if(Array.isArray(d)){let f=d.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(u=`${f.split(`
949
- `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:o})}else i&&e({kind:"other",summary:i,raw:o})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function uo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?T0():void 0,s=await hm(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function v0(){let t=new Map;return(e,r)=>{I0(e,Dm(t,r))}}function I0(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:he(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:he(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=he(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:he(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${he(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function qr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&vt({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?v0():void 0,s=await Cm(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function x0(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${he(i,120)}`}:{kind:"other",summary:`codex error: ${he(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:he(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:he(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:he(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:he(s)}:{kind:"text",summary:he(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
949
+ `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:o})}else i&&e({kind:"other",summary:i,raw:o})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function fo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?T0():void 0,s=await gm(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function v0(){let t=new Map;return(e,r)=>{I0(e,Dm(t,r))}}function I0(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:he(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:he(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=he(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:he(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${he(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function qr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&vt({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?v0():void 0,s=await Cm(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function x0(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${he(i,120)}`}:{kind:"other",summary:`codex error: ${he(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:he(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:he(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:he(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:he(s)}:{kind:"text",summary:he(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
950
950
  `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let o=s.split(`
951
- `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Pm(t,e){let r=await Em(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>x0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var S0,wr=b(()=>{"use strict";_m();bm();Mm();je();S0=256});function Sl(t){return new bl(t)}var bl,Tl=b(()=>{"use strict";im();Xt();wr();It();bl=class extends Oe{constructor(e){super({provider:new eo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",xe,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:uo})}}});import{readdir as $0,stat as Fm,unlink as j0}from"node:fs/promises";import{join as Un,basename as N0}from"node:path";function A0(t,e,r){return`${t}|${e.toISOString()}|${r}`}function Wn(t,e,r){let n=A0(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Um(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function R0(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function fo(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return fo(r)}).filter(r=>r.length>0).join(`
952
- `);try{return JSON.stringify(t)}catch{return String(t)}}async function Wm(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Fe(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=R0(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var mo,Bm=b(()=>{"use strict";Ht();mo=class{name="codex";codexDirs;constructor(e={}){let r=[Un(Te,".codex"),Un(Te,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Un(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Un(r,"sessions");try{await Fm(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await $0(e)}catch{return r}for(let s of n){let o=Un(e,s),i=await Fm(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=N0(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await Le(e,30),n=await Ie(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=G(h.text.trim(),80)),u=G(h.text.trim(),80))}}if(!o)return null;let m=await Wm(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:Um(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Ie(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Fe(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Um(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let T of _.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let E=T.text.trim();c||(c=G(E,80)),u=G(E,80),Wn(s,m,{role:"user",timestamp:g,content:ue(E)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&Wn(s,m,{role:"assistant",timestamp:g,content:ue(T.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let T of _.content)(T.type==="input_text"||T.type==="output_text")&&typeof T.text=="string"&&T.text&&Wn(s,m,{role:"system",timestamp:g,content:ue(T.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?ue(fo(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:ue(fo(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let T=_.summary.map(E=>fo(E.text)).join(`
953
- `);T.trim()&&Wn(s,m,{role:"thinking",timestamp:g,content:ue(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Wn(s,m,{role:"thinking",timestamp:g,content:ue(_)})}}if(!o)return null;let p=await Wm(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await j0(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Le(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function vl(t){return new kl(t)}var kl,Il=b(()=>{"use strict";Bm();Xt();wr();It();kl=class extends Oe{constructor(e){super({provider:new mo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${xe}
954
- `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Pm})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Bn(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);if(e.length>1)try{let n=JSON.parse(e[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(t)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function po(t){let e=Bn(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=t.split(`
951
+ `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Pm(t,e){let r=await Em(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>x0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var S0,wr=b(()=>{"use strict";wm();bm();Mm();je();S0=256});function kl(t){return new Tl(t)}var Tl,vl=b(()=>{"use strict";lm();Xt();wr();It();Tl=class extends Oe{constructor(e){super({provider:new eo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",xe,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:fo})}}});import{readdir as $0,stat as Fm,unlink as j0}from"node:fs/promises";import{join as Un,basename as N0}from"node:path";function A0(t,e,r){return`${t}|${e.toISOString()}|${r}`}function Wn(t,e,r){let n=A0(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Um(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function R0(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function mo(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return mo(r)}).filter(r=>r.length>0).join(`
952
+ `);try{return JSON.stringify(t)}catch{return String(t)}}async function Wm(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Fe(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=R0(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var po,Bm=b(()=>{"use strict";Ht();po=class{name="codex";codexDirs;constructor(e={}){let r=[Un(Te,".codex"),Un(Te,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Un(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Un(r,"sessions");try{await Fm(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await $0(e)}catch{return r}for(let s of n){let o=Un(e,s),i=await Fm(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=N0(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await Le(e,30),n=await Ie(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=V(h.text.trim(),80)),u=V(h.text.trim(),80))}}if(!o)return null;let m=await Wm(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:Um(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Ie(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Fe(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Um(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let T of _.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let E=T.text.trim();c||(c=V(E,80)),u=V(E,80),Wn(s,m,{role:"user",timestamp:g,content:de(E)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&Wn(s,m,{role:"assistant",timestamp:g,content:de(T.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let T of _.content)(T.type==="input_text"||T.type==="output_text")&&typeof T.text=="string"&&T.text&&Wn(s,m,{role:"system",timestamp:g,content:de(T.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?de(mo(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:de(mo(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let T=_.summary.map(E=>mo(E.text)).join(`
953
+ `);T.trim()&&Wn(s,m,{role:"thinking",timestamp:g,content:de(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Wn(s,m,{role:"thinking",timestamp:g,content:de(_)})}}if(!o)return null;let p=await Wm(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await j0(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Le(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function xl(t){return new Il(t)}var Il,$l=b(()=>{"use strict";Bm();Xt();wr();It();Il=class extends Oe{constructor(e){super({provider:new po(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${xe}
954
+ `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Pm})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Bn(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);if(e.length>1)try{let n=JSON.parse(e[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(t)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function ho(t){let e=Bn(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=t.split(`
955
955
  `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let o=[],i=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let u=c;if(typeof u.id=="string"){let d=i.get(u.id);d?O0(d,u):(o.push(u),i.set(u.id,u))}else o.push(u)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:o}}function O0(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&qm(t.tokens)&&qm(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function qm(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Hm(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let o of r)s.push(JSON.stringify(o));return s.join(`
956
956
  `)+`
957
- `}var xl=b(()=>{"use strict"});import{createHash as L0}from"node:crypto";import{readdir as qn,readFile as Jm,stat as ho,unlink as C0}from"node:fs/promises";import{join as He,basename as M0,dirname as D0}from"node:path";import{cwd as P0}from"node:process";function Xm(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Gm(t){return t==="user"}function $l(t){return t==="gemini"||t==="assistant"}function yr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function F0(t){return`${t.sessionId}\0${t.cwd}`}function U0(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function _o(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Vm(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!$l(a.type)||!a.tokens)continue;let l=_o(a.tokens.input),c=_o(a.tokens.cached),u=Math.max(l-c,0),d=_o(a.tokens.output),f=_o(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function W0(t){return L0("sha256").update(t).digest("hex")}function Hn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=D0(r);if(n===r)break;r=n}}var go,Km=b(()=>{"use strict";Ht();xl();je();go=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||He(Te,".gemini");this.geminiProjectsFile=He(r,"projects.json"),this.geminiTmpDir=He(r,"tmp");let n=e.claudeDir||He(Te,".claude");this.claudeProjectsDir=He(n,"projects");let s=[He(Te,".codex"),He(Te,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>He(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=F0(s),i=r.get(o);r.set(o,i?U0(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ie(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=yr(g.timestamp),T=g.type,E=ue(Xm(g.content));if(Gm(T)){let x=E.trim();x&&(u||(u=G(x,80)),d=G(x,80)),o.push({role:"user",timestamp:_,content:x||E});continue}if($l(T)){g.model&&(f=g.model);for(let x of g.thoughts||[]){let k=[x.subject,x.description].filter(Boolean).join(`
958
- `).trim();k&&o.push({role:"thinking",timestamp:yr(x.timestamp,_),content:ue(k)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let v=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${v}${E}`.trim()})}let m=yr(n.startTime,s.createdAt),p=yr(n.lastUpdated,s.modifiedAt),h=Vm(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Ie(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(Gm(m.type)){d++;let p=Xm(m.content).trim();p&&(l||(l=G(ue(p),80)),c=G(ue(p),80))}else $l(m.type)&&(d++,m.model&&(u=m.model));let f=Vm(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:yr(r.startTime,n.createdAt),modifiedAt:yr(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await Jm(e,"utf-8");if(Bn(r)==="unknown")return Y({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return po(r)}catch{return null}}extractSessionIdFromFilename(e){let r=M0(e).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let e=[],r;try{r=await qn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=He(this.geminiTmpDir,n,"chats");if(!(await ho(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await qn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(He(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await C0(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await Ie(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:yr(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;Hn(e,P0());for(let n of this.extraWorkspacePaths)Hn(e,n);for(let n of await this.collectGeminiProjectPaths())Hn(e,n);for(let n of await this.collectCodexCwds())Hn(e,n);for(let n of await this.collectClaudeCwds())Hn(e,n);let r=new Map;for(let n of e)r.set(W0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Jm(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Le(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await qn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=He(this.claudeProjectsDir,n);if(!(await ho(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await qn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=He(s,a),u=(await Le(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await ho(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await qn(e)}catch{return r}for(let o of s){let i=He(e,o),a=await ho(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as B0,writeFileSync as q0,mkdirSync as H0}from"node:fs";import{join as J0,dirname as X0}from"node:path";import{randomUUID as G0}from"node:crypto";function Nl(t){return new jl(t)}var jl,Al=b(()=>{"use strict";Km();Xt();wr();It();xl();jl=class extends Oe{constructor(e){super({provider:new go(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",xe,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>qr(r,{...n,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
959
- `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:ro,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,r){let n=await this.resolvePath(e);if(!n)return{success:!1,error:`Session file not found for ${e}`};try{let s=B0(n,"utf-8"),o=Bn(s),i=po(s),a=G0();i.sessionId=a,i.kind="main";let l=X0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=J0(l,d);return H0(l,{recursive:!0}),q0(f,Hm(i,o),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Ym,readFile as V0,rm as K0,stat as Hr}from"node:fs/promises";import{basename as Y0,join as it}from"node:path";function z0(t){let e={};for(let r of t.split(`
960
- `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function Er(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function Z0(t){let e=0;for await(let r of Fe(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var wo,zm=b(()=>{"use strict";Ht();wo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||it(Te,".copilot");this.sessionStateDir=it(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Ym(this.sessionStateDir)}catch{return e}for(let n of r){let s=it(this.sessionStateDir,n);if((await Hr(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=it(r,"events.jsonl"),o=await Hr(s).catch(()=>null),i=o?s:it(r,"workspace.yaml"),a=await Ie(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||Y0(r)||e;if(o)for await(let _ of Fe(s)){let T=Er(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=Er(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let E=_.data.content||"",v=E.trim();v&&(m||(m=G(v,80)),p=G(v,80)),l.push({role:"user",timestamp:T,content:ue(v||E)});continue}if(_.type==="assistant.message"&&_.data){let E=(_.data.content||"").trim();if(E&&l.push({role:"assistant",timestamp:T,content:ue(E),model:u}),_.data.toolRequests)for(let v of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:v.name||"unknown tool",toolName:v.name,toolInput:v.arguments?JSON.stringify(v.arguments,null,2):void 0,toolCallId:v.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let E=_.data.result?.content||"",v=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:ue(E),toolDetailedContent:v?ue(v):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:ue(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let E=_.data?.message||"";E.trim()&&l.push({role:"system",timestamp:T,content:ue(E)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Er(n?.created_at)??a.createdAt,modifiedAt:Er(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=it(e,"events.jsonl"),o=await Hr(s).catch(()=>null),i=o?s:it(e,"workspace.yaml"),a=await Ie(o?s:e),l=o?await Le(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=Er(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let T=(_.data.content||"").trim();T&&(p||(p=G(T,80)),h=G(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=o?await Z0(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Er(n?.created_at)??a.createdAt,modifiedAt:Er(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=it(e,"workspace.yaml");try{let n=await V0(r,"utf-8");return z0(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await K0(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Ym(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=it(this.sessionStateDir,e);if((await Hr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=it(this.sessionStateDir,s);(await Hr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=it(this.sessionStateDir,s);if(!(await Hr(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function Rl(t){return new Oe({provider:new wo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",xe,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>qr(e,{...r,acpTool:"copilot"})})}var Ol=b(()=>{"use strict";zm();Xt();wr();It()});import{existsSync as Zm}from"node:fs";import{join as yo}from"node:path";import{createRequire as Q0}from"node:module";function Qm(){return Ll===null&&(Ll=Q0(import.meta.url)("node:sqlite").DatabaseSync),Ll}function eI(){let t=process.env.XDG_DATA_HOME||yo(Te,".local","share"),e=process.env.XDG_CONFIG_HOME||yo(Te,".config");return[yo(t,"opencode","opencode.db"),yo(e,"opencode","opencode.db")]}var Ll,Eo,ep=b(()=>{"use strict";Ht();Ll=null;Eo=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=eI().find(r=>Zm(r))??null}openDb(){return!this.dbPath||!Zm(this.dbPath)?null:new(Qm())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
957
+ `}var jl=b(()=>{"use strict"});import{createHash as L0}from"node:crypto";import{readdir as qn,readFile as Jm,stat as _o,unlink as C0}from"node:fs/promises";import{join as He,basename as M0,dirname as D0}from"node:path";import{cwd as P0}from"node:process";function Xm(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Gm(t){return t==="user"}function Nl(t){return t==="gemini"||t==="assistant"}function yr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function F0(t){return`${t.sessionId}\0${t.cwd}`}function U0(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function go(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Vm(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Nl(a.type)||!a.tokens)continue;let l=go(a.tokens.input),c=go(a.tokens.cached),u=Math.max(l-c,0),d=go(a.tokens.output),f=go(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function W0(t){return L0("sha256").update(t).digest("hex")}function Hn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=D0(r);if(n===r)break;r=n}}var wo,Km=b(()=>{"use strict";Ht();jl();je();wo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||He(Te,".gemini");this.geminiProjectsFile=He(r,"projects.json"),this.geminiTmpDir=He(r,"tmp");let n=e.claudeDir||He(Te,".claude");this.claudeProjectsDir=He(n,"projects");let s=[He(Te,".codex"),He(Te,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>He(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=F0(s),i=r.get(o);r.set(o,i?U0(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ie(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=yr(g.timestamp),T=g.type,E=de(Xm(g.content));if(Gm(T)){let I=E.trim();I&&(u||(u=V(I,80)),d=V(I,80)),o.push({role:"user",timestamp:_,content:I||E});continue}if(Nl(T)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let k=[I.subject,I.description].filter(Boolean).join(`
958
+ `).trim();k&&o.push({role:"thinking",timestamp:yr(I.timestamp,_),content:de(k)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let v=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${v}${E}`.trim()})}let m=yr(n.startTime,s.createdAt),p=yr(n.lastUpdated,s.modifiedAt),h=Vm(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Ie(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(Gm(m.type)){d++;let p=Xm(m.content).trim();p&&(l||(l=V(de(p),80)),c=V(de(p),80))}else Nl(m.type)&&(d++,m.model&&(u=m.model));let f=Vm(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:yr(r.startTime,n.createdAt),modifiedAt:yr(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await Jm(e,"utf-8");if(Bn(r)==="unknown")return Z({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return ho(r)}catch{return null}}extractSessionIdFromFilename(e){let r=M0(e).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let e=[],r;try{r=await qn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=He(this.geminiTmpDir,n,"chats");if(!(await _o(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await qn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(He(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await C0(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await Ie(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:yr(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;Hn(e,P0());for(let n of this.extraWorkspacePaths)Hn(e,n);for(let n of await this.collectGeminiProjectPaths())Hn(e,n);for(let n of await this.collectCodexCwds())Hn(e,n);for(let n of await this.collectClaudeCwds())Hn(e,n);let r=new Map;for(let n of e)r.set(W0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Jm(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Le(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await qn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=He(this.claudeProjectsDir,n);if(!(await _o(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await qn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=He(s,a),u=(await Le(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await _o(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await qn(e)}catch{return r}for(let o of s){let i=He(e,o),a=await _o(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as B0,writeFileSync as q0,mkdirSync as H0}from"node:fs";import{join as J0,dirname as X0}from"node:path";import{randomUUID as G0}from"node:crypto";function Rl(t){return new Al(t)}var Al,Ol=b(()=>{"use strict";Km();Xt();wr();It();jl();Al=class extends Oe{constructor(e){super({provider:new wo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",xe,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>qr(r,{...n,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
959
+ `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:ro,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,r){let n=await this.resolvePath(e);if(!n)return{success:!1,error:`Session file not found for ${e}`};try{let s=B0(n,"utf-8"),o=Bn(s),i=ho(s),a=G0();i.sessionId=a,i.kind="main";let l=X0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=J0(l,d);return H0(l,{recursive:!0}),q0(f,Hm(i,o),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Ym,readFile as V0,rm as K0,stat as Hr}from"node:fs/promises";import{basename as Y0,join as it}from"node:path";function z0(t){let e={};for(let r of t.split(`
960
+ `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function Er(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function Z0(t){let e=0;for await(let r of Fe(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var yo,zm=b(()=>{"use strict";Ht();yo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||it(Te,".copilot");this.sessionStateDir=it(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Ym(this.sessionStateDir)}catch{return e}for(let n of r){let s=it(this.sessionStateDir,n);if((await Hr(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=it(r,"events.jsonl"),o=await Hr(s).catch(()=>null),i=o?s:it(r,"workspace.yaml"),a=await Ie(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||Y0(r)||e;if(o)for await(let _ of Fe(s)){let T=Er(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=Er(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let E=_.data.content||"",v=E.trim();v&&(m||(m=V(v,80)),p=V(v,80)),l.push({role:"user",timestamp:T,content:de(v||E)});continue}if(_.type==="assistant.message"&&_.data){let E=(_.data.content||"").trim();if(E&&l.push({role:"assistant",timestamp:T,content:de(E),model:u}),_.data.toolRequests)for(let v of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:v.name||"unknown tool",toolName:v.name,toolInput:v.arguments?JSON.stringify(v.arguments,null,2):void 0,toolCallId:v.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let E=_.data.result?.content||"",v=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:de(E),toolDetailedContent:v?de(v):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:de(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let E=_.data?.message||"";E.trim()&&l.push({role:"system",timestamp:T,content:de(E)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=V(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Er(n?.created_at)??a.createdAt,modifiedAt:Er(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=it(e,"events.jsonl"),o=await Hr(s).catch(()=>null),i=o?s:it(e,"workspace.yaml"),a=await Ie(o?s:e),l=o?await Le(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=Er(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let T=(_.data.content||"").trim();T&&(p||(p=V(T,80)),h=V(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=V(_,80))}let g=o?await Z0(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Er(n?.created_at)??a.createdAt,modifiedAt:Er(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=it(e,"workspace.yaml");try{let n=await V0(r,"utf-8");return z0(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await K0(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Ym(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=it(this.sessionStateDir,e);if((await Hr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=it(this.sessionStateDir,s);(await Hr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=it(this.sessionStateDir,s);if(!(await Hr(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function Ll(t){return new Oe({provider:new yo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",xe,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>qr(e,{...r,acpTool:"copilot"})})}var Cl=b(()=>{"use strict";zm();Xt();wr();It()});import{existsSync as Zm}from"node:fs";import{join as Eo}from"node:path";import{createRequire as Q0}from"node:module";function Qm(){return Ml===null&&(Ml=Q0(import.meta.url)("node:sqlite").DatabaseSync),Ml}function eI(){let t=process.env.XDG_DATA_HOME||Eo(Te,".local","share"),e=process.env.XDG_CONFIG_HOME||Eo(Te,".config");return[Eo(t,"opencode","opencode.db"),Eo(e,"opencode","opencode.db")]}var Ml,bo,ep=b(()=>{"use strict";Ht();Ml=null;bo=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=eI().find(r=>Zm(r))??null}openDb(){return!this.dbPath||!Zm(this.dbPath)?null:new(Qm())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
961
961
  s.time_created, s.time_updated
962
962
  FROM session s
963
963
  ORDER BY s.time_updated DESC`).all(),o=[];for(let i of s){let a=r.get(i.project_id),l=i.directory||a?.worktree||"(unknown)",c=e.prepare(`SELECT m.id, m.data, m.time_created FROM message m
964
- WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(i.id),u=0,d,f,m,p=[];for(let g of c){let _;try{_=JSON.parse(g.data)}catch{continue}m||(m=_.model?.modelID||_.modelID),(_.role==="user"||_.role==="assistant")&&u++,_.role==="user"&&p.push(g.id)}let h=[...p.length>0?[p[0]]:[],...p.length>1?[p[p.length-1]]:[]];for(let g of h){let _=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g),T=this.extractText(_);T&&(d||(d=G(T,80)),f=G(T,80))}o.push({provider:"opencode",sessionId:i.id,slug:i.slug,cwd:l,createdAt:new Date(i.time_created),modifiedAt:new Date(i.time_updated),model:m,startCommand:"opencode",firstUserMessage:d,lastUserMessage:f,messageCount:u,filePath:this.dbPath})}return o}finally{e.close()}}async loadSession(e){let r=this.openDb();if(!r)return null;try{let n=this.findSessionRow(r,e);return n?this.buildSessionDetail(r,n):null}finally{r.close()}}buildSessionDetail(e,r){let n=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),s=r.directory||n?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
965
- FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),i=[],a=0,l,c,u;for(let d of o){let f;try{f=JSON.parse(d.data)}catch{continue}l||(l=f.model?.modelID||f.modelID);let m=f.model?.modelID||f.modelID,p=new Date(f.time?.created||d.time_created),h=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(d.id);if(f.role==="user"){let g=this.extractText(h);g&&(c||(c=G(g,80)),u=G(g,80)),i.push({role:"user",timestamp:p,content:g||"(empty)"}),a++}else if(f.role==="assistant"){for(let g of h){let _;try{_=JSON.parse(g.data)}catch{continue}_.type==="text"&&_.text?i.push({role:"assistant",timestamp:p,content:_.text,model:m}):_.type==="reasoning"&&_.text?i.push({role:"thinking",timestamp:p,content:_.text}):_.type==="tool"&&_.tool&&(i.push({role:"tool_use",timestamp:p,content:`${_.tool}`,toolName:_.tool,toolCallId:_.callID,toolInput:_.state?.input?JSON.stringify(_.state.input):void 0}),(_.state?.output||_.state?.error)&&i.push({role:"tool_result",timestamp:p,content:_.state.error||_.state.output||"",toolCallId:_.callID}))}a++}}return{provider:"opencode",sessionId:r.id,slug:r.slug,cwd:s,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:l,startCommand:"opencode",firstUserMessage:c,lastUserMessage:u,messageCount:a,filePath:this.dbPath,messages:i}}extractText(e){let r=[];for(let n of e){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
964
+ WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(i.id),u=0,d,f,m,p=[];for(let g of c){let _;try{_=JSON.parse(g.data)}catch{continue}m||(m=_.model?.modelID||_.modelID),(_.role==="user"||_.role==="assistant")&&u++,_.role==="user"&&p.push(g.id)}let h=[...p.length>0?[p[0]]:[],...p.length>1?[p[p.length-1]]:[]];for(let g of h){let _=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g),T=this.extractText(_);T&&(d||(d=V(T,80)),f=V(T,80))}o.push({provider:"opencode",sessionId:i.id,slug:i.slug,cwd:l,createdAt:new Date(i.time_created),modifiedAt:new Date(i.time_updated),model:m,startCommand:"opencode",firstUserMessage:d,lastUserMessage:f,messageCount:u,filePath:this.dbPath})}return o}finally{e.close()}}async loadSession(e){let r=this.openDb();if(!r)return null;try{let n=this.findSessionRow(r,e);return n?this.buildSessionDetail(r,n):null}finally{r.close()}}buildSessionDetail(e,r){let n=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),s=r.directory||n?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
965
+ FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),i=[],a=0,l,c,u;for(let d of o){let f;try{f=JSON.parse(d.data)}catch{continue}l||(l=f.model?.modelID||f.modelID);let m=f.model?.modelID||f.modelID,p=new Date(f.time?.created||d.time_created),h=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(d.id);if(f.role==="user"){let g=this.extractText(h);g&&(c||(c=V(g,80)),u=V(g,80)),i.push({role:"user",timestamp:p,content:g||"(empty)"}),a++}else if(f.role==="assistant"){for(let g of h){let _;try{_=JSON.parse(g.data)}catch{continue}_.type==="text"&&_.text?i.push({role:"assistant",timestamp:p,content:_.text,model:m}):_.type==="reasoning"&&_.text?i.push({role:"thinking",timestamp:p,content:_.text}):_.type==="tool"&&_.tool&&(i.push({role:"tool_use",timestamp:p,content:`${_.tool}`,toolName:_.tool,toolCallId:_.callID,toolInput:_.state?.input?JSON.stringify(_.state.input):void 0}),(_.state?.output||_.state?.error)&&i.push({role:"tool_result",timestamp:p,content:_.state.error||_.state.output||"",toolCallId:_.callID}))}a++}}return{provider:"opencode",sessionId:r.id,slug:r.slug,cwd:s,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:l,startCommand:"opencode",firstUserMessage:c,lastUserMessage:u,messageCount:a,filePath:this.dbPath,messages:i}}extractText(e){let r=[];for(let n of e){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
966
966
  `).trim()}async resolveSessionPath(e){if(!this.dbPath)return null;let r=this.openDb();if(!r)return null;try{return this.findSessionRow(r,e)?this.dbPath:null}finally{r.close()}}async deleteSession(e){if(!this.dbPath)return!1;let r=new(Qm())(this.dbPath,{open:!0});try{let n=this.findSessionRow(r,e);return n?r.prepare("DELETE FROM session WHERE id = ?").run(n.id).changes>0:!1}finally{r.close()}}findSessionRow(e,r){let n=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
967
967
  s.time_created, s.time_updated
968
968
  FROM session s WHERE s.id = ?`).get(r);if(n)return n;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
@@ -970,9 +970,9 @@ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length
970
970
  FROM session s
971
971
  WHERE s.id LIKE ?
972
972
  ORDER BY s.time_updated DESC
973
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Ml(){return new Cl}var Cl,Dl=b(()=>{"use strict";ep();Xt();wr();It();Cl=class extends Oe{constructor(){super({provider:new Eo,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",xe],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>qr(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??xe),r}}});import{readdir as bo,readFile as tI,rm as rI}from"node:fs/promises";import{basename as tp,join as Yt}from"node:path";function rp(t){return t.type==="user"||t.message?.role==="user"}function np(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function sp(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
973
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Pl(){return new Dl}var Dl,Fl=b(()=>{"use strict";ep();Xt();wr();It();Dl=class extends Oe{constructor(){super({provider:new bo,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",xe],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>qr(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??xe),r}}});import{readdir as So,readFile as tI,rm as rI}from"node:fs/promises";import{basename as tp,join as Yt}from"node:path";function rp(t){return t.type==="user"||t.message?.role==="user"}function np(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function sp(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
974
974
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
975
- `):"":""}function op(t){return t.model||t.message?.model}var So,ip=b(()=>{"use strict";Ht();So=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Yt(Te,".qwen")}async discoverSessions(){let e=Yt(this.baseDir,"projects"),r;try{r=await bo(e)}catch{return[]}let n=[];for(let s of r){let o=Yt(e,s,"chats"),i;try{i=await bo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Yt(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Le(e,30);if(n.length===0)return null;let s=await Ie(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),rp(d)){let f=sp(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(np(d)){let f=op(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=tp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Ie(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Fe(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(rp(f)){let h=sp(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(np(f)){let h=op(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=Yt(this.baseDir,"projects");try{let n=await bo(r),s=[];for(let o of n){let i=Yt(r,o,"chats",`${e}.jsonl`);try{return await tI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Yt(r,o,"chats"),a;try{a=await bo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;tp(l,".jsonl").startsWith(e)&&s.push(Yt(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await rI(r),!0}catch{return!1}}}});function Fl(){return new Pl}var Pl,Ul=b(()=>{"use strict";ip();Xt();wr();It();Pl=class extends Oe{constructor(){super({provider:new So,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",xe,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:uo})}}});import{readdir as ap,readFile as nI,rm as lp,stat as cp}from"node:fs/promises";import{basename as Wl,join as Nt}from"node:path";async function sI(t){let e=await Promise.all(t.map(r=>Ie(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function oI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function up(t){return t.type==="USER_INPUT"}function dp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function iI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function fp(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function mp(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function aI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function lI(t){for await(let e of Fe(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=cI(s);if(o)return o}let n=uI(e.content);if(n)return n}return null}function cI(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function uI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function pp(t){if(t.endsWith(".db"))return Wl(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var To,hp=b(()=>{"use strict";Ht();To=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Nt(Te,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Nt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Nt(this.baseDir,"conversations"),r;try{r=await ap(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Wl(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Nt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Nt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await cp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await sI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Le(n,80);for(let f of d){let m=mp(f.content);if(m&&(a=m),up(f)){let p=fp(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else dp(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=pp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Fe(o)){let d=oI(u.created_at,s.modifiedAt),f=mp(u.content);if(f&&(a=f),up(u)){let m=fp(u.content),p=m.trim();p&&(l||(l=G(p,80)),c=G(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:aI(m.args),toolName:m.name||"tool"});dp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):iI(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await cp(r),r}catch{}let n=Nt(this.baseDir,"conversations");try{let s=[];for(let o of await ap(n)){if(!o.endsWith(".db"))continue;Wl(o,".db").startsWith(e)&&s.push(Nt(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=pp(r);return n?(await lp(this.conversationPath(n),{force:!0}),await lp(Nt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await lI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Nt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await nI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as dI}from"node:child_process";function ql(t){return new Bl(t)}async function fI(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",pI(e.timeoutMs)];e.model&&n.push("--model",e.model),Gt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await mI(e.binary,n,{cwd:e.cwd,env:Ke(e.env,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function mI(t,e,r){return new Promise((n,s)=>{let o;try{o=dI(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function pI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Bl,Hl=b(()=>{"use strict";hp();Xt();It();Jt();Pn();Bl=class extends Oe{constructor(e){super({provider:new To(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",xe,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:fI})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as hI}from"node:crypto";import{join as _I}from"node:path";function gI(t){return hI("sha256").update(t).digest("hex").slice(0,8)}function wI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function yI(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function EI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function ko(t){return Math.max(1,Math.ceil(t.length/4))}function _p(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function Gl(){return new Xl}var br,Jl,Xl,Vl=b(()=>{"use strict";br=new Map;Jl=class{name="ClaudeMock";async discoverSessions(){return[...br.values()].map(_p)}async loadSession(e){let r=br.get(e);return r===void 0?null:{..._p(r),messages:r.messages.slice()}}async resolveSessionPath(e){return br.get(e)?.filePath??null}async deleteSession(e){return br.delete(e)}},Xl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Jl;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=wI(yI(e,r)),s=`mock-${n}-${gI(`${e}:${n}`)}`,o=new Date,i=br.get(s),a=r?.prompt??"ClaudeMock seed",l=ko(a),c={sessionId:s,cwd:e,filePath:_I(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=ko("ACK: ClaudeMock seeded"),br.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=br.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${EI(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=ko(e),s.totalOutputTokens+=ko(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function _t(t){let e=[Sl({claudeDir:t?.claudeDir}),vl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Nl({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Rl({copilotDir:t?.copilotDir}),Ml(),Fl(),ql({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Gl()),e}var Kl=b(()=>{"use strict";Tl();Il();Al();Ol();Dl();Ul();Hl();Vl();Tl();Il();Al();Ol();Dl();Ul();Hl();Vl()});var Ql={};le(Ql,{ProviderRegistry:()=>Dn,TransportConnectionError:()=>ye,TransportError:()=>Ye,TransportJsonError:()=>no,TransportProcessError:()=>xt,TransportRpcError:()=>$t,_resetDefaultRegistryForTests:()=>bI,chat:()=>Sr,countTokens:()=>Zl,createAdapterRegistry:()=>ht,createAllAdapters:()=>_t,listSessions:()=>zl,seed:()=>Yl});function Io(){return vo===null&&(vo=ht(_t())),vo}function bI(){vo=null}function wp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Sr(t){let e=t.registry??Io(),r=wp(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Yl(t){let e=t.registry??Io(),r=wp(e,t.provider),n=await gp(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await gp(e,t.provider,t.cwd),i=SI(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function gp(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function SI(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function zl(t={}){return(t.registry??Io()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Zl(t){let r=await(t.registry??Io()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var vo,At=b(()=>{"use strict";fl();Kl();fl();Kl();Ur();vo=null});function TI(){return ec===null&&(ec=ht(_t())),ec}async function Xr(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await vI(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Jr.delete(r),e.setMemberState(r,"idle");else{let i=kI(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function kI(t,e){if(!(t instanceof Ee))return Jr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(Jr.get(e)??0)+1;return r>=3?(Jr.delete(e),"consecutive_timeouts"):(Jr.set(e,r),null)}return Jr.delete(e),null}async function vI(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=TI(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ee("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,tc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${yp(u)}`,tc(t.sessionid,t.sessiondir,"unresolved")))}let o=tc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Sr({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ee("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ee("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):II(u,o)}finally{a!==null&&clearTimeout(a)}}function tc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function yp(t){return t instanceof Error?t.message:String(t)}function II(t,e){if(t instanceof Ee)return t;if(t instanceof ye){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ee("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ee("enoent",null,t.message,e):new Ee("other",null,t.message,e)}return t instanceof xt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new Ee("other",null,t.message,e):new Ee("other",null,yp(t),e)}var Ee,ec,Jr,Jn=b(()=>{"use strict";At();Ee=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},ec=null;Jr=new Map});function Ep(){return rc===null&&(rc=ht(_t())),rc}function $I(t,e){if(!xI.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function Gr(t){let e=$I(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await jI({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function jI(t){let e=t.member.provider,r=t.member.sessiondir,n=nc("seed",r,e);try{let s=await Yl({provider:e,cwd:r,registry:Ep()});if(!s.success)throw AI(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:sc(s,n)}}async function bp(t){return NI(t)}async function NI(t){let e=Ep(),r=nc("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new ke("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof ke?o:sc(o,r)}let s=nc("tokens",t.sessionid,n);try{let o=await Zl({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof ke?o:sc(o,s)}}function nc(t,e,r){return["<library>",t,e,"--provider",r]}function AI(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,e)}return new ke("other",null,r,e)}function sc(t,e){return t instanceof ke?t:t instanceof ye?t.cause?.code==="ENOENT"?new ke("enoent",null,t.message,e):new ke("other",null,t.message,e):t instanceof xt?new ke("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new ke("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new ke("other",null,t.message,e):new ke("other",null,t instanceof Error?t.message:String(t),e)}var ke,rc,xI,xo=b(()=>{"use strict";At();ke=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},rc=null;xI=/^provider[123]$/});function $o(t){return Buffer.from(t,"utf8").toString("base64url")}function Gn(t){return Buffer.from(t,"base64url").toString("utf8")}async function Sp(t,e=r=>bp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of RI(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function Tp(t,e,r){let n=kp(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Xn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Xr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:vp(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function oc(t,e,r){let n=kp(t,e,r);if(n===null)throw new Error("session member not found");let s=await Gr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:vp(t,e,r)}}function RI(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function kp(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function vp(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Xn,jo=b(()=>{"use strict";Jn();xo();Xn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function ic(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??LI(e),s=r-n,o=e.query(`
975
+ `):"":""}function op(t){return t.model||t.message?.model}var To,ip=b(()=>{"use strict";Ht();To=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Yt(Te,".qwen")}async discoverSessions(){let e=Yt(this.baseDir,"projects"),r;try{r=await So(e)}catch{return[]}let n=[];for(let s of r){let o=Yt(e,s,"chats"),i;try{i=await So(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Yt(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Le(e,30);if(n.length===0)return null;let s=await Ie(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),rp(d)){let f=sp(d).trim();f&&(l||(l=V(f,80)),c=V(f,80)),u++}if(np(d)){let f=op(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=tp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Ie(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Fe(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(rp(f)){let h=sp(f);h.trim()&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(np(f)){let h=op(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=Yt(this.baseDir,"projects");try{let n=await So(r),s=[];for(let o of n){let i=Yt(r,o,"chats",`${e}.jsonl`);try{return await tI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Yt(r,o,"chats"),a;try{a=await So(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;tp(l,".jsonl").startsWith(e)&&s.push(Yt(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await rI(r),!0}catch{return!1}}}});function Wl(){return new Ul}var Ul,Bl=b(()=>{"use strict";ip();Xt();wr();It();Ul=class extends Oe{constructor(){super({provider:new To,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",xe,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:fo})}}});import{readdir as ap,readFile as nI,rm as lp,stat as cp}from"node:fs/promises";import{basename as ql,join as Nt}from"node:path";async function sI(t){let e=await Promise.all(t.map(r=>Ie(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function oI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function up(t){return t.type==="USER_INPUT"}function dp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function iI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function fp(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function mp(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function aI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function lI(t){for await(let e of Fe(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=cI(s);if(o)return o}let n=uI(e.content);if(n)return n}return null}function cI(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function uI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function pp(t){if(t.endsWith(".db"))return ql(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var ko,hp=b(()=>{"use strict";Ht();ko=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Nt(Te,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Nt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Nt(this.baseDir,"conversations"),r;try{r=await ap(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=ql(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Nt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Nt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await cp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await sI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Le(n,80);for(let f of d){let m=mp(f.content);if(m&&(a=m),up(f)){let p=fp(f.content).trim();p&&(l||(l=V(p,80)),c=V(p,80)),u++}else dp(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=pp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Fe(o)){let d=oI(u.created_at,s.modifiedAt),f=mp(u.content);if(f&&(a=f),up(u)){let m=fp(u.content),p=m.trim();p&&(l||(l=V(p,80)),c=V(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:aI(m.args),toolName:m.name||"tool"});dp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):iI(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await cp(r),r}catch{}let n=Nt(this.baseDir,"conversations");try{let s=[];for(let o of await ap(n)){if(!o.endsWith(".db"))continue;ql(o,".db").startsWith(e)&&s.push(Nt(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=pp(r);return n?(await lp(this.conversationPath(n),{force:!0}),await lp(Nt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await lI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Nt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await nI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as dI}from"node:child_process";function Jl(t){return new Hl(t)}async function fI(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",pI(e.timeoutMs)];e.model&&n.push("--model",e.model),Gt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await mI(e.binary,n,{cwd:e.cwd,env:Ke(e.env,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function mI(t,e,r){return new Promise((n,s)=>{let o;try{o=dI(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function pI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Hl,Xl=b(()=>{"use strict";hp();Xt();It();Jt();Pn();Hl=class extends Oe{constructor(e){super({provider:new ko(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",xe,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:fI})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as hI}from"node:crypto";import{join as _I}from"node:path";function gI(t){return hI("sha256").update(t).digest("hex").slice(0,8)}function wI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function yI(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function EI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function vo(t){return Math.max(1,Math.ceil(t.length/4))}function _p(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function Kl(){return new Vl}var br,Gl,Vl,Yl=b(()=>{"use strict";br=new Map;Gl=class{name="ClaudeMock";async discoverSessions(){return[...br.values()].map(_p)}async loadSession(e){let r=br.get(e);return r===void 0?null:{..._p(r),messages:r.messages.slice()}}async resolveSessionPath(e){return br.get(e)?.filePath??null}async deleteSession(e){return br.delete(e)}},Vl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Gl;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=wI(yI(e,r)),s=`mock-${n}-${gI(`${e}:${n}`)}`,o=new Date,i=br.get(s),a=r?.prompt??"ClaudeMock seed",l=vo(a),c={sessionId:s,cwd:e,filePath:_I(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=vo("ACK: ClaudeMock seeded"),br.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=br.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${EI(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=vo(e),s.totalOutputTokens+=vo(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function _t(t){let e=[kl({claudeDir:t?.claudeDir}),xl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Rl({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Ll({copilotDir:t?.copilotDir}),Pl(),Wl(),Jl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Kl()),e}var zl=b(()=>{"use strict";vl();$l();Ol();Cl();Fl();Bl();Xl();Yl();vl();$l();Ol();Cl();Fl();Bl();Xl();Yl()});var tc={};ce(tc,{ProviderRegistry:()=>Dn,TransportConnectionError:()=>ye,TransportError:()=>Ye,TransportJsonError:()=>no,TransportProcessError:()=>xt,TransportRpcError:()=>$t,_resetDefaultRegistryForTests:()=>bI,chat:()=>Sr,countTokens:()=>ec,createAdapterRegistry:()=>ht,createAllAdapters:()=>_t,listSessions:()=>Ql,seed:()=>Zl});function xo(){return Io===null&&(Io=ht(_t())),Io}function bI(){Io=null}function wp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Sr(t){let e=t.registry??xo(),r=wp(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Zl(t){let e=t.registry??xo(),r=wp(e,t.provider),n=await gp(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await gp(e,t.provider,t.cwd),i=SI(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function gp(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function SI(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function Ql(t={}){return(t.registry??xo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function ec(t){let r=await(t.registry??xo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var Io,At=b(()=>{"use strict";ml();zl();ml();zl();Ur();Io=null});function TI(){return rc===null&&(rc=ht(_t())),rc}async function Xr(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await vI(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Jr.delete(r),e.setMemberState(r,"idle");else{let i=kI(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function kI(t,e){if(!(t instanceof Ee))return Jr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(Jr.get(e)??0)+1;return r>=3?(Jr.delete(e),"consecutive_timeouts"):(Jr.set(e,r),null)}return Jr.delete(e),null}async function vI(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=TI(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ee("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,nc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${yp(u)}`,nc(t.sessionid,t.sessiondir,"unresolved")))}let o=nc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Sr({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ee("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ee("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):II(u,o)}finally{a!==null&&clearTimeout(a)}}function nc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function yp(t){return t instanceof Error?t.message:String(t)}function II(t,e){if(t instanceof Ee)return t;if(t instanceof ye){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ee("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ee("enoent",null,t.message,e):new Ee("other",null,t.message,e)}return t instanceof xt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new Ee("other",null,t.message,e):new Ee("other",null,yp(t),e)}var Ee,rc,Jr,Jn=b(()=>{"use strict";At();Ee=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},rc=null;Jr=new Map});function Ep(){return sc===null&&(sc=ht(_t())),sc}function $I(t,e){if(!xI.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function Gr(t){let e=$I(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await jI({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function jI(t){let e=t.member.provider,r=t.member.sessiondir,n=oc("seed",r,e);try{let s=await Zl({provider:e,cwd:r,registry:Ep()});if(!s.success)throw AI(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:ic(s,n)}}async function bp(t){return NI(t)}async function NI(t){let e=Ep(),r=oc("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new ke("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof ke?o:ic(o,r)}let s=oc("tokens",t.sessionid,n);try{let o=await ec({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof ke?o:ic(o,s)}}function oc(t,e,r){return["<library>",t,e,"--provider",r]}function AI(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,e)}return new ke("other",null,r,e)}function ic(t,e){return t instanceof ke?t:t instanceof ye?t.cause?.code==="ENOENT"?new ke("enoent",null,t.message,e):new ke("other",null,t.message,e):t instanceof xt?new ke("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new ke("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new ke("other",null,t.message,e):new ke("other",null,t instanceof Error?t.message:String(t),e)}var ke,sc,xI,$o=b(()=>{"use strict";At();ke=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},sc=null;xI=/^provider[123]$/});function jo(t){return Buffer.from(t,"utf8").toString("base64url")}function Gn(t){return Buffer.from(t,"base64url").toString("utf8")}async function Sp(t,e=r=>bp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of RI(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function Tp(t,e,r){let n=kp(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Xn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Xr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:vp(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function ac(t,e,r){let n=kp(t,e,r);if(n===null)throw new Error("session member not found");let s=await Gr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:vp(t,e,r)}}function RI(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function kp(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function vp(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Xn,No=b(()=>{"use strict";Jn();$o();Xn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function lc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??LI(e),s=r-n,o=e.query(`
976
976
  SELECT
977
977
  isess.id AS interactive_session_id,
978
978
  isess.run_id,
@@ -998,16 +998,16 @@ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length
998
998
  JOIN step s ON s.id = isess.step_id
999
999
  WHERE isess.status = 'waiting_agent'
1000
1000
  AND r.terminal_state IS NULL
1001
- `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=DI(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=CI(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let u=c.alias.toLowerCase()!=="lead",d=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!u||!d||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:ve(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(i.hung_detected+=1,MI(e,a.run_id,a.step_id,c.sessionid)){i.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),i.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return i}function LI(t){return Ip(t.getConfig(No),OI)*1e3}function ac(t,e){return Ip(t.getConfig(Ao),e)}function Ip(t,e){if(t===null||t.trim().length===0)return e;let r=Number(t);return Number.isFinite(r)&&r>0?Math.floor(r):e}function CI(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function MI(t,e,r,n){return t.query(`SELECT * FROM attention
1001
+ `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=DI(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=CI(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let u=c.alias.toLowerCase()!=="lead",d=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!u||!d||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:ve(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(i.hung_detected+=1,MI(e,a.run_id,a.step_id,c.sessionid)){i.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),i.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return i}function LI(t){return Ip(t.getConfig(Ao),OI)*1e3}function cc(t,e){return Ip(t.getConfig(Ro),e)}function Ip(t,e){if(t===null||t.trim().length===0)return e;let r=Number(t);return Number.isFinite(r)&&r>0?Math.floor(r):e}function CI(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function MI(t,e,r,n){return t.query(`SELECT * FROM attention
1002
1002
  WHERE kind = 'session_hung'
1003
1003
  AND run_id = ?
1004
- AND acknowledged_at IS NULL`,e).some(o=>{let i=xp(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function DI(t,e,r){let n=xp(t);return n===null?null:PI(n,e,r)??FI(n,e,r)}function PI(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(UI),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let o=Tr(s.members)?s.members:null,i=o!==null&&Tr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function FI(t,e,r){if(!Tr(t.states))return null;let n=t.states[e]??t.states[r];if(!Tr(n))return null;let s=n;if(!Tr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function UI(t){return Tr(t)}function xp(t){if(t===null)return null;try{let e=JSON.parse(t);return Tr(e)?e:null}catch{return null}}function Tr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var No,Ao,OI,lc=b(()=>{"use strict";Pe();No="monitor.session_hung.elapsed_threshold_seconds",Ao="monitor.session_hung.check_interval_ms",OI=600});function Oo(t){let e=t.query(`
1004
+ AND acknowledged_at IS NULL`,e).some(o=>{let i=xp(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function DI(t,e,r){let n=xp(t);return n===null?null:PI(n,e,r)??FI(n,e,r)}function PI(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(UI),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let o=Tr(s.members)?s.members:null,i=o!==null&&Tr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function FI(t,e,r){if(!Tr(t.states))return null;let n=t.states[e]??t.states[r];if(!Tr(n))return null;let s=n;if(!Tr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function UI(t){return Tr(t)}function xp(t){if(t===null)return null;try{let e=JSON.parse(t);return Tr(e)?e:null}catch{return null}}function Tr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ao,Ro,OI,uc=b(()=>{"use strict";Pe();Ao="monitor.session_hung.elapsed_threshold_seconds",Ro="monitor.session_hung.check_interval_ms",OI=600});function Lo(t){let e=t.query(`
1005
1005
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1006
- `),r={queued:Ro(e,"queued"),running:Ro(e,"running"),done:Ro(e,"done"),failed:Ro(e,"failed"),total:uc(e)},n=t.query(`
1006
+ `),r={queued:Oo(e,"queued"),running:Oo(e,"running"),done:Oo(e,"done"),failed:Oo(e,"failed"),total:fc(e)},n=t.query(`
1007
1007
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
1008
1008
  `),s=t.query(`
1009
1009
  SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
1010
- `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(o=>o.terminal_state===null).reduce((o,i)=>o+i.count,0),terminal:n.filter(o=>o.terminal_state!==null).reduce((o,i)=>o+i.count,0),total:uc(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:uc(s)},projects:cc(t,"project"),teams:cc(t,"team"),workflows:cc(t,"workflow")}}function Lo(t){return t.listProjects()}function Np(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function Co(t){return t.query(`
1010
+ `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(o=>o.terminal_state===null).reduce((o,i)=>o+i.count,0),terminal:n.filter(o=>o.terminal_state!==null).reduce((o,i)=>o+i.count,0),total:fc(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:fc(s)},projects:dc(t,"project"),teams:dc(t,"team"),workflows:dc(t,"workflow")}}function Co(t){return t.listProjects()}function Np(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function Mo(t){return t.query(`
1011
1011
  SELECT w.*
1012
1012
  FROM workflow w
1013
1013
  JOIN (
@@ -1016,7 +1016,7 @@ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length
1016
1016
  GROUP BY name
1017
1017
  ) latest ON latest.name = w.name AND latest.version = w.version
1018
1018
  ORDER BY w.name ASC
1019
- `)}function Ap(t,e={}){return e.status!==void 0?t.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",e.status):t.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function Rp(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function Op(t,e){return t.getSubmittedPr(e)}function Mo(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Vr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function kr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:Mo(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:WI(t,r.id)}}function WI(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Lp(t,r.id)}))}function dc(t,e,r){let n=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,r)[0];return n===void 0?null:{...n,artifacts:Lp(t,n.id)}}function Lp(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function vr(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function Cp(t,e,r){let n=dc(t,e,r);return n===null?null:(n.artifacts.find(o=>o.kind===`${n.state_name}_transcript`)??n.artifacts.find(o=>o.content!==null))?.content??null}function Mp(t,e={}){return e.type!==void 0?t.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",e.type):t.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function Dp(t,e={}){return e.unhandled===!0?t.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function Zt(t,e={}){return e.unacked===!0?t.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function Do(t,e={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return e.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),e.project!==void 0&&(n+=" AND p.name = ?",r.push(e.project)),e.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(e.since)),t.query(`${Pp}
1019
+ `)}function Ap(t,e={}){return e.status!==void 0?t.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",e.status):t.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function Rp(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function Op(t,e){return t.getSubmittedPr(e)}function Do(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Vr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function kr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:Do(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:WI(t,r.id)}}function WI(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Lp(t,r.id)}))}function mc(t,e,r){let n=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,r)[0];return n===void 0?null:{...n,artifacts:Lp(t,n.id)}}function Lp(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function vr(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function Cp(t,e,r){let n=mc(t,e,r);return n===null?null:(n.artifacts.find(o=>o.kind===`${n.state_name}_transcript`)??n.artifacts.find(o=>o.content!==null))?.content??null}function Mp(t,e={}){return e.type!==void 0?t.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",e.type):t.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function Dp(t,e={}){return e.unhandled===!0?t.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function Zt(t,e={}){return e.unacked===!0?t.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function Po(t,e={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return e.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),e.project!==void 0&&(n+=" AND p.name = ?",r.push(e.project)),e.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(e.since)),t.query(`${Pp}
1020
1020
  WHERE ${n}
1021
1021
  ORDER BY a.created_at DESC`,...r).map(Fp)}function gt(t,e){let n=t.query(`${Pp}
1022
1022
  WHERE a.id = ?`,e)[0];return n===void 0?null:Fp(n)}function Fp(t){let{payload_json:e,...r}=t,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(e==null)return n;let s;try{s=JSON.parse(e)}catch{return n}if(s===null||typeof s!="object")return n;let o=s;if(Array.isArray(o.node_path)&&o.node_path.every(i=>typeof i=="string")&&(n.node_path=o.node_path),o.expected_response!==null&&typeof o.expected_response=="object"){let i=o.expected_response;if(typeof i.kind=="string"){let a=Array.isArray(i.choices)&&i.choices.every(l=>typeof l=="string")?i.choices:null;n.expected_response={kind:i.kind,choices:a}}}if(Array.isArray(o.transcript_tail)&&o.transcript_tail.every(i=>typeof i=="string")&&(n.transcript_tail=o.transcript_tail),typeof o.paused_at=="string"&&(n.paused_at=o.paused_at),o.created_run_inputs!==null&&typeof o.created_run_inputs=="object"&&!Array.isArray(o.created_run_inputs)&&(n.created_run_inputs=o.created_run_inputs),typeof o.workflow_version_id=="number"?n.workflow_version_id=o.workflow_version_id:o.workflow_version_id===null&&(n.workflow_version_id=null),o.step!==null&&typeof o.step=="object"&&!Array.isArray(o.step)){let i=o.step;typeof i.id=="string"&&i.id.length>0&&(n.workflow_step={id:i.id,name:typeof i.name=="string"?i.name:null,type:typeof i.type=="string"?i.type:null})}return typeof o.tier=="string"&&(n.escalation_tier=o.tier),typeof o.token=="string"&&(n.escalation_token=o.token),typeof o.reason=="string"&&(n.escalation_reason=o.reason),Array.isArray(o.declared_outcomes)&&o.declared_outcomes.every(i=>typeof i=="string")&&(n.declared_outcomes=o.declared_outcomes),typeof o.agent_output=="string"&&(n.agent_output=o.agent_output),n}function Up(t){return t.query(`
@@ -1025,7 +1025,7 @@ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length
1025
1025
  JOIN workflow w ON w.id = r.workflow_id
1026
1026
  GROUP BY w.name, r.terminal_state
1027
1027
  ORDER BY w.name ASC, r.terminal_state ASC
1028
- `)}function cc(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function Ro(t,e){return t.find(r=>r.status===e)?.count??0}function uc(t){return t.reduce((e,r)=>e+r.count,0)}function fc(t,e,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[e];n!==null&&s.push(n);let o=t.query(`SELECT s.state_name, s.outcome
1028
+ `)}function dc(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function Oo(t,e){return t.find(r=>r.status===e)?.count??0}function fc(t){return t.reduce((e,r)=>e+r.count,0)}function pc(t,e,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[e];n!==null&&s.push(n);let o=t.query(`SELECT s.state_name, s.outcome
1029
1029
  FROM step s
1030
1030
  JOIN run r ON r.id = s.run_id
1031
1031
  JOIN job j ON j.id = r.job_id
@@ -1042,14 +1042,14 @@ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length
1042
1042
  JOIN job j ON j.id = r.job_id
1043
1043
  WHERE j.project_id = ? AND s.ended_at IS NULL
1044
1044
  ${n!==null?"AND r.started_at >= ?":""}
1045
- GROUP BY s.state_name`,...f),p=new Map;for(let E of d){let v=p.get(E.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},x=E.duration_ms;x<3e5?v.lt5++:x<9e5?v.btw5_15++:x<36e5?v.btw15_60++:v.gt60++,p.set(E.state_name,v)}for(let E of m){let v=p.get(E.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};v.noEnd+=E.cnt,p.set(E.state_name,v)}let h=[...p.entries()].map(([E,v])=>({state_name:E,lt_5min:v.lt5,btw_5_15min:v.btw5_15,btw_15_60min:v.btw15_60,gt_60min:v.gt60,no_end:v.noEnd})),g=t.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
1045
+ GROUP BY s.state_name`,...f),p=new Map;for(let E of d){let v=p.get(E.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},I=E.duration_ms;I<3e5?v.lt5++:I<9e5?v.btw5_15++:I<36e5?v.btw15_60++:v.gt60++,p.set(E.state_name,v)}for(let E of m){let v=p.get(E.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};v.noEnd+=E.cnt,p.set(E.state_name,v)}let h=[...p.entries()].map(([E,v])=>({state_name:E,lt_5min:v.lt5,btw_5_15min:v.btw5_15,btw_15_60min:v.btw15_60,gt_60min:v.gt60,no_end:v.noEnd})),g=t.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
1046
1046
  FROM step s
1047
1047
  JOIN run r ON r.id = s.run_id
1048
1048
  JOIN job j ON j.id = r.job_id
1049
1049
  WHERE j.project_id = ?
1050
1050
  ${n!==null?"AND r.started_at >= ?":""}
1051
1051
  GROUP BY s.run_id, s.state_name
1052
- HAVING COUNT(*) > 1`,...s),_=new Map;for(let E of g){let v=_.get(E.state_name)??{runs:0,total_attempts:0};v.runs++,v.total_attempts+=E.attempt_count,_.set(E.state_name,v)}let T=[..._.entries()].map(([E,v])=>({state_name:E,retried_runs:v.runs,avg_retries:v.runs>0?Number((v.total_attempts/v.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:h,retry_counts:T}}function mc(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1052
+ HAVING COUNT(*) > 1`,...s),_=new Map;for(let E of g){let v=_.get(E.state_name)??{runs:0,total_attempts:0};v.runs++,v.total_attempts+=E.attempt_count,_.set(E.state_name,v)}let T=[..._.entries()].map(([E,v])=>({state_name:E,retried_runs:v.runs,avg_retries:v.runs>0?Number((v.total_attempts/v.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:h,retry_counts:T}}function hc(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1053
1053
  FROM session_event se
1054
1054
  JOIN run r ON r.id = se.run_id
1055
1055
  JOIN job j ON j.id = r.job_id
@@ -1092,19 +1092,19 @@ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length
1092
1092
  json_extract(payload, '$.elapsedMs') ASC`,r),i=new Map;for(let l of o){let c=i.get(l.tool_name)??[];c.push(l.elapsed_ms),i.set(l.tool_name,c)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return n.map(l=>{let c=a.get(l.tool_name)??0,u=i.get(l.tool_name)??[],d=u.length>0?u.reduce((p,h)=>p+h,0)/u.length:null,f=u.length>0?u[Math.floor(u.length*.5)]??null:null,m=u.length>0?u[Math.floor(u.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:c,hit_rate_pct:l.cnt>0?`${(c/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:d!==null?Math.round(d):null,p50_latency_ms:f,p95_latency_ms:m}})}function Wp(t){try{let e=JSON.parse(t);if(e.schema_version==="lmctl/v3"&&Array.isArray(e.steps)){let r=[],n=new Map,s=new Map;for(let o of e.steps){let i=typeof o.id=="string"?o.id:null;i!==null&&(r.push(i),typeof o.type=="string"&&s.set(i,o.type),typeof o.name=="string"&&o.name.length>0&&n.set(o.name,i))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(e.states!==null&&typeof e.states=="object"){let r=e.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let u=c.type;typeof u=="string"&&n.set(l,u)}let s=typeof e.start_at=="string"?e.start_at:null,o=Object.keys(r),i=s!==null&&o.includes(s)?[s,...o.filter(l=>l!==s)]:o,a=e.terminals!==null&&typeof e.terminals=="object"?Object.keys(e.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...i,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function Kr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(r===void 0)return null;let n=t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=t.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:t.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),o=n!==null?Wp(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},i=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=g=>o.schema==="v3"&&o.nameToId.has(g)?o.nameToId.get(g):g,l=new Map;for(let g of i)l.set(a(g.state_name),g);let c=t.query(`SELECT state_name, status, last_agent_output
1093
1093
  FROM interactive_session
1094
1094
  WHERE run_id = ? AND status = 'waiting_operator'
1095
- ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,T=l.get(g),E="pending",v=null;if(g.startsWith("@terminal:"))E=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?E=_&&u===g?"paused":"running":T.outcome===null?E="failed":E="done",T.ended_at!==null)){let x=Date.parse(T.started_at),k=Date.parse(T.ended_at);!Number.isNaN(x)&&!Number.isNaN(k)&&(v=k-x)}_&&u===g&&(E="paused"),h.push({id:g,status:E,is_current:_,elapsed_ms:v,prompt:_&&E==="paused"?f:null,expected:_&&E==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function Po(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...BI(o));return`${e.join(`
1095
+ ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,T=l.get(g),E="pending",v=null;if(g.startsWith("@terminal:"))E=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?E=_&&u===g?"paused":"running":T.outcome===null?E="failed":E="done",T.ended_at!==null)){let I=Date.parse(T.started_at),k=Date.parse(T.ended_at);!Number.isNaN(I)&&!Number.isNaN(k)&&(v=k-I)}_&&u===g&&(E="paused"),h.push({id:g,status:E,is_current:_,elapsed_ms:v,prompt:_&&E==="paused"?f:null,expected:_&&E==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function Fo(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...BI(o));return`${e.join(`
1096
1096
  `)}
1097
- `}function BI(t){let e=[],r=qI(t.status),n=[];t.status==="done"&&t.elapsed_ms!==null?n.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?n.push("failed"):t.status==="paused"?n.push("paused, waiting for operator input"):t.status==="running"?n.push("running"):t.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",o=t.is_current?" <- CURRENT":"",i=t.id.padEnd(28);if(e.push(` ${r} ${i} ${s}${o}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function qI(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Fo(t,e,r={}){let n=r.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let o=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,i=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=o!==null?Wp(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=x=>c.schema==="v3"&&c.nameToId.has(x)?c.nameToId.get(x):x,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let x of d)f.set(u(x.state_name),x);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let x of m)p.set(u(x.state_name),x);let h=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let x of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1097
+ `}function BI(t){let e=[],r=qI(t.status),n=[];t.status==="done"&&t.elapsed_ms!==null?n.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?n.push("failed"):t.status==="paused"?n.push("paused, waiting for operator input"):t.status==="running"?n.push("running"):t.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",o=t.is_current?" <- CURRENT":"",i=t.id.padEnd(28);if(e.push(` ${r} ${i} ${s}${o}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function qI(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Uo(t,e,r={}){let n=r.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let o=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,i=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=o!==null?Wp(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=I=>c.schema==="v3"&&c.nameToId.has(I)?c.nameToId.get(I):I,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let I of d)f.set(u(I.state_name),I);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let I of m)p.set(u(I.state_name),I);let h=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let I of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1098
1098
  FROM session_event
1099
1099
  WHERE run_id = ? AND step_id IS NOT NULL
1100
- GROUP BY step_id`,e))x.step_id!==null&&h.set(x.step_id,x.timestamp_ms);let _=HI(c,d,u),T=JI(s.current_state),E=t.query(`SELECT kind, severity, payload
1100
+ GROUP BY step_id`,e))I.step_id!==null&&h.set(I.step_id,I.timestamp_ms);let _=HI(c,d,u),T=JI(s.current_state),E=t.query(`SELECT kind, severity, payload
1101
1101
  FROM attention
1102
1102
  WHERE run_id = ?
1103
1103
  AND kind = 'session_hung'
1104
1104
  AND acknowledged_at IS NULL
1105
- ORDER BY id ASC`,e).map(x=>({kind:x.kind,severity:x.severity,payload:ZI(x.payload)})),v=_.map(x=>{let k=f.get(x),R=p.get(x),C=XI(s,x,T,k,R),q=k===void 0?null:Date.parse(k.started_at),te=k?.ended_at===null||k===void 0?null:Date.parse(k.ended_at),j=k===void 0||Number.isNaN(q??NaN)?null:te!==null&&!Number.isNaN(te)?te-q:C==="running"||C==="paused"?n-q:null,H=k===void 0?null:h.get(k.id)??null,me=QI(R?.last_activity_at??null,H,g),I=o===null||R===void 0?void 0:KI(t,s.team_id,o.definition,R.state_name,k?.state_name??x);return{step_id:k?.id??null,state_id:x,status:C,started_at:k?.started_at??null,ended_at:k?.ended_at??null,last_activity_at:me,elapsed_ms:j,...I!==void 0?{member:I}:{},...R!==void 0?{interactive_session:{id:R.id,status:R.status,turn_count:R.turn_count,state_name:R.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:VI(s,a,v),submitted_at:a?.enqueued_at??s.started_at,nodes:v,current_node_index:GI(v,s.terminal_state!==null),related_attentions:E}}function Uo(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${jp(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${$p(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":$p(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${Wo(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${jp(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${ex(a.payload)}`)}return`${n.join(`
1105
+ ORDER BY id ASC`,e).map(I=>({kind:I.kind,severity:I.severity,payload:ZI(I.payload)})),v=_.map(I=>{let k=f.get(I),P=p.get(I),q=XI(s,I,T,k,P),O=k===void 0?null:Date.parse(k.started_at),G=k?.ended_at===null||k===void 0?null:Date.parse(k.ended_at),A=k===void 0||Number.isNaN(O??NaN)?null:G!==null&&!Number.isNaN(G)?G-O:q==="running"||q==="paused"?n-O:null,F=k===void 0?null:h.get(k.id)??null,z=QI(P?.last_activity_at??null,F,g),x=o===null||P===void 0?void 0:KI(t,s.team_id,o.definition,P.state_name,k?.state_name??I);return{step_id:k?.id??null,state_id:I,status:q,started_at:k?.started_at??null,ended_at:k?.ended_at??null,last_activity_at:z,elapsed_ms:A,...x!==void 0?{member:x}:{},...P!==void 0?{interactive_session:{id:P.id,status:P.status,turn_count:P.turn_count,state_name:P.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:VI(s,a,v),submitted_at:a?.enqueued_at??s.started_at,nodes:v,current_node_index:GI(v,s.terminal_state!==null),related_attentions:E}}function Wo(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${jp(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${$p(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":$p(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${Bo(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${jp(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${ex(a.payload)}`)}return`${n.join(`
1106
1106
  `)}
1107
- `}function HI(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function JI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function XI(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function GI(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function VI(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function KI(t,e,r,n,s){let o=YI(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:ve(i)}}function YI(t,e,r){let n=zI(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>zt(a)?a.id===e||a.name===e||a.name===r:!1),o=zt(s?.members)?s.members:null,i=o!==null&&zt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(zt(n.states)){let s=n.states[e]??n.states[r];if(!zt(s))return null;let o=zt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function zI(t){try{let e=JSON.parse(t);return zt(e)?e:null}catch{return null}}function ZI(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function zt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function QI(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function $p(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Wo(Math.max(0,n-r)).padEnd(6)}]`}function jp(t,e){return Number.isNaN(t)?"?":Wo(Math.max(0,e-t))}function Wo(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function ex(t){if(!zt(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${Wo(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Pp,Rt=b(()=>{"use strict";Pe();Pp=`SELECT a.id AS attention_id,
1107
+ `}function HI(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function JI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function XI(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function GI(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function VI(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function KI(t,e,r,n,s){let o=YI(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:ve(i)}}function YI(t,e,r){let n=zI(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>zt(a)?a.id===e||a.name===e||a.name===r:!1),o=zt(s?.members)?s.members:null,i=o!==null&&zt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(zt(n.states)){let s=n.states[e]??n.states[r];if(!zt(s))return null;let o=zt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function zI(t){try{let e=JSON.parse(t);return zt(e)?e:null}catch{return null}}function ZI(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function zt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function QI(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function $p(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Bo(Math.max(0,n-r)).padEnd(6)}]`}function jp(t,e){return Number.isNaN(t)?"?":Bo(Math.max(0,e-t))}function Bo(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function ex(t){if(!zt(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${Bo(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Pp,Rt=b(()=>{"use strict";Pe();Pp=`SELECT a.id AS attention_id,
1108
1108
  a.kind AS kind,
1109
1109
  a.severity AS severity,
1110
1110
  a.created_at AS created_at,
@@ -1126,10 +1126,10 @@ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length
1126
1126
  ON isess.run_id = a.run_id
1127
1127
  AND isess.id = (
1128
1128
  SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
1129
- )`});var nh={};le(nh,{parseApiArgs:()=>Xp,readApiClientConfig:()=>Kn,runApi:()=>ix});import{readFileSync as tx}from"node:fs";import{basename as rx,extname as nx}from"node:path";async function ix(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ox),0;if(t[0]==="config")return lx(t.slice(1),e);let r=th(t,"--direct");if(r.rest[0]==="escalations")return cx(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Ho(r.rest.slice(2)))return e.stdout.write(`${mx}
1129
+ )`});var nh={};ce(nh,{parseApiArgs:()=>Xp,readApiClientConfig:()=>Kn,runApi:()=>ix});import{readFileSync as tx}from"node:fs";import{basename as rx,extname as nx}from"node:path";async function ix(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ox),0;if(t[0]==="config")return lx(t.slice(1),e);let r=th(t,"--direct");if(r.rest[0]==="escalations")return cx(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Jo(r.rest.slice(2)))return e.stdout.write(`${mx}
1130
1130
  `),0;if(r.rest[0]==="workflows"&&r.rest[1]==="verify")return r.present?(e.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
1131
- `),2):a$(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Ho(r.rest.slice(2)))return e.stdout.write(`${dx}
1132
- `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Ho(r.rest.slice(2)))return e.stdout.write(`${fx}
1131
+ `),2):a$(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Jo(r.rest.slice(2)))return e.stdout.write(`${dx}
1132
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Jo(r.rest.slice(2)))return e.stdout.write(`${fx}
1133
1133
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?n$(r.rest.slice(2),e):s$(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?o$(r.rest.slice(2),e):i$(r.rest.slice(2),e);if(r.present)return Bx(r.rest,e);let n=Xp(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1134
1134
  `),2;let s=Ir(e),o=s.baseUrl,i=Qt(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=bx(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1135
1135
  `),2}else n.body!==void 0&&n.contentType!==void 0?i["Content-Type"]=n.contentType:n.body!==void 0&&(i["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,o),{method:n.method,headers:i,body:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
@@ -1141,24 +1141,24 @@ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length
1141
1141
  `):e.stdout.write(`${JSON.stringify(f)}
1142
1142
  `)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1143
1143
  `):(e.stdout.write(await l.text()),e.stdout.write(`
1144
- `));return 0}function Xp(t){let e=Kp(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?qo(o,"/api/status",n):s==="projects"?qo(o,"/api/projects",n):s==="teams"?qo(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?Ax(o.slice(1),e.format):qo(o,"/api/workflows",n):s==="workflow"?Nx(o,n):s==="upload"?$x(o,n):s==="submit-job"?jx(o,n):s==="issues"?xx(o,n):s==="jobs"?Vn(o,"--status","/api/jobs","status",n):s==="job"?Ix(o,n):s==="project"?Rx(o,n):s==="artifact"?Cx(o,n):s==="runs"?Vn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Vn(o,"--type","/api/external-objects","type",n):s==="external-signals"?qp(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?Mx(o,n):qp(o,"--unacked","/api/attentions","unacked",n):s==="stats"?Dx(o,n):s==="daemon"?Px(o,n):s==="intake"?Fx(o,n):s==="session"?Ux(o,n):s==="run"?Wx(o,e.format):s==="prs"?Vn(o,"--status","/api/submitted-prs","status",n):s==="pr"?kx(o,n):`unknown subcommand: ${s}`}function Qt(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function Ir(t){if(t.dal!==void 0)return Kn(t.dal,process.env,t);let e=pe({path:ce()});try{return Kn(e,process.env,t)}finally{e.close()}}function Kn(t,e,r){let n=[],s=t.getConfig("api.url"),o;s!==null?o=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(o=e.LMCTL_API_URL,n.push("api.url")):o=sx;let i=t.getConfig("api.token"),a;i!==null?a=i:e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${ax(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1144
+ `));return 0}function Xp(t){let e=Kp(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Ho(o,"/api/status",n):s==="projects"?Ho(o,"/api/projects",n):s==="teams"?Ho(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?Ax(o.slice(1),e.format):Ho(o,"/api/workflows",n):s==="workflow"?Nx(o,n):s==="upload"?$x(o,n):s==="submit-job"?jx(o,n):s==="issues"?xx(o,n):s==="jobs"?Vn(o,"--status","/api/jobs","status",n):s==="job"?Ix(o,n):s==="project"?Rx(o,n):s==="artifact"?Cx(o,n):s==="runs"?Vn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Vn(o,"--type","/api/external-objects","type",n):s==="external-signals"?qp(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?Mx(o,n):qp(o,"--unacked","/api/attentions","unacked",n):s==="stats"?Dx(o,n):s==="daemon"?Px(o,n):s==="intake"?Fx(o,n):s==="session"?Ux(o,n):s==="run"?Wx(o,e.format):s==="prs"?Vn(o,"--status","/api/submitted-prs","status",n):s==="pr"?kx(o,n):`unknown subcommand: ${s}`}function Qt(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function Ir(t){if(t.dal!==void 0)return Kn(t.dal,process.env,t);let e=pe({path:ue()});try{return Kn(e,process.env,t)}finally{e.close()}}function Kn(t,e,r){let n=[],s=t.getConfig("api.url"),o;s!==null?o=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(o=e.LMCTL_API_URL,n.push("api.url")):o=sx;let i=t.getConfig("api.token"),a;i!==null?a=i:e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${ax(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1145
1145
  `);return{baseUrl:o,token:a}}function ax(t){switch(t){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${t.replaceAll(".","_").toUpperCase()}`}}async function lx(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1146
- `),2;let s=e.dal===void 0,o=e.dal??pe({path:ce()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
1147
- `),2;let i=n[0];if(!Bo.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Bo].join(", ")})
1146
+ `),2;let s=e.dal===void 0,o=e.dal??pe({path:ue()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
1147
+ `),2;let i=n[0];if(!qo.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...qo].join(", ")})
1148
1148
  `),2;let a=o.getConfig(i);return a===null?(e.stderr.write(`error: ${i} is not set
1149
1149
  `),1):(e.stdout.write(`${a}
1150
1150
  `),0)}if(r==="set"){if(n.length!==2)return e.stderr.write(`usage: lmctl api config set <key> <value>
1151
- `),2;let[i,a]=n;if(!Bo.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Bo].join(", ")})
1151
+ `),2;let[i,a]=n;if(!qo.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...qo].join(", ")})
1152
1152
  `),2;let l=Ex(i,a);return l!==null?(e.stderr.write(`error: ${l}
1153
1153
  `),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${Bp(i,a,!1)}
1154
1154
  `),0)}if(r==="list"){let i=!1;for(let c of n){if(c==="--show-secrets"){i=!0;continue}return e.stderr.write(`error: unknown flag: ${c}
1155
1155
  `),2}let a=o.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return e.stdout.write(`(no config rows)
1156
1156
  `),0;for(let c of l)e.stdout.write(`${c} = ${Bp(c,a[c],i)}
1157
1157
  `);return 0}return e.stderr.write(`error: unknown api config verb: ${r}
1158
- `),2}finally{s&&o.close()}}async function cx(t,e,r){if(Ho(t))return e.stdout.write(`${ux}
1158
+ `),2}finally{s&&o.close()}}async function cx(t,e,r){if(Jo(t))return e.stdout.write(`${ux}
1159
1159
  `),0;let n=th(t,"--direct"),s=r||n.present,o=n.rest,[i,...a]=o;return i===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
1160
1160
  `),2):s?px(i,a,e):i==="list"?_x(a,e):i==="show"?wx(a,e):i==="respond"?yx(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
1161
- `),2)}function Ho(t){return t.some(e=>e==="--help"||e==="-h")}function px(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:ce()});try{return rh(s,[t,...e],r)}finally{n&&s.close()}}function Gp(t){let e,r=!1,n=!1,s;for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=hx(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return re(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function hx(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],o=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let r=Date.parse(t);return Number.isNaN(r)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function _x(t,e){let r=Gp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1161
+ `),2)}function Jo(t){return t.some(e=>e==="--help"||e==="-h")}function px(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:ue()});try{return rh(s,[t,...e],r)}finally{n&&s.close()}}function Gp(t){let e,r=!1,n=!1,s;for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=hx(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return ne(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function hx(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],o=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let r=Date.parse(t);return Number.isNaN(r)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function _x(t,e){let r=Gp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1162
1162
  `),2;let n=Ir(e),s=Qt("application/json",n.token),o=new URLSearchParams;r.project!==void 0&&o.set("project",r.project),r.all&&o.set("all","true"),r.since!==void 0&&o.set("since",r.since);let i=o.toString().length>0?`?${o.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${i}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1163
1163
  `),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1164
1164
  `),a.status===400?2:1;let l=await a.json();return Vp(l,r.json,e)}function Vp(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
@@ -1172,21 +1172,21 @@ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length
1172
1172
  `)}r.stdout.write(` Respond: lmctl api escalations respond ${n.attention_id} "<answer>" [--done to end chat]
1173
1173
  `),r.stdout.write(`
1174
1174
  `)}return 0}function gx(t){let e=Date.parse(t);if(Number.isNaN(e))return"recently";let r=Math.max(0,Math.round((Date.now()-e)/1e3));if(r<60)return`${r}s ago`;let n=Math.round(r/60);if(n<60)return`${n}m ago`;let s=Math.round(n/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function wx(t,e){let r=t.filter(a=>a!=="--json"&&a!=="--text");if(r.length!==1)return e.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
1175
- `),2;let n=ne(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
1175
+ `),2;let n=se(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
1176
1176
  `),2;let s=Ir(e),o=Qt("application/json",s.token),i;try{i=await fetch(new URL(`/api/escalations/${n}`,s.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1177
1177
  `),1}return i.status===404?(e.stderr.write(`error: escalation not found: ${n}
1178
1178
  `),1):i.ok?(e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1179
1179
  `),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1180
1180
  `),i.status===400?2:1)}async function yx(t,e){let r=!1,n=!1,s=[];for(let f=0;f<t.length;f+=1){let m=t[f];if(m==="--json"){r=!0;continue}if(m==="--done"){n=!0;continue}s.push(m)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
1181
- `),2;let o=ne(s[0],"attention_id");if(typeof o=="string")return e.stderr.write(`error: ${o}
1181
+ `),2;let o=se(s[0],"attention_id");if(typeof o=="string")return e.stderr.write(`error: ${o}
1182
1182
  `),2;let i=s[1],a=Ir(e),l=Qt("application/json",a.token);l["Content-Type"]="application/json";let c={input:i};n&&(c.done=!0);let u;try{u=await fetch(new URL(`/api/escalations/${o}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(c)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
1183
1183
  `),1}if(u.status===404)return e.stderr.write(`error: escalation not found: ${o}
1184
1184
  `),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
1185
1185
  `),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
1186
1186
  `):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
1187
- `),0}function Bp(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function Ex(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let r=Number(e);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===No||t===Ao){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function bx(t,e){let r=tx(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Sx(t)}),rx(t)),e!==void 0&&s.append("project",e),s}function Sx(t){switch(nx(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function Tx(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t.id;return typeof e=="number"&&Number.isInteger(e)?e:null}return null}function kx(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Vn(n,"--status","/api/submitted-prs","status",e);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:e}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:e}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function Kp(t){let e=[],r="json";for(let n of t)n==="--json"?r="json":n==="--text"?r="text":e.push(n);return{args:e,format:r}}function qo(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Vn(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function qp(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return re(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function vx(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function Ix(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return vx([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;o=p}else if(f==="--source")i=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return re(f)}if(s===void 0&&o===void 0)return"usage: lmctl api job enqueue --project NAME [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=pc(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function xx(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return re(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?Yp(n,e):r==="claim"?zp(n,e):r==="claim-next"?Zp(n,e):r==="close"?Qp(n,e):r==="reopen"?eh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Yp(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")o.title=l;else if(a==="--body")o.body=l;else if(a==="--severity")o.severity=l;else if(a==="--labels")o.labels=pc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function zp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=ne(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return re(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Zp(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(i)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function Qp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function eh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function $x(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return re(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function jx(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function pc(t){try{return JSON.parse(t)}catch{return t}}function Nx(t,e){let[r,n]=t;return r!=="show"||n===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function Ax(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function Rx(t,e){let[r,n,...s]=t;return r==="workflow"?Ox([n,...s].filter(o=>o!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function Ox(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=ne(n[0],"id");if(typeof s=="string")return s;let o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=Lx(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:e,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function Lx(t){let[e,r,...n]=t;if(e===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--condition")s.condition=a;else if(i==="--params")s.params=pc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(i)}return{project:e,body:s}}function Cx(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function Mx(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function Dx(t,e){return t.length!==1||t[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:e?"application/json":"text/html",json:e}}function Px(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:t[0]==="cycle"?"POST":"GET",path:t[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:e?"application/json":"text/html",json:e}}function Fx(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:t[0]==="scan"?"POST":"GET",path:t[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:e?"application/json":"text/html",json:e}}function Ux(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=$o(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function Wx(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=ne(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=ne(n,"run_id");if(typeof i=="string")return i;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return re(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function re(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function th(t,e){let r=[],n=!1;for(let s of t){if(s===e){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function Bx(t,e){let r=Kp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1187
+ `),0}function Bp(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function Ex(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let r=Number(e);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===Ao||t===Ro){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function bx(t,e){let r=tx(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Sx(t)}),rx(t)),e!==void 0&&s.append("project",e),s}function Sx(t){switch(nx(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function Tx(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t.id;return typeof e=="number"&&Number.isInteger(e)?e:null}return null}function kx(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Vn(n,"--status","/api/submitted-prs","status",e);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:e}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:e}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function Kp(t){let e=[],r="json";for(let n of t)n==="--json"?r="json":n==="--text"?r="text":e.push(n);return{args:e,format:r}}function Ho(t,e,r){return t.length>0?ne(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Vn(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function qp(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return ne(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function vx(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=se(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function Ix(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return vx([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;o=p}else if(f==="--source")i=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return ne(f)}if(s===void 0&&o===void 0)return"usage: lmctl api job enqueue --project NAME [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=_c(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function xx(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return ne(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?Yp(n,e):r==="claim"?zp(n,e):r==="claim-next"?Zp(n,e):r==="close"?Qp(n,e):r==="reopen"?eh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Yp(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")o.title=l;else if(a==="--body")o.body=l;else if(a==="--severity")o.severity=l;else if(a==="--labels")o.labels=_c(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function zp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=se(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return ne(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Zp(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(i)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function Qp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=se(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function eh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function $x(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return ne(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function jx(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return ne(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function _c(t){try{return JSON.parse(t)}catch{return t}}function Nx(t,e){let[r,n]=t;return r!=="show"||n===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function Ax(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ne(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function Rx(t,e){let[r,n,...s]=t;return r==="workflow"?Ox([n,...s].filter(o=>o!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function Ox(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=se(n[0],"id");if(typeof s=="string")return s;let o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=Lx(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:e,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function Lx(t){let[e,r,...n]=t;if(e===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--condition")s.condition=a;else if(i==="--params")s.params=_c(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(i)}return{project:e,body:s}}function Cx(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=se(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return ne(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function Mx(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=se(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function Dx(t,e){return t.length!==1||t[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:e?"application/json":"text/html",json:e}}function Px(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:t[0]==="cycle"?"POST":"GET",path:t[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:e?"application/json":"text/html",json:e}}function Fx(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:t[0]==="scan"?"POST":"GET",path:t[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:e?"application/json":"text/html",json:e}}function Ux(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=jo(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function Wx(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=se(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=se(n,"run_id");if(typeof i=="string")return i;let a=se(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return ne(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function se(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ne(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function th(t,e){let r=[],n=!1;for(let s of t){if(s===e){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function Bx(t,e){let r=Kp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1188
1188
  `),2;let n=r.args,s=r.format!=="text",[o,...i]=n;if(o===void 0)return e.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1189
- `),2;let a=e.dal===void 0,l=e.dal??pe({path:ce()});try{if(o==="issues"){let[c,...u]=i;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1189
+ `),2;let a=e.dal===void 0,l=e.dal??pe({path:ue()});try{if(o==="issues"){let[c,...u]=i;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1190
1190
  `),2):c==="create"?qx(l,u,e,s):c==="claim"?Hx(l,u,e,s):c==="claim-next"?Jx(l,u,e,s):c==="close"?Xx(l,u,e,s):c==="reopen"?Gx(l,u,e,s):c==="list"?zx(l,u,e,s):c==="show"?Zx(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1191
1191
  `),2)}return o==="status"?Qx(l,i,e,s):o==="projects"?e$(l,i,e,s):o==="workflows"?t$(l,i,e,s):o==="runs"?r$(l,i,e,s):o==="attentions"||o==="attention"?l$(l,i,e,s):o==="escalations"?rh(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1192
1192
  `),2)}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
@@ -1210,56 +1210,56 @@ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length
1210
1210
  `),2;let i,a,l;for(let d=0;d<o.length;d+=1){let f=o[d],m=o[++d];if(m===void 0||m.startsWith("--"))return r.stderr.write(`error: missing value for ${f}
1211
1211
  `),2;if(f==="--status"){let p=Hp(m,Yx);if(typeof p=="string")return r.stderr.write(`error: ${p}
1212
1212
  `),2;i=p}else if(f==="--severity"){let p=Hp(m,Jp);if(typeof p=="string")return r.stderr.write(`error: ${p}
1213
- `),2;a=p}else if(f==="--ai-test-path")l=m;else return r.stderr.write(`error: ${re(f)}
1213
+ `),2;a=p}else if(f==="--ai-test-path")l=m;else return r.stderr.write(`error: ${ne(f)}
1214
1214
  `),2}let c=t.findProjectByName(s);if(c===null)return r.stderr.write(`error: project not found: ${s}
1215
1215
  `),1;let u=t.listIssues(c.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Je(r,u,n),0}function Zx(t,e,r,n){if(e.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
1216
- `),2;let s=ne(e[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
1216
+ `),2;let s=se(e[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
1217
1217
  `),2;let o=t.getIssue(s);return o===null?(r.stderr.write(`error: issue not found: ${s}
1218
- `),1):(Je(r,o,n),0)}function Qx(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1219
- `),2):(Je(r,Oo(t),n),0)}function e$(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1220
- `),2):(Je(r,Lo(t),n),0)}function t$(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1221
- `),2):(Je(r,Co(t),n),0)}function r$(t,e,r,n){let s;for(let o=0;o<e.length;o+=1){let i=e[o],a=e[++o];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${i}
1218
+ `),1):(Je(r,o,n),0)}function Qx(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
1219
+ `),2):(Je(r,Lo(t),n),0)}function e$(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
1220
+ `),2):(Je(r,Co(t),n),0)}function t$(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
1221
+ `),2):(Je(r,Mo(t),n),0)}function r$(t,e,r,n){let s;for(let o=0;o<e.length;o+=1){let i=e[o],a=e[++o];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${i}
1222
1222
  `),2;if(i==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
1223
- `),2;s=Number(a)}else return r.stderr.write(`error: ${re(i)}
1223
+ `),2;s=Number(a)}else return r.stderr.write(`error: ${ne(i)}
1224
1224
  `),2}return Je(r,Vr(t,s!==void 0?{limit:s}:{}),n),0}function n$(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1225
1225
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1226
- `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${re(a)}
1227
- `),2}let o=e.dal===void 0,i=e.dal??pe({path:ce()});try{let a=Kr(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1226
+ `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${ne(a)}
1227
+ `),2}let o=e.dal===void 0,i=e.dal??pe({path:ue()});try{let a=Kr(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1228
1228
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1229
- `):e.stdout.write(Po(a)),0)}finally{o&&i.close()}}async function s$(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1229
+ `):e.stdout.write(Fo(a)),0)}finally{o&&i.close()}}async function s$(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1230
1230
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1231
- `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${re(c)}
1231
+ `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${ne(c)}
1232
1232
  `),2}let o=Ir(e),a=Qt(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1233
1233
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1234
1234
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1235
1235
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1236
1236
  `),l.status===404?1:l.status===400?2:1)}function o$(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
1237
1237
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1238
- `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${re(a)}
1239
- `),2}let o=e.dal===void 0,i=e.dal??pe({path:ce()});try{let a=Fo(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1238
+ `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${ne(a)}
1239
+ `),2}let o=e.dal===void 0,i=e.dal??pe({path:ue()});try{let a=Uo(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1240
1240
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1241
- `):e.stdout.write(Uo(a)),0)}finally{o&&i.close()}}async function i$(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1241
+ `):e.stdout.write(Wo(a)),0)}finally{o&&i.close()}}async function i$(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1242
1242
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1243
- `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${re(c)}
1243
+ `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${ne(c)}
1244
1244
  `),2}let o=Ir(e),a=Qt(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1245
1245
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1246
1246
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1247
1247
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1248
- `),l.status===404?1:l.status===400?2:1)}async function a$(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${re(a)}
1248
+ `),l.status===404?1:l.status===400?2:1)}async function a$(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${ne(a)}
1249
1249
  `),2}let n=Ir(e),o=Qt(r?"application/json":"text/plain",n.token),i;try{i=await fetch(new URL("/api/workflows/verify",n.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1250
1250
  `),2}return i.ok?(r?e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1251
1251
  `):(e.stdout.write(await i.text()),i.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1252
1252
  `)),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1253
- `),i.status===400?2:1)}function l$(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${re(o)}
1253
+ `),i.status===400?2:1)}function l$(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${ne(o)}
1254
1254
  `),2}return Je(r,Zt(t,{unacked:s}),n),0}function rh(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1255
1255
  `),2;if(n==="list"){let o=Gp(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
1256
- `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=Do(t,i);return Vp(a,o.json,r)}if(n==="show"){let o=s.filter(l=>l!=="--json"&&l!=="--text");if(o.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1257
- `),2;let i=ne(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1256
+ `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=Po(t,i);return Vp(a,o.json,r)}if(n==="show"){let o=s.filter(l=>l!=="--json"&&l!=="--text");if(o.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1257
+ `),2;let i=se(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1258
1258
  `),2;let a=gt(t,i);return a===null?(r.stderr.write(`error: escalation not found: ${i}
1259
1259
  `),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
1260
1260
  `),0)}return n==="respond"?c$(t,s,r):(r.stderr.write(`error: --direct escalations does not support: ${n} (supported: list, show, respond)
1261
1261
  `),2)}function c$(t,e,r){let n=!1,s=!1,o=[];for(let m of e){if(m==="--json"){n=!0;continue}if(m==="--done"){s=!0;continue}o.push(m)}if(o.length!==2)return r.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
1262
- `),2;let i=ne(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1262
+ `),2;let i=se(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1263
1263
  `),2;let a=o[1],l=gt(t,i);if(l===null)return r.stderr.write(`error: escalation not found: ${i}
1264
1264
  `),1;let c=Zt(t).find(m=>m.id===i);if(c===void 0)return r.stderr.write(`error: escalation not found: ${i}
1265
1265
  `),1;if(c.kind==="workflow_escalation"){let m=t.resumeEscalation(i,a);if(!m.resumed)return r.stderr.write(`error: escalation resume failed: ${m.reason} (attention=${i})
@@ -1271,12 +1271,12 @@ ${r}`:r}function E0(t){let e=[...t.matchAll(h0)];if(e.length>0){let r=e[e.length
1271
1271
  `),2;let u=t.resumeInteractive(l.step_id,a,s);if(!u.resumed)return r.stderr.write(`error: interactive respond failed: ${u.reason} (step_id=${l.step_id})
1272
1272
  `),2;let d=t.acknowledgeAttention(i),f={ok:!0,attention_id:i,step_id:l.step_id,session_status:u.session.status,acknowledged_at:d?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
1273
1273
  `):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1274
- `),0}function Hp(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var sx,ox,Jp,Bo,ux,dx,fx,mx,Yx,hc=b(()=>{"use strict";Pe();Ve();jo();lc();Rt();sx="http://127.0.0.1:8787",ox=`usage: lmctl api [--direct] <subcommand> ...
1274
+ `),0}function Hp(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var sx,ox,Jp,qo,ux,dx,fx,mx,Yx,gc=b(()=>{"use strict";Pe();Ve();No();uc();Rt();sx="http://127.0.0.1:8787",ox=`usage: lmctl api [--direct] <subcommand> ...
1275
1275
 
1276
1276
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1277
1277
  workflow shellstep-safe commands also support --direct to use the local DAL
1278
1278
  without an HTTP round trip.
1279
- `,Jp=["low","medium","high","critical"];Bo=new Set(["api.url","api.port","api.token","project.docroot",No,Ao]);ux=`usage: lmctl api escalations <list|show|respond>
1279
+ `,Jp=["low","medium","high","critical"];qo=new Set(["api.url","api.port","api.token","project.docroot",Ao,Ro]);ux=`usage: lmctl api escalations <list|show|respond>
1280
1280
 
1281
1281
  list [--project P] [--all] [--since DURATION] [--json]
1282
1282
  Print pending operator escalations (interactive_waiting_operator
@@ -1301,7 +1301,7 @@ without an HTTP round trip.
1301
1301
 
1302
1302
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1303
1303
  and report the first step that would be started. Default output is the TTY
1304
- table; --json emits the structured WorkflowVerifyReport payload.`;Yx=["open","assigned","closed","reopened"]});import{existsSync as sh,mkdirSync as u$,readdirSync as d$,readFileSync as oh,writeFileSync as f$}from"node:fs";import{join as Yr}from"node:path";import{fileURLToPath as m$}from"node:url";function Yn(t){try{return p$.some(e=>sh(Yr(t,e)))}catch{return!1}}function h$(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}function Jo(t,e){t.durable_memory_mode!=="db"?_$(t):g$(t,e)}function ih(t){let e=Yn(t),r;try{r=d$(_c).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function _$(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Yr(e,"durable-memory");try{u$(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=ih(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Yr(r,i);if(!sh(a))try{let l=oh(Yr(_c,o),"utf8");f$(a,l,"utf8"),s.push(i)}catch(l){console.error(`[bootstrap] failed to copy ${o}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function g$(t,e){let r=t.local_path??"",n=ih(r),s=[];for(let o of n){let i=Yr(_c,o),a;try{a=oh(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=h$(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var _c,p$,zn=b(()=>{"use strict";_c=Yr(m$(import.meta.url),"../../config/durable_memory_templates"),p$=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as w$,mkdirSync as y$,readdirSync as E$,readFileSync as b$,writeFileSync as S$}from"node:fs";import{join as Xo}from"node:path";import{fileURLToPath as T$}from"node:url";function Go(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Yn(e))return;let r=Xo(e,"ai-test");try{y$(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of k$()){let o=s.replace(/\.template$/,""),i=Xo(r,o);if(!w$(i))try{S$(i,v$(s),"utf8"),n.push(o)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function k$(){try{return E$(ah).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function v$(t){try{return b$(Xo(ah,t),"utf8")}catch{return I$(t)}}function I$(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1304
+ table; --json emits the structured WorkflowVerifyReport payload.`;Yx=["open","assigned","closed","reopened"]});import{existsSync as sh,mkdirSync as u$,readdirSync as d$,readFileSync as oh,writeFileSync as f$}from"node:fs";import{join as Yr}from"node:path";import{fileURLToPath as m$}from"node:url";function Yn(t){try{return p$.some(e=>sh(Yr(t,e)))}catch{return!1}}function h$(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}function Xo(t,e){t.durable_memory_mode!=="db"?_$(t):g$(t,e)}function ih(t){let e=Yn(t),r;try{r=d$(wc).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function _$(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Yr(e,"durable-memory");try{u$(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=ih(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Yr(r,i);if(!sh(a))try{let l=oh(Yr(wc,o),"utf8");f$(a,l,"utf8"),s.push(i)}catch(l){console.error(`[bootstrap] failed to copy ${o}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function g$(t,e){let r=t.local_path??"",n=ih(r),s=[];for(let o of n){let i=Yr(wc,o),a;try{a=oh(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=h$(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var wc,p$,zn=b(()=>{"use strict";wc=Yr(m$(import.meta.url),"../../config/durable_memory_templates"),p$=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as w$,mkdirSync as y$,readdirSync as E$,readFileSync as b$,writeFileSync as S$}from"node:fs";import{join as Go}from"node:path";import{fileURLToPath as T$}from"node:url";function Vo(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Yn(e))return;let r=Go(e,"ai-test");try{y$(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of k$()){let o=s.replace(/\.template$/,""),i=Go(r,o);if(!w$(i))try{S$(i,v$(s),"utf8"),n.push(o)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function k$(){try{return E$(ah).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function v$(t){try{return b$(Go(ah,t),"utf8")}catch{return I$(t)}}function I$(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1305
1305
 
1306
1306
  Add test chapters in this directory.
1307
1307
  `:`---
@@ -1323,7 +1323,7 @@ last_run_id: 0
1323
1323
  ## Expected
1324
1324
 
1325
1325
  ## Cleanup
1326
- `}var ah,gc=b(()=>{"use strict";zn();ah=Xo(T$(import.meta.url),"../../config/ai_test_templates")});var zr,wc=b(()=>{"use strict";zr=`---
1326
+ `}var ah,yc=b(()=>{"use strict";zn();ah=Go(T$(import.meta.url),"../../config/ai_test_templates")});var zr,Ec=b(()=>{"use strict";zr=`---
1327
1327
 
1328
1328
  # Durable memory \u2014 how to use it
1329
1329
 
@@ -1334,70 +1334,70 @@ ON EVERY NEW TASK:
1334
1334
  2. Pull only the chapters relevant to your current task. Don't load everything.
1335
1335
  3. If you learn something durable (a project convention, a decision, a fact worth preserving), write it back: create/update \`<project>/durable-memory/<descriptive-name>.md\` with YAML frontmatter (name/description/type) + body. The engine syncs the write automatically.
1336
1336
 
1337
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Vo(t){return x$.has(t)}function Ec(){return yc===null&&(yc=ht(_t())),yc}function bc(t,e){if(!Vo(t))return null;try{let r=Ec().getAdapter?.(t);if(r===void 0)return null;let n=r.resumeCommand(e).trim();return n.length===0?null:[...n.split(/\s+/),...lh[t]??[]]}catch{return null}}function Zr(t,e){let r=bc(t,e);return r===null?null:r.join(" ")}function xr(t,e){return Ec().getSession(t,e)}async function Ko(t){return(await Ec().resolveSessions(t)).map(r=>r.provider.name)}var lh,x$,ch,yc,Qr=b(()=>{"use strict";At();lh={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},x$=new Set(Object.keys(lh)),ch=/^[\w.:-]+$/;yc=null});import{createHash as $$}from"node:crypto";import{existsSync as Zn,mkdirSync as dh,readFileSync as zo,readdirSync as j$,renameSync as N$,statSync as A$,unlinkSync as R$,writeFileSync as Yo}from"node:fs";import{homedir as O$}from"node:os";import{dirname as Tc,isAbsolute as uh,join as ze,relative as L$,resolve as en}from"node:path";import{fileURLToPath as C$}from"node:url";function mh(t){let e=en(t);for(;;){let r=ze(e,kc);try{if(A$(r).isDirectory())return r}catch{}let n=Tc(e);if(n===e)return null;e=n}}function Zo(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return en(e);let r=mh(t);return r!==null?r:ze(fh(),kc)}function ph(t){return ze(Zo(t),"templates","workflows")}function hh(){return en(Tc(C$(import.meta.url)),"..","..","workflows")}function M$(t){let e=ze(t,_h);try{let r=JSON.parse(zo(e,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function D$(t,e){dh(t,{recursive:!0});let r=ze(t,_h),n=`${r}.tmp-${process.pid}`;Yo(n,`${JSON.stringify(e,null,2)}
1338
- `,"utf8"),N$(n,r)}function P$(t,e){if(uh(e)||Tc(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=en(t,"templates","workflows"),s=en(t,"templates",e),o=L$(n,s);return o.length===0||o.startsWith("..")||uh(o)||o.includes("/")||o.includes("\\")?null:s}function F$(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=P$(t,n);if(o===null){delete e.files[n];continue}if(!Zn(o)){delete e.files[n];continue}try{if(Sc(zo(o))!==s)continue;R$(o),delete e.files[n]}catch{}}}function Qo(t={}){let e=Zo(t.cwd),r=ze(e,"templates","workflows"),n=hh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=Zn(n)?j$(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;dh(r,{recursive:!0});let i=M$(e),a=st(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=zo(ze(n,c)),f=Sc(d),m=ze(r,c);if(!Zn(m)){try{Yo(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=Sc(zo(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)Yo(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=ze(r,`${c}.dist-${a}`);Yo(g,d),s.preserved.push(c),s.shadowed.push(`${c}.dist-${a}`)}}F$(e,i,l),D$(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function vc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(en(r));let n=mh(t??process.cwd());return n!==null&&e.push(n),e.push(ze(fh(),kc)),e}function ei(t,e){let r=vc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=ze(s,"templates","workflows",o);if(Zn(i))return i}for(let s of n){let o=ze(hh(),s);if(Zn(o))return o}return null}var kc,fh,Sc,_h,ti=b(()=>{"use strict";On();kc=".lmctl",fh=()=>process.env.HOME??O$(),Sc=t=>$$("sha256").update(t).digest("hex");_h=".dist-manifest.json"});import{createHash as U$}from"node:crypto";import{existsSync as W$,mkdirSync as B$,writeFileSync as q$}from"node:fs";import{dirname as H$,join as tn}from"node:path";function er(t){return typeof t=="string"&&t.startsWith(gh)}function Y$(t){if(!er(t))throw new at(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(gh.length),r=e.indexOf("/");if(r<=0)throw new at(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!V$.has(n))throw new at(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new at(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new at(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function z$(t,e,r){if(t==="workflow")return ei(e,r);let n=t==="mcp"?tn("templates","mcp",`${e}.json`):tn("templates","skills",e,"SKILL.md");for(let s of vc(r)){let o=tn(s,n);if(W$(o))return o}return null}function Z$(t,e,r){let n=tn(Zo(r),X$,t);return t==="skill"?tn(n,e,"SKILL.md"):tn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function Q$(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function Qn(t,e){let{kind:r,name:n,ref:s}=Y$(t),o=z$(r,n,e);if(o!==null)return o;let i=`${J$}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(G$)})}catch(u){throw new at(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new at(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=K$.exec(s);if(u!==null){let d=U$("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new at(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!Q$(r,l))throw new at(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=Z$(r,n,e);return B$(H$(c),{recursive:!0}),q$(c,l,"utf8"),c}var gh,J$,X$,G$,V$,at,K$,Ic=b(()=>{"use strict";ti();gh="lmctl://",J$="https://lmctl.com/templates/",X$=".cache",G$=8e3,V$=new Set(["workflow","mcp","skill"]),at=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},K$=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as ej,mkdirSync as tj,readFileSync as rj,renameSync as nj,unlinkSync as sj,writeFileSync as oj}from"node:fs";import{homedir as Eh}from"node:os";import{dirname as es,join as Ue,resolve as ij}from"node:path";function $c(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function lj(t){let e=Ue(t,".mcp.json"),r=$c();if(!be.existsSync(e))return be.writeFileSync(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
1337
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Ko(t){return x$.has(t)}function Sc(){return bc===null&&(bc=ht(_t())),bc}function Tc(t,e,r={}){if(!Ko(t))return null;try{let n=Sc().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&r.isLead===!0?ao({warn:()=>{}}):[];return[...o,...i,...lh[t]??[]]}catch{return null}}function Zr(t,e){let r=Tc(t,e);return r===null?null:r.join(" ")}function xr(t,e){return Sc().getSession(t,e)}async function Yo(t){return(await Sc().resolveSessions(t)).map(r=>r.provider.name)}var lh,x$,ch,bc,Qr=b(()=>{"use strict";At();yl();lh={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},x$=new Set(Object.keys(lh)),ch=/^[\w.:-]+$/;bc=null});import{createHash as $$}from"node:crypto";import{existsSync as Zn,mkdirSync as dh,readFileSync as Zo,readdirSync as j$,renameSync as N$,statSync as A$,unlinkSync as R$,writeFileSync as zo}from"node:fs";import{homedir as O$}from"node:os";import{dirname as vc,isAbsolute as uh,join as ze,relative as L$,resolve as en}from"node:path";import{fileURLToPath as C$}from"node:url";function mh(t){let e=en(t);for(;;){let r=ze(e,Ic);try{if(A$(r).isDirectory())return r}catch{}let n=vc(e);if(n===e)return null;e=n}}function Qo(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return en(e);let r=mh(t);return r!==null?r:ze(fh(),Ic)}function ph(t){return ze(Qo(t),"templates","workflows")}function hh(){return en(vc(C$(import.meta.url)),"..","..","workflows")}function M$(t){let e=ze(t,_h);try{let r=JSON.parse(Zo(e,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function D$(t,e){dh(t,{recursive:!0});let r=ze(t,_h),n=`${r}.tmp-${process.pid}`;zo(n,`${JSON.stringify(e,null,2)}
1338
+ `,"utf8"),N$(n,r)}function P$(t,e){if(uh(e)||vc(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=en(t,"templates","workflows"),s=en(t,"templates",e),o=L$(n,s);return o.length===0||o.startsWith("..")||uh(o)||o.includes("/")||o.includes("\\")?null:s}function F$(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=P$(t,n);if(o===null){delete e.files[n];continue}if(!Zn(o)){delete e.files[n];continue}try{if(kc(Zo(o))!==s)continue;R$(o),delete e.files[n]}catch{}}}function ei(t={}){let e=Qo(t.cwd),r=ze(e,"templates","workflows"),n=hh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=Zn(n)?j$(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;dh(r,{recursive:!0});let i=M$(e),a=st(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=Zo(ze(n,c)),f=kc(d),m=ze(r,c);if(!Zn(m)){try{zo(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=kc(Zo(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)zo(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=ze(r,`${c}.dist-${a}`);zo(g,d),s.preserved.push(c),s.shadowed.push(`${c}.dist-${a}`)}}F$(e,i,l),D$(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function xc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(en(r));let n=mh(t??process.cwd());return n!==null&&e.push(n),e.push(ze(fh(),Ic)),e}function ti(t,e){let r=xc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=ze(s,"templates","workflows",o);if(Zn(i))return i}for(let s of n){let o=ze(hh(),s);if(Zn(o))return o}return null}var Ic,fh,kc,_h,ri=b(()=>{"use strict";On();Ic=".lmctl",fh=()=>process.env.HOME??O$(),kc=t=>$$("sha256").update(t).digest("hex");_h=".dist-manifest.json"});import{createHash as U$}from"node:crypto";import{existsSync as W$,mkdirSync as B$,writeFileSync as q$}from"node:fs";import{dirname as H$,join as tn}from"node:path";function er(t){return typeof t=="string"&&t.startsWith(gh)}function Y$(t){if(!er(t))throw new at(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(gh.length),r=e.indexOf("/");if(r<=0)throw new at(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!V$.has(n))throw new at(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new at(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new at(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function z$(t,e,r){if(t==="workflow")return ti(e,r);let n=t==="mcp"?tn("templates","mcp",`${e}.json`):tn("templates","skills",e,"SKILL.md");for(let s of xc(r)){let o=tn(s,n);if(W$(o))return o}return null}function Z$(t,e,r){let n=tn(Qo(r),X$,t);return t==="skill"?tn(n,e,"SKILL.md"):tn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function Q$(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function Qn(t,e){let{kind:r,name:n,ref:s}=Y$(t),o=z$(r,n,e);if(o!==null)return o;let i=`${J$}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(G$)})}catch(u){throw new at(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new at(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=K$.exec(s);if(u!==null){let d=U$("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new at(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!Q$(r,l))throw new at(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=Z$(r,n,e);return B$(H$(c),{recursive:!0}),q$(c,l,"utf8"),c}var gh,J$,X$,G$,V$,at,K$,$c=b(()=>{"use strict";ri();gh="lmctl://",J$="https://lmctl.com/templates/",X$=".cache",G$=8e3,V$=new Set(["workflow","mcp","skill"]),at=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},K$=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as ej,mkdirSync as tj,readFileSync as rj,renameSync as nj,unlinkSync as sj,writeFileSync as oj}from"node:fs";import{homedir as Eh}from"node:os";import{dirname as es,join as Ue,resolve as ij}from"node:path";function Nc(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function lj(t){let e=Ue(t,".mcp.json"),r=Nc();if(!be.existsSync(e))return be.writeFileSync(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
1339
1339
  `,"utf8"),!0;let n;try{n=JSON.parse(be.readFileSync(e,"utf8"))}catch{return!1}if(n===null||typeof n!="object"||Array.isArray(n))return!1;let s=lt(n.mcpServers)?{...n.mcpServers}:{},o=lt(s.lmctl)?s.lmctl:void 0;return o!==void 0&&o.type===r.type&&o.command===r.command&&JSON.stringify(o.args)===JSON.stringify(r.args)?!1:(s.lmctl=r,n.mcpServers=s,be.writeFileSync(e,JSON.stringify(n,null,2)+`
1340
- `,"utf8"),!0)}function jc(t,e){if(t==="copilot"){let n=cj();return n.present&&dj(e,ts),n}let r=Ue(e,".mcp.json");try{let n=lj(e);return{scope:"workspace",path:r,changed:n,present:wh(e)}}catch(n){return{scope:"workspace",path:r,changed:!1,present:wh(e),error:n instanceof Error?n.message:String(n)}}}function ni(t,e,r,n,s){if(!e)return;let o=jc(n,s);o.error!==void 0&&t.stderr.write(`warning: MCP bridge self-heal failed: ${o.error}
1341
- `),Y({event:"lead_mcp_precheck",alias:r,provider:n,cwd:s,mcp_scope:o.scope,mcp_path:o.path,mcp_present:o.present,mcp_json_exists:o.present}),o.present||t.stderr.write(`warning: Lead MCP bridge config missing after self-heal: ${o.path}
1342
- `)}function si(t,e,r){let n=es(ij(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries()){let l=new Set([tr]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(ts),rr(Ue(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)fj(i)}function cj(){let t=oi();try{let{changed:e}=Nc(t,{[ts]:$c()});return{scope:"copilot-user",path:t,changed:e,present:xc(t)}}catch(e){return{scope:"copilot-user",path:t,changed:!1,present:xc(t),error:e instanceof Error?e.message:String(e)}}}function oi(t=bh??Eh()){return Ue(t,".copilot","mcp-config.json")}function Nc(t,e){let r={};if(be.existsSync(t)){let o=JSON.parse(be.readFileSync(t,"utf8"));if(!lt(o))throw new Error(`${t} is not a JSON object`);r=o}let n=lt(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=lt(n[o])?n[o]:void 0;kh(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,Sh(t,r),{changed:!0}):{changed:!1}}function Sh(t,e){be.mkdirSync(es(t),{recursive:!0});let r=Ue(es(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,`${JSON.stringify(e,null,2)}
1343
- `,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function uj(t,e){be.mkdirSync(es(t),{recursive:!0});let r=Ue(es(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,e,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function wh(t){return xc(Ue(t,".mcp.json"))}function dj(t,e){let r=Ue(t,".mcp.json");rr(r,"mcpServers",[e])}function rr(t,e,r){try{if(!be.existsSync(t))return;let n=JSON.parse(be.readFileSync(t,"utf8"));if(!lt(n)||!lt(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,Sh(t,n),Y({event:"mcp_cleanup",path:t,removed:o})}catch{}}function fj(t){let e=bh??Eh();switch(t){case"copilot":rr(oi(e),"mcpServers",[tr]);return;case"claude":rr(Ue(e,".claude.json"),"mcpServers",[tr]);return;case"gemini":rr(Ue(e,".gemini","settings.json"),"mcpServers",[tr]);return;case"qwen":rr(Ue(e,".qwen","settings.json"),"mcpServers",[tr]);return;case"agy":rr(Ue(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[tr]);return;case"opencode":rr(Ue(e,".config","opencode","opencode.json"),"mcp",[tr]);return;case"codex":mj(Ue(e,".codex","config.toml"),tr);return;default:return}}function mj(t,e){try{if(!be.existsSync(t))return;let n=be.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=pj(a);if(l===null)return;if(l!==void 0){if(yh(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=hj(a);if(c===null)return;if(c!==void 0&&yh(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;uj(t,s.join(`
1344
- `)),Y({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function yh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function pj(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Th(e[1])}function hj(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Th(r)}function Th(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function xc(t){try{if(!be.existsSync(t))return!1;let e=JSON.parse(be.readFileSync(t,"utf8"));if(!lt(e)||!lt(e.mcpServers))return!1;let r=lt(e.mcpServers[ts])?e.mcpServers[ts]:void 0;return kh(r,$c())}catch{return!1}}function kh(t,e){return t!==void 0&&ri(t)===ri(e)}function ri(t){return Array.isArray(t)?`[${t.map(e=>ri(e)).join(",")}]`:lt(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${ri(t[e])}`).join(",")}}`:JSON.stringify(t)}function lt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ts,tr,aj,be,bh,rs=b(()=>{"use strict";je();ts="lmctl",tr="lmctl0",aj={existsSync:ej,mkdirSync:tj,readFileSync:rj,writeFileSync:oj,renameSync:nj,unlinkSync:sj},be=aj});import{spawnSync as Nh}from"node:child_process";import{cpSync as vh,existsSync as Oc,mkdirSync as Ah,mkdtempSync as _j,readFileSync as Rh,statSync as gj,writeFileSync as Ac}from"node:fs";import{homedir as wj,tmpdir as yj}from"node:os";import{basename as Ih,join as Ze}from"node:path";function Ot(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Rc(t,e,r){if(Array.isArray(t)){for(let n of t)Rc(n,e,r);return}if(Ot(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))Rc(n,e,r)}}function Tj(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Ot(a)||!Array.isArray(a.steps)))for(let l of a.steps)Ot(l)&&l.members!==void 0&&Rc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(Sj(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function Oh(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(Ej)})}catch(s){throw new Qe(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new Qe(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>xh)throw new Qe(e,`fetched ${t} exceeds ${xh} bytes`);return n}async function kj(t,e){if(typeof t!="string")return[t];er(t)&&(t=await Qn(t));let r;if(Lc.test(t))r=await Oh(t,e);else{if(!Oc(t))throw new Qe(e,`mcp file not found: ${t}`);r=Rh(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new Qe(e,`mcp source is not JSON: ${t}`)}if(Ot(n)&&Ot(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Ot(o)?o:{}}));if(Ot(n)&&typeof n.name=="string")return[n];throw new Qe(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function ai(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function ii(t,e,r,n){let s=Nh(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new Qe(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Qe(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function vj(t,e,r){Nh(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function Ij(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function xj(t){let e=["mcp","add"];if(ai(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function $j(t){if(ai(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function jj(t){let e=Ze(process.env.XDG_CONFIG_HOME??Ze(rn(),".config"),"opencode"),r=Ze(e,"opencode.json"),n={};if(Oc(r))try{let o=JSON.parse(Rh(r,"utf8"));Ot(o)&&(n=o)}catch{}let s=Ot(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=ai(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),Ah(e,{recursive:!0}),Ac(r,`${JSON.stringify(n,null,2)}
1345
- `,"utf8")}function Nj(t,e){let r={};for(let n of t)r[n.name]=ai(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{Nc(oi(rn()),r)}catch(n){throw new Qe(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function Aj(t){if(typeof t!="string")return t.name;let e=Ih(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?Ih(t.replace(/\/skill\.md$/i,"")):e}async function $h(t,e,r){let n=Aj(t),s=Ze(e,n);if(Ah(s,{recursive:!0}),typeof t!="string")return Ac(Ze(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(er(t)&&(t=await Qn(t)),Lc.test(t))return Ac(Ze(s,"SKILL.md"),await Oh(t,r),"utf8"),{name:n,dir:s};if(!Oc(t))throw new Qe(r,`skill path not found: ${t}`);return gj(t).isDirectory()?(vh(t,s,{recursive:!0}),{name:n,dir:s}):(vh(t,Ze(s,"SKILL.md")),{name:n,dir:s})}async function li(t){let{dal:e,member:r,stderr:n}=t,s=Tj(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=ve(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1346
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await kj(c,r.alias));if(o==="opencode")jj(l);else if(o==="copilot")Nj(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(vj(o,Ij(o,c.name),i),o==="claude"){let{name:u,...d}=c;ii("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?ii("codex",$j(c),i,r.alias):ii(o,xj(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(bj.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=_j(Ze(yj(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Lc.test(c)?c:(await $h(c,l,r.alias)).dir;ii(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(jh[o]!==void 0){let l=jh[o]();for(let c of s.skills)await $h(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var Qe,Lc,Ej,xh,bj,Sj,rn,jh,Cc=b(()=>{"use strict";Pe();Ic();rs();Qe=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Lc=/^https?:\/\//i,Ej=8e3,xh=1e6,bj=new Set(["opencode"]),Sj=t=>JSON.stringify(t),rn=()=>process.env.HOME??wj();jh={claude:()=>Ze(rn(),".claude","skills"),qwen:()=>Ze(rn(),".qwen","skills"),codex:()=>Ze(rn(),".codex","skills"),copilot:()=>Ze(rn(),".copilot","skills")}});async function X(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:ce()});try{return await e(r)}finally{r.close()}}function P(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function N(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1340
+ `,"utf8"),!0)}function Ac(t,e){if(t==="copilot"){let n=cj();return n.present&&dj(e,ts),n}if(t==="codex")return{scope:"codex-cli-flags",path:"codex app-server -c mcp_servers.lmctl.*",changed:!1,present:!1};let r=Ue(e,".mcp.json");try{let n=lj(e);return{scope:"workspace",path:r,changed:n,present:wh(e)}}catch(n){return{scope:"workspace",path:r,changed:!1,present:wh(e),error:n instanceof Error?n.message:String(n)}}}function si(t,e,r,n,s){if(!e)return;let o=Ac(n,s);o.error!==void 0&&t.stderr.write(`warning: MCP bridge self-heal failed: ${o.error}
1341
+ `),Z({event:"lead_mcp_precheck",alias:r,provider:n,cwd:s,mcp_scope:o.scope,mcp_path:o.path,mcp_present:o.present,mcp_json_exists:o.present}),!o.present&&o.scope!=="codex-cli-flags"&&t.stderr.write(`warning: Lead MCP bridge config missing after self-heal: ${o.path}
1342
+ `)}function oi(t,e,r){let n=es(ij(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries()){let l=new Set([tr]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(ts),rr(Ue(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)fj(i)}function cj(){let t=ii();try{let{changed:e}=Rc(t,{[ts]:Nc()});return{scope:"copilot-user",path:t,changed:e,present:jc(t)}}catch(e){return{scope:"copilot-user",path:t,changed:!1,present:jc(t),error:e instanceof Error?e.message:String(e)}}}function ii(t=bh??Eh()){return Ue(t,".copilot","mcp-config.json")}function Rc(t,e){let r={};if(be.existsSync(t)){let o=JSON.parse(be.readFileSync(t,"utf8"));if(!lt(o))throw new Error(`${t} is not a JSON object`);r=o}let n=lt(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=lt(n[o])?n[o]:void 0;kh(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,Sh(t,r),{changed:!0}):{changed:!1}}function Sh(t,e){be.mkdirSync(es(t),{recursive:!0});let r=Ue(es(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,`${JSON.stringify(e,null,2)}
1343
+ `,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function uj(t,e){be.mkdirSync(es(t),{recursive:!0});let r=Ue(es(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,e,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function wh(t){return jc(Ue(t,".mcp.json"))}function dj(t,e){let r=Ue(t,".mcp.json");rr(r,"mcpServers",[e])}function rr(t,e,r){try{if(!be.existsSync(t))return;let n=JSON.parse(be.readFileSync(t,"utf8"));if(!lt(n)||!lt(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,Sh(t,n),Z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function fj(t){let e=bh??Eh();switch(t){case"copilot":rr(ii(e),"mcpServers",[tr]);return;case"claude":rr(Ue(e,".claude.json"),"mcpServers",[tr]);return;case"gemini":rr(Ue(e,".gemini","settings.json"),"mcpServers",[tr]);return;case"qwen":rr(Ue(e,".qwen","settings.json"),"mcpServers",[tr]);return;case"agy":rr(Ue(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[tr]);return;case"opencode":rr(Ue(e,".config","opencode","opencode.json"),"mcp",[tr]);return;case"codex":mj(Ue(e,".codex","config.toml"),tr);return;default:return}}function mj(t,e){try{if(!be.existsSync(t))return;let n=be.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=pj(a);if(l===null)return;if(l!==void 0){if(yh(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=hj(a);if(c===null)return;if(c!==void 0&&yh(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;uj(t,s.join(`
1344
+ `)),Z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function yh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function pj(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Th(e[1])}function hj(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Th(r)}function Th(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function jc(t){try{if(!be.existsSync(t))return!1;let e=JSON.parse(be.readFileSync(t,"utf8"));if(!lt(e)||!lt(e.mcpServers))return!1;let r=lt(e.mcpServers[ts])?e.mcpServers[ts]:void 0;return kh(r,Nc())}catch{return!1}}function kh(t,e){return t!==void 0&&ni(t)===ni(e)}function ni(t){return Array.isArray(t)?`[${t.map(e=>ni(e)).join(",")}]`:lt(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${ni(t[e])}`).join(",")}}`:JSON.stringify(t)}function lt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ts,tr,aj,be,bh,rs=b(()=>{"use strict";je();ts="lmctl",tr="lmctl0",aj={existsSync:ej,mkdirSync:tj,readFileSync:rj,writeFileSync:oj,renameSync:nj,unlinkSync:sj},be=aj});import{spawnSync as Nh}from"node:child_process";import{cpSync as vh,existsSync as Cc,mkdirSync as Ah,mkdtempSync as _j,readFileSync as Rh,statSync as gj,writeFileSync as Oc}from"node:fs";import{homedir as wj,tmpdir as yj}from"node:os";import{basename as Ih,join as Ze}from"node:path";function Ot(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Lc(t,e,r){if(Array.isArray(t)){for(let n of t)Lc(n,e,r);return}if(Ot(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))Lc(n,e,r)}}function Tj(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Ot(a)||!Array.isArray(a.steps)))for(let l of a.steps)Ot(l)&&l.members!==void 0&&Lc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(Sj(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function Oh(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(Ej)})}catch(s){throw new Qe(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new Qe(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>xh)throw new Qe(e,`fetched ${t} exceeds ${xh} bytes`);return n}async function kj(t,e){if(typeof t!="string")return[t];er(t)&&(t=await Qn(t));let r;if(Mc.test(t))r=await Oh(t,e);else{if(!Cc(t))throw new Qe(e,`mcp file not found: ${t}`);r=Rh(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new Qe(e,`mcp source is not JSON: ${t}`)}if(Ot(n)&&Ot(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Ot(o)?o:{}}));if(Ot(n)&&typeof n.name=="string")return[n];throw new Qe(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function li(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function ai(t,e,r,n){let s=Nh(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new Qe(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Qe(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function vj(t,e,r){Nh(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function Ij(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function xj(t){let e=["mcp","add"];if(li(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function $j(t){if(li(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function jj(t){let e=Ze(process.env.XDG_CONFIG_HOME??Ze(rn(),".config"),"opencode"),r=Ze(e,"opencode.json"),n={};if(Cc(r))try{let o=JSON.parse(Rh(r,"utf8"));Ot(o)&&(n=o)}catch{}let s=Ot(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=li(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),Ah(e,{recursive:!0}),Oc(r,`${JSON.stringify(n,null,2)}
1345
+ `,"utf8")}function Nj(t,e){let r={};for(let n of t)r[n.name]=li(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{Rc(ii(rn()),r)}catch(n){throw new Qe(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function Aj(t){if(typeof t!="string")return t.name;let e=Ih(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?Ih(t.replace(/\/skill\.md$/i,"")):e}async function $h(t,e,r){let n=Aj(t),s=Ze(e,n);if(Ah(s,{recursive:!0}),typeof t!="string")return Oc(Ze(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(er(t)&&(t=await Qn(t)),Mc.test(t))return Oc(Ze(s,"SKILL.md"),await Oh(t,r),"utf8"),{name:n,dir:s};if(!Cc(t))throw new Qe(r,`skill path not found: ${t}`);return gj(t).isDirectory()?(vh(t,s,{recursive:!0}),{name:n,dir:s}):(vh(t,Ze(s,"SKILL.md")),{name:n,dir:s})}async function ci(t){let{dal:e,member:r,stderr:n}=t,s=Tj(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=ve(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1346
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await kj(c,r.alias));if(o==="opencode")jj(l);else if(o==="copilot")Nj(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(vj(o,Ij(o,c.name),i),o==="claude"){let{name:u,...d}=c;ai("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?ai("codex",$j(c),i,r.alias):ai(o,xj(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(bj.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=_j(Ze(yj(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Mc.test(c)?c:(await $h(c,l,r.alias)).dir;ai(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(jh[o]!==void 0){let l=jh[o]();for(let c of s.skills)await $h(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var Qe,Mc,Ej,xh,bj,Sj,rn,jh,Dc=b(()=>{"use strict";Pe();$c();rs();Qe=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Mc=/^https?:\/\//i,Ej=8e3,xh=1e6,bj=new Set(["opencode"]),Sj=t=>JSON.stringify(t),rn=()=>process.env.HOME??wj();jh={claude:()=>Ze(rn(),".claude","skills"),qwen:()=>Ze(rn(),".qwen","skills"),codex:()=>Ze(rn(),".codex","skills"),copilot:()=>Ze(rn(),".copilot","skills")}});async function X(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:ue()});try{return await e(r)}finally{r.close()}}function D(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function j(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function C(t,e){return t.flags[e]===!0}function B(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1347
1347
  `)}function w(t,e){return t.stderr.write(`error: ${e}
1348
- `),1}function fe(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1349
- `),2}var $e=b(()=>{"use strict";Pe();Ve()});var Ph={};le(Ph,{defaultTeamNameForProject:()=>Yj,resolveAlias:()=>di,resolveProject:()=>ci,resolveTeam:()=>ui,runCode:()=>Lj});import{execFileSync as Rj}from"node:child_process";import{basename as Oj,resolve as Lh}from"node:path";import*as Dc from"node:readline";import{setTimeout as Mc}from"node:timers/promises";async function Lj(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return Cj(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Mh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return Hj(e);try{return await X(e,async s=>{switch(r){case"team":return Mj(n,e,s);case"chat":return Wj(n,e,s);case"spec":return Bj(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return fe(e,s)}}function Cj(t){return t.stdout.write(["usage: lmctl code <team|chat> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1350
- `)),0}function Mj(t,e,r){let[n,...s]=t;switch(n){case"add":return Dj(s,e,r);case"list":return Pj(s,e,r);case"show":return Fj(s,e,r);case"rm":return Uj(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function Dj(t,e,r){let n=P(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team add <alias> --provider P [--model M] [--role R]");let o=N(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=nn(e,r,N(n,"--project"),N(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:N(n,"--model")??null,role:N(n,"--role")??"agent",sessiondir:N(n,"--sessiondir")??i.project.local_path});return M(n,"--json")?W(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1351
- `),0}function Pj(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=nn(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=Dh(r.listTeamMembers(s.team.id));if(M(n,"--json"))W(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${ve(i)} ${i.sessionid??"(unseeded)"}
1352
- `);return 0}function Fj(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team show <alias>");let o=nn(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?w(e,`member not found: ${s}`):(M(n,"--json")?W(e,i):(e.stdout.write(`member ${i.alias}
1348
+ `),1}function me(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1349
+ `),2}var $e=b(()=>{"use strict";Pe();Ve()});var Ph={};ce(Ph,{defaultTeamNameForProject:()=>Yj,resolveAlias:()=>fi,resolveProject:()=>ui,resolveTeam:()=>di,runCode:()=>Lj});import{execFileSync as Rj}from"node:child_process";import{basename as Oj,resolve as Lh}from"node:path";import*as Fc from"node:readline";import{setTimeout as Pc}from"node:timers/promises";async function Lj(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return Cj(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Mh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return Hj(e);try{return await X(e,async s=>{switch(r){case"team":return Mj(n,e,s);case"chat":return Wj(n,e,s);case"spec":return Bj(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return me(e,s)}}function Cj(t){return t.stdout.write(["usage: lmctl code <team|chat> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1350
+ `)),0}function Mj(t,e,r){let[n,...s]=t;switch(n){case"add":return Dj(s,e,r);case"list":return Pj(s,e,r);case"show":return Fj(s,e,r);case"rm":return Uj(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function Dj(t,e,r){let n=D(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team add <alias> --provider P [--model M] [--role R]");let o=j(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=nn(e,r,j(n,"--project"),j(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:j(n,"--model")??null,role:j(n,"--role")??"agent",sessiondir:j(n,"--sessiondir")??i.project.local_path});return C(n,"--json")?B(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1351
+ `),0}function Pj(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=nn(e,r,j(n,"--project"),j(n,"--team"));if(typeof s=="number")return s;let o=Dh(r.listTeamMembers(s.team.id));if(C(n,"--json"))B(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${ve(i)} ${i.sessionid??"(unseeded)"}
1352
+ `);return 0}function Fj(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team show <alias>");let o=nn(e,r,j(n,"--project"),j(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?w(e,`member not found: ${s}`):(C(n,"--json")?B(e,i):(e.stdout.write(`member ${i.alias}
1353
1353
  `),e.stdout.write(`role: ${i.role}
1354
1354
  `),e.stdout.write(`provider: ${ve(i)}
1355
1355
  `),e.stdout.write(`model: ${i.model??"(default)"}
1356
1356
  `),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
1357
1357
  `),e.stdout.write(`sessiondir: ${i.sessiondir}
1358
- `)),0)}function Uj(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team rm <alias>");let o=nn(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return w(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return M(n,"--json")?W(e,a):e.stdout.write(`retired member ${i.alias}
1359
- `),0}async function Wj(t,e,r){if(t.includes("--help")||t.includes("-h"))return Mh(e);let n=P(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=nn(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=di(e,r,s.team,N(n,"--alias"));if(typeof o=="number")return o;let i=await Kj(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1360
- `);let a=e.stdin??process.stdin,l=Dc.createInterface({input:a,terminal:!1}),c=i;ns(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){ns(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1358
+ `)),0)}function Uj(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team rm <alias>");let o=nn(e,r,j(n,"--project"),j(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return w(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return C(n,"--json")?B(e,a):e.stdout.write(`retired member ${i.alias}
1359
+ `),0}async function Wj(t,e,r){if(t.includes("--help")||t.includes("-h"))return Mh(e);let n=D(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=nn(e,r,j(n,"--project"),j(n,"--team"));if(typeof s=="number")return s;let o=fi(e,r,s.team,j(n,"--alias"));if(typeof o=="number")return o;let i=await Kj(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1360
+ `);let a=e.stdin??process.stdin,l=Fc.createInterface({input:a,terminal:!1}),c=i;ns(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){ns(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1361
1361
  `),0;if(d==="/help"){Vj(e),ns(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
1362
1362
  `),ns(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
1363
1363
  `);let f=await Xr({sessionid:c.sessionid,sessiondir:c.sessiondir,prompt:d,dal:r,team_member_id:c.id});e.stdout.write(`${f.text.trimEnd()}
1364
- `);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),ns(e,c,s.project)}}finally{l.close()}return 0}async function Bj(t,e,r){let n=P(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return w(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=nn(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=N(n,"--template")??Ch,a=r.getWorkflowByName(i);if(a===null)return w(e,`workflow not found: ${i}`);let l=N(n,"--slug")??Gj(s),c={task_description:s,slug:l},u=N(n,"--from-requirement"),d=N(n,"--from-plan"),f=N(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=qj(r,e),p=await ss(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
1364
+ `);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),ns(e,c,s.project)}}finally{l.close()}return 0}async function Bj(t,e,r){let n=D(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return w(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=nn(e,r,j(n,"--project"),j(n,"--team"));if(typeof o=="number")return o;let i=j(n,"--template")??Ch,a=r.getWorkflowByName(i);if(a===null)return w(e,`workflow not found: ${i}`);let l=j(n,"--slug")??Gj(s),c={task_description:s,slug:l},u=j(n,"--from-requirement"),d=j(n,"--from-plan"),f=j(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=qj(r,e),p=await ss(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
1365
1365
  `),Jj(e,m,p.id)}function qj(t,e){let r=Kn(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function Hj(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Ch}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
1366
1366
  `)),0}async function Jj(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await ss(e,`/api/jobs/${r}/run`,"POST");if(o.run_id!==null&&(n=o.run_id),o.status==="done")return t.stdout.write(`code spec complete: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1367
1367
  `),o.terminal_state==="done"?0:1;if(o.status==="failed")return t.stderr.write(`code spec failed: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1368
- `),1;if(o.status==="paused"&&o.run_id!==null){n=o.run_id;let i=await Xj(t,e,r,n);if(i!=="continue")return i;continue}await Mc(1e3)}return t.stderr.write(`error: code spec polling exceeded step limit for job ${r}
1368
+ `),1;if(o.status==="paused"&&o.run_id!==null){n=o.run_id;let i=await Xj(t,e,r,n);if(i!=="continue")return i;continue}await Pc(1e3)}return t.stderr.write(`error: code spec polling exceeded step limit for job ${r}
1369
1369
  `),1}async function Xj(t,e,r,n){let s=await ss(e,`/api/runs/${n}`,"GET"),o=typeof s.current_state=="string"&&s.current_state.startsWith("__paused__:")?s.current_state.slice(11):null;if(o===null)return t.stderr.write(`[code spec] run ${n} paused without an Interactive state; polling will continue
1370
- `),await Mc(1e3),"continue";let i=[...s.steps].reverse().find(l=>l.state_name===o);if(i===void 0)return t.stderr.write(`[code spec] paused state ${o} has no step; polling will continue
1371
- `),await Mc(1e3),"continue";t.stderr.write(`[code spec] interactive stage ${o}; type /done to advance or /exit to leave paused
1372
- `);let a=Dc.createInterface({input:t.stdin??process.stdin,terminal:!1});try{for await(let l of a){let c=l.trim();if(c==="/exit")return t.stdout.write(`code spec paused: job ${r}, run ${n}, stage ${o}
1370
+ `),await Pc(1e3),"continue";let i=[...s.steps].reverse().find(l=>l.state_name===o);if(i===void 0)return t.stderr.write(`[code spec] paused state ${o} has no step; polling will continue
1371
+ `),await Pc(1e3),"continue";t.stderr.write(`[code spec] interactive stage ${o}; type /done to advance or /exit to leave paused
1372
+ `);let a=Fc.createInterface({input:t.stdin??process.stdin,terminal:!1});try{for await(let l of a){let c=l.trim();if(c==="/exit")return t.stdout.write(`code spec paused: job ${r}, run ${n}, stage ${o}
1373
1373
  `),0;if(c==="/done")return await ss(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await ss(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function ss(t,e,r,n){let s=new URL(e,t.baseUrl),o={Accept:"application/json"};t.token!==null&&t.token.length>0&&(o.Authorization=`Bearer ${t.token}`);let i;n!==void 0&&(i=JSON.stringify(n),o["Content-Type"]="application/json");let a=await fetch(s,{method:r,headers:o,body:i});if(!a.ok)throw new Error(`HTTP ${a.status}: ${await a.text()}`);return await a.json()}function Gj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Mh(t){return t.stdout.write(["usage: lmctl code chat [--project P] [--team T] [--alias A]","","slash commands:"," /help show this help"," /exit exit the REPL",""].join(`
1374
1374
  `)),0}function Vj(t){t.stderr.write(`commands: /help, /exit
1375
- `)}function ns(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function ci(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?w(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=Rj("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return w(t,"not in a git repo; use --project <name>")}let o=Lh(s),i=e.listProjects().find(a=>Lh(a.local_path)===o);return i===void 0?w(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function ui(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?w(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?w(t,`project ${r.name} has no assigned team; use --team <name>`):s}function di(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?w(t,`member not found: ${n}`):o}let s=Dh(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?w(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function nn(t,e,r,n){let s=ci(t,e,r);if(typeof s=="number")return s;let o=ui(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function Dh(t){return t.filter(e=>e.state!=="retired")}async function Kj(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1376
- `),Jo(r,e),Go(r);let s=await Gr({member:n,dal:e}),o=e.updateTeamMemberSession(n.id,s.sessionid);if(o===null)throw new Error(`member disappeared during seed: ${n.alias}`);let i=Zr(ve(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
1375
+ `)}function ns(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function ui(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?w(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=Rj("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return w(t,"not in a git repo; use --project <name>")}let o=Lh(s),i=e.listProjects().find(a=>Lh(a.local_path)===o);return i===void 0?w(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function di(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?w(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?w(t,`project ${r.name} has no assigned team; use --team <name>`):s}function fi(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?w(t,`member not found: ${n}`):o}let s=Dh(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?w(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function nn(t,e,r,n){let s=ui(t,e,r);if(typeof s=="number")return s;let o=di(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function Dh(t){return t.filter(e=>e.state!=="retired")}async function Kj(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1376
+ `),Xo(r,e),Vo(r);let s=await Gr({member:n,dal:e}),o=e.updateTeamMemberSession(n.id,s.sessionid);if(o===null)throw new Error(`member disappeared during seed: ${n.alias}`);let i=Zr(ve(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
1377
1377
  ${i}
1378
- `),await li({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
1378
+ `),await ci({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
1379
1379
 
1380
- ${zr}`:zr;return e.setMemberPromptSnapshot(o.id,l)??o}function Yj(t){return`${Oj(t.local_path)}-code`}var Ch,Pc=b(()=>{"use strict";Jn();xo();zn();gc();wc();Pe();Qr();Cc();$e();hc();Ch="spec-driven-task"});import Fh from"jexl";function nr(t){Fh.compile(Uh(t))}async function $r(t,e){return Fh.eval(Uh(t),e)}function Uh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var sn=b(()=>{"use strict"});import{z as y}from"zod";function Jc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var zj,Wh,Fc,Uc,Wc,Bc,qc,Hc,Bh,Zj,Qj,eN,os,tN,fi,mi,pi,hi,_i,qh,rN,nN,sN,oN,gi,on=b(()=>{"use strict";sn();zj=y.object({kind:y.enum(["success","neutral","failure"])}),Wh=y.enum(["string","number","boolean","object","array"]),Fc=y.object({name:y.string().min(1),type:Wh,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),Uc=y.object({name:y.string().min(1),type:Wh,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),Wc=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),Bc="__failure__",qc=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),Hc=y.object({on_unhandled_failure:y.object({attention_kind:y.string().min(1).default("workflow_failed"),severity:y.enum(["warn","error","critical"]).default("warn"),capture_evidence:y.boolean().default(!0),recommend_recovery:y.string().min(1).optional()}).optional(),on_unhandled_failure_state:y.string().min(1).optional()}).optional(),Bh=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),Zj=y.object({name:y.string().min(1),command:y.string().min(1).optional(),args:y.array(y.string()).optional(),env:y.record(y.string(),y.string()).optional(),type:y.enum(["stdio","http","sse"]).optional(),url:y.string().min(1).optional(),headers:y.record(y.string(),y.string()).optional()}).strict(),Qj=y.union([y.string().min(1),Zj]),eN=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),os=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(Qj).optional(),skills:y.array(eN).optional()}),tN=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),fi=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:os,pre_checks:y.array(tN).optional(),reviewers:y.array(os.extend({rubric_artifact:y.string().optional()})).optional(),outcomes:y.object({approve:y.string().min(1),request_changes:y.string().optional(),fail_pre_check:y.string().optional(),max_loops_exceeded:y.string().optional()}),writes_to_project_path:y.boolean().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional(),max_loops:y.number().int().positive().default(5),loop_feedback_artifact:y.string().optional(),outcomes_from_stance:y.record(y.string(),y.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),mi=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(os.extend({topic:y.string().min(1)})).optional(),consolidator:os,outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),research_artifact_prefix:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),pi=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:os.extend({initial_prompt_template:y.string().min(1)}),termination:y.object({operator_signal:y.boolean().default(!0),agent_signal:y.string().optional(),max_turns:y.number().int().positive().default(20),timeout_seconds:y.number().int().positive().optional()}),outcomes:y.object({done:y.string().min(1),timeout:y.string().optional()}),artifact_name:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),hi=y.object({type:y.literal("Loop"),state_name:y.string().min(1),over:y.string().min(1),item_var:y.string().min(1),body:y.string().min(1),outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),stop_on_error:y.boolean().default(!0),max_items:y.number().int().positive().default(1e3)}),_i=y.object({type:y.literal("ShellStep"),state_name:y.string().min(1),command:y.string().min(1),outcomes_from_exit:y.record(y.string(),y.string().min(1)),timeout_ms:y.number().int().nonnegative().optional(),capture_output_to:y.string().optional(),writes_to_project_path:y.boolean().optional()}),qh=y.object({type:y.literal("Choice"),state_name:y.string().min(1),branches:y.array(y.object({when:y.string().min(1),next:y.string().min(1)})).default([]),default_next:y.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{nr(Jc(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),rN=y.discriminatedUnion("type",[Bh,fi,mi,pi,hi,_i,qh]),nN=y.object({type:y.literal("ForEach"),state_name:y.string().min(1),items_from:y.string().min(1),mode:y.enum(["sequential","parallel"]).default("sequential"),max_concurrency:y.number().int().positive().default(1),on_item_failure:y.enum(["continue","stop"]).default("stop"),body:rN,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{nr(Jc(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),sN=y.object({type:y.literal("Subflow"),state_name:y.string().min(1),workflow_name:y.string().min(1),inputs:y.record(y.string(),y.string().min(1)).optional(),outcomes:y.record(y.string(),y.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{nr(Jc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),oN=y.discriminatedUnion("type",[Bh,fi,mi,pi,hi,_i,qh,nN,sN]),gi=y.object({name:y.string().min(1),version:y.number().int().positive(),definition_schema_version:y.union([y.literal(1),y.literal(2)]),description:y.string().optional(),estimated_duration_ms:y.number().int().nonnegative().optional(),primitive_version:y.union([y.literal(1),y.literal(2)]).default(1),start_at:y.string().min(1),states:y.record(y.string().min(1),oN),terminals:y.record(y.string().min(1),zj),errors:Hc,concurrency_key:y.string().min(1).optional(),concurrent_limit:y.number().int().positive().optional(),default_task_timeout_ms:y.number().int().positive().max(216e5).optional(),inputs:y.array(Fc).optional(),outputs:y.array(Uc).optional(),triggers:y.array(Wc).optional(),read_only:y.boolean().optional(),requires:qc}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z}from"zod";var iN,wi,aN,lN,cN,wt,an=b(()=>{"use strict";on();iN=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,wi=z.string().regex(iN),aN=z.object({step_id:wi,type:z.literal("main"),index:z.number().int().min(0)}),lN=z.record(wi,z.record(z.string().min(1),z.array(z.array(aN)))),cN=z.object({id:wi,name:z.string().min(1),type:z.string().min(1),typeVersion:z.number().int().positive().default(1),parameters:z.record(z.string(),z.unknown()).default({}),members:z.record(z.string(),z.unknown()).optional(),estimated_duration_ms:z.number().int().nonnegative().optional()}),wt=z.object({schema_version:z.literal("lmctl/v3"),definition_schema_version:z.literal(3),name:z.string().min(1),version:z.number().int().positive(),description:z.string().optional(),estimated_duration_ms:z.number().int().nonnegative().optional(),default_task_timeout_ms:z.number().int().positive().max(216e5).optional(),concurrency_key:z.string().min(1).optional(),concurrent_limit:z.number().int().positive().optional(),errors:Hc,inputs:z.array(Fc).optional(),outputs:z.array(Uc).optional(),steps:z.array(cN).min(1),connections:lN.default({}),entry_step_id:wi,triggers:z.array(Wc).optional(),read_only:z.boolean().optional(),requires:qc}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function yi(t){return Gc(t)}function Gc(t){if(Array.isArray(t))return t.map(Gc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Gc(e[n]);if(typeof r.type=="string"){let n=dN[r.type];n!==void 0&&(r.type=n)}return r}var Xc,uN,dN,Vc=b(()=>{"use strict";Xc="lmctl.builtin.",uN={Review:`${Xc}Review`,Research:`${Xc}Research`,Consolidate:`${Xc}Consolidate`},dN=Object.fromEntries(Object.entries(uN).map(([t,e])=>[e,t]))});import{readFileSync as fN}from"node:fs";function Xh(t){return mN(t)}function mN(t){let e=yi(_N(t));if(hN(e),Gh(e)===3)return pN(e);let r=gi.safeParse(e);if(!r.success)throw new Lt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=gN(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Lt(n);return r.data}function pN(t){let e=wt.safeParse(t);if(!e.success)throw new Lt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function hN(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Gh(t);if(!(e===null||Hh.includes(e)))throw new Lt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Hh.join(", ")}`}]})}function Gh(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function _N(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1381
- `)||e.startsWith("{")||e.startsWith("[")?Jh(t,"$"):e.endsWith(".json")?Jh(fN(e,"utf8"),e):t}function Jh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Lt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function gN(t){let e=[],r=[],n=new Set(Object.keys(t.states));n.has(t.start_at)||r.push({state:"$",ref:t.start_at,kind:"next"}),wN(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function wN(t,e,r){let n=t.errors?.on_unhandled_failure_state;n!==void 0&&(e.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var Hh,Lt,Vh=b(()=>{"use strict";on();an();Vc();Hh=[1,2,3],Lt=class extends Error{errors;unresolvedRefs;constructor(e){super(e.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=e.errors??[],this.unresolvedRefs=e.unresolvedRefs??[]}}});import{createHash as yN}from"node:crypto";function Kh(t,e){let r=EN(e),n=yN("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function EN(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Yh=b(()=>{"use strict";an()});function TN(t,e){let r=SN[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function e_(t){let e=[],r=(I,$)=>{throw new ln([{line:I,message:$}])},n=t.split(`
1382
- `),s=[];for(let I=0;I<n.length;I+=1){let O=IN(n[I]).trim();O.length>0&&s.push({n:I+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(I,$,O,B,F,L)=>{l.has(I)&&r(B,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(B,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:$,params:O,line:B,isTerminal:F,...L?{members:L}:{}}),u.push(I)},T=I=>{let $=[],O=I+1;for(;O<s.length;O+=1){let B=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(B===null)break;$.push({label:B[1],dst:B[2]})}return{branches:$,nextIdx:O-1}};for(let I=1;I<s.length;I+=1){let{n:$,text:O}=s[I],B=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){I!==1&&r($,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let F=/^meta\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),L=sr(F[1],$,r);for(let Q of Object.keys(L))Zh.has(Q)||r($,`unknown \`meta\` key \`${Q}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Zh].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(B==="step"){let F=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),L=F[1],Q=F[2],_e=F[3],oe=zh[Q];oe===void 0&&r($,`unknown step type: ${Q} (supported \`step\` archetypes: ${Object.keys(zh).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:St}=TN(oe,sr(_e,$,r));_(L,oe,we,$,!1,Object.keys(St).length>0?St:void 0);continue}if(B==="trigger"){let F=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),L=F[1],Q=F[2],_e=F[3],oe=Qh[Q];oe===void 0&&r($,`unknown trigger type: ${Q} (registered trigger archetypes: ${Object.keys(Qh).join(", ")})`),p.has(L)&&r($,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:oe,parameters:sr(_e,$,r)});continue}if(B==="mcp"||B==="skill"){let F=new RegExp(`^${B}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r($,`malformed \`${B}\` decl (expected \`${B} <name> = {json} | ${B} <name> = "<file|url>"\`): ${O}`),L=F[1],Q=F[2].trim(),_e=B==="mcp"?h:g;_e.has(L)&&r($,`duplicate ${B} declaration: ${L}`);let oe;if(Q.startsWith("{")){let we=sr(Q,$,r);B==="mcp"?oe={...we,name:L}:((typeof we.content!="string"||we.content.length===0)&&r($,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:L,content:we.content})}else{let we=t_(Q);(typeof we!="string"||we.length===0)&&r($,`\`${B} ${L}\`: string form must be a non-empty file path or http(s) URL`),oe=we}_e.set(L,oe);continue}if(B==="terminal"){let F=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r($,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(F[1],"lmctl/terminal",{name:F[2],kind:F[3]??"neutral"},$,!0);continue}if(B==="seq"){let L=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Q=>Q.trim()).filter(Q=>Q.length>0);(L.length<3||L.length%2===0)&&r($,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let Q=0;Q+2<L.length+1&&!(Q+2>L.length-1);Q+=2){let _e=L[Q],oe=L[Q+1],we=L[Q+2],St=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:_e,port:St,dstDeclId:we,line:$})}continue}if(B==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r($,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],Q=[],_e,oe=I+1;for(;oe<s.length;oe+=1){let we=s[oe].text,St=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(St!==null){_e!==void 0&&r(s[oe].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let $n=St[2];Q.push({when:St[1].trim(),next:`@terminal:${$n}`}),c.push({srcDeclId:L,port:$n,dstDeclId:St[3],line:s[oe].n});continue}let qa=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(qa!==null){_e!==void 0&&r(s[oe].n,`\`choice ${L}\` has more than one \`default\``);let $n=qa[1];_e=`@terminal:${$n}`,c.push({srcDeclId:L,port:$n,dstDeclId:qa[2],line:s[oe].n});continue}break}Q.length===0&&r($,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:Q,..._e!==void 0?{default_next:_e}:{}},$,!1),I=oe-1;continue}if(B==="loop"){let F=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(F[1],"lmctl/loop",sr(F[2],$,r),$,!1);continue}if(B==="foreach"){let F=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),L=sr(F[2],$,r);"mode"in L&&r($,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(F[1],"lmctl/foreach",L,$,!1);continue}if(B==="call"){let F=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),L=F[1],Q=sr(F[2],$,r),_e=Q.workflow;(typeof _e!="string"||_e.length===0)&&r($,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...we}=Q;_(L,"lmctl/subflow",{workflow_name:_e,...we},$,!1),d.push({declId:L,target:_e,line:$});continue}if(B==="decide"){let F=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r($,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),L=F[1],Q=sr(F[2],$,r),{branches:_e,nextIdx:oe}=T(I);_e.length===0&&r($,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},$,!1,{agent:Q});for(let we of _e)c.push({srcDeclId:L,port:we.label,dstDeclId:we.dst,line:$});I=oe;continue}if(B==="entry"){let F=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r($,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r($,`duplicate \`entry\` (already set to ${f})`),f=F[1];continue}r($,`unknown statement \`${B}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=I=>{if(Array.isArray(I)){for(let O of I)E(O);return}if(typeof I!="object"||I===null)return;let $=I;if(typeof $.alias=="string")for(let[O,B]of[["mcp",h],["skills",g]]){let F=$[O];Array.isArray(F)&&($[O]=F.map(L=>typeof L=="string"&&B.has(L)?structuredClone(B.get(L)):L))}for(let O of Object.values($))E(O)};for(let I of u){let $=l.get(I);$.members!==void 0&&E($.members)}let v=I=>Kh(i,I),x=u.map(I=>{let $=l.get(I);return{id:v(I),name:I,type:$.type,typeVersion:1,parameters:$.params,...$.members?{members:$.members}:{}}}),k={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let $=v(I.srcDeclId);k[$]??={},k[$][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),k[$][I.port]=[[{step_id:v(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let $=l.get(I);kN.has($.type)||r($.line,`unknown archetype \`${$.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let I of c){let $=R.get(I.srcDeclId);$===void 0?R.set(I.srcDeclId,[I.dstDeclId]):$.push(I.dstDeclId)}for(let I of u){let $=l.get(I);if($.type!=="lmctl/loop")continue;let O=$.params.body;if(typeof O=="string"&&l.has(O)){let B=R.get(I);B===void 0?R.set(I,[O]):B.push(O)}}let C=new Set([f]),q=[f];for(;q.length>0;){let I=q.shift();for(let $ of R.get(I)??[])C.has($)||(C.add($),q.push($))}for(let I of u)C.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let te=new Map;for(let I of c){let $=te.get(I.srcDeclId);$===void 0&&($=new Set,te.set(I.srcDeclId,$)),$.add(I.port)}let j=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let $=l.get(I);if($.isTerminal)continue;let O=te.get(I)??new Set;if($.type==="lmctl/review"){let F=[...O].some(L=>!j.has(L));!O.has("approve")&&!F&&r($.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let B=vN[$.type];if(B!==void 0)for(let F of B)O.has(F)||r($.line,`uncovered outcome: required outcome \`${F}\` of step \`${I}\` (\`${$.type}\`) has no connection \u2014 route it (\`seq ${I} -${F}-> <target|terminal>\`)`);else O.size===0&&r($.line,`uncovered outcome: non-terminal step \`${I}\` (\`${$.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let $=l.get(I),O=bN[$.type];if(O===void 0)continue;let B={...$.params,...$.members??{},type:O.v2type,state_name:I,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},F=O.schema.safeParse(B);if(!F.success){let L=F.error.issues[0],Q=L.path.length===0?"$":L.path.map(String).join(".");r($.line,`step \`${I}\` (\`${$.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${Q}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${$.type.replace("lmctl/","")}({ ... })\``)}}let H={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:x,connections:k,entry_step_id:v(f)},me=wt.safeParse(H);if(!me.success)throw new ln(me.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return me.data}function IN(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function sr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of xN(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=t_(l)}return s}function xN(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function t_(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var bN,SN,zh,ln,kN,vN,Zh,Qh,r_=b(()=>{"use strict";an();Yh();on();bN={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:fi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:mi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:pi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:hi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:_i}},SN={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};zh={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"},ln=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1380
+ ${zr}`:zr;return e.setMemberPromptSnapshot(o.id,l)??o}function Yj(t){return`${Oj(t.local_path)}-code`}var Ch,Uc=b(()=>{"use strict";Jn();$o();zn();yc();Ec();Pe();Qr();Dc();$e();gc();Ch="spec-driven-task"});import Fh from"jexl";function nr(t){Fh.compile(Uh(t))}async function $r(t,e){return Fh.eval(Uh(t),e)}function Uh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var sn=b(()=>{"use strict"});import{z as y}from"zod";function Gc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var zj,Wh,Wc,Bc,qc,Hc,Jc,Xc,Bh,Zj,Qj,eN,os,tN,mi,pi,hi,_i,gi,qh,rN,nN,sN,oN,wi,on=b(()=>{"use strict";sn();zj=y.object({kind:y.enum(["success","neutral","failure"])}),Wh=y.enum(["string","number","boolean","object","array"]),Wc=y.object({name:y.string().min(1),type:Wh,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),Bc=y.object({name:y.string().min(1),type:Wh,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),qc=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),Hc="__failure__",Jc=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),Xc=y.object({on_unhandled_failure:y.object({attention_kind:y.string().min(1).default("workflow_failed"),severity:y.enum(["warn","error","critical"]).default("warn"),capture_evidence:y.boolean().default(!0),recommend_recovery:y.string().min(1).optional()}).optional(),on_unhandled_failure_state:y.string().min(1).optional()}).optional(),Bh=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),Zj=y.object({name:y.string().min(1),command:y.string().min(1).optional(),args:y.array(y.string()).optional(),env:y.record(y.string(),y.string()).optional(),type:y.enum(["stdio","http","sse"]).optional(),url:y.string().min(1).optional(),headers:y.record(y.string(),y.string()).optional()}).strict(),Qj=y.union([y.string().min(1),Zj]),eN=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),os=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(Qj).optional(),skills:y.array(eN).optional()}),tN=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),mi=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:os,pre_checks:y.array(tN).optional(),reviewers:y.array(os.extend({rubric_artifact:y.string().optional()})).optional(),outcomes:y.object({approve:y.string().min(1),request_changes:y.string().optional(),fail_pre_check:y.string().optional(),max_loops_exceeded:y.string().optional()}),writes_to_project_path:y.boolean().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional(),max_loops:y.number().int().positive().default(5),loop_feedback_artifact:y.string().optional(),outcomes_from_stance:y.record(y.string(),y.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),pi=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(os.extend({topic:y.string().min(1)})).optional(),consolidator:os,outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),research_artifact_prefix:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),hi=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:os.extend({initial_prompt_template:y.string().min(1)}),termination:y.object({operator_signal:y.boolean().default(!0),agent_signal:y.string().optional(),max_turns:y.number().int().positive().default(20),timeout_seconds:y.number().int().positive().optional()}),outcomes:y.object({done:y.string().min(1),timeout:y.string().optional()}),artifact_name:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),_i=y.object({type:y.literal("Loop"),state_name:y.string().min(1),over:y.string().min(1),item_var:y.string().min(1),body:y.string().min(1),outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),stop_on_error:y.boolean().default(!0),max_items:y.number().int().positive().default(1e3)}),gi=y.object({type:y.literal("ShellStep"),state_name:y.string().min(1),command:y.string().min(1),outcomes_from_exit:y.record(y.string(),y.string().min(1)),timeout_ms:y.number().int().nonnegative().optional(),capture_output_to:y.string().optional(),writes_to_project_path:y.boolean().optional()}),qh=y.object({type:y.literal("Choice"),state_name:y.string().min(1),branches:y.array(y.object({when:y.string().min(1),next:y.string().min(1)})).default([]),default_next:y.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{nr(Gc(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),rN=y.discriminatedUnion("type",[Bh,mi,pi,hi,_i,gi,qh]),nN=y.object({type:y.literal("ForEach"),state_name:y.string().min(1),items_from:y.string().min(1),mode:y.enum(["sequential","parallel"]).default("sequential"),max_concurrency:y.number().int().positive().default(1),on_item_failure:y.enum(["continue","stop"]).default("stop"),body:rN,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{nr(Gc(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),sN=y.object({type:y.literal("Subflow"),state_name:y.string().min(1),workflow_name:y.string().min(1),inputs:y.record(y.string(),y.string().min(1)).optional(),outcomes:y.record(y.string(),y.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{nr(Gc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),oN=y.discriminatedUnion("type",[Bh,mi,pi,hi,_i,gi,qh,nN,sN]),wi=y.object({name:y.string().min(1),version:y.number().int().positive(),definition_schema_version:y.union([y.literal(1),y.literal(2)]),description:y.string().optional(),estimated_duration_ms:y.number().int().nonnegative().optional(),primitive_version:y.union([y.literal(1),y.literal(2)]).default(1),start_at:y.string().min(1),states:y.record(y.string().min(1),oN),terminals:y.record(y.string().min(1),zj),errors:Xc,concurrency_key:y.string().min(1).optional(),concurrent_limit:y.number().int().positive().optional(),default_task_timeout_ms:y.number().int().positive().max(216e5).optional(),inputs:y.array(Wc).optional(),outputs:y.array(Bc).optional(),triggers:y.array(qc).optional(),read_only:y.boolean().optional(),requires:Jc}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var iN,yi,aN,lN,cN,wt,an=b(()=>{"use strict";on();iN=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,yi=Q.string().regex(iN),aN=Q.object({step_id:yi,type:Q.literal("main"),index:Q.number().int().min(0)}),lN=Q.record(yi,Q.record(Q.string().min(1),Q.array(Q.array(aN)))),cN=Q.object({id:yi,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),wt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:Xc,inputs:Q.array(Wc).optional(),outputs:Q.array(Bc).optional(),steps:Q.array(cN).min(1),connections:lN.default({}),entry_step_id:yi,triggers:Q.array(qc).optional(),read_only:Q.boolean().optional(),requires:Jc}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Ei(t){return Kc(t)}function Kc(t){if(Array.isArray(t))return t.map(Kc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Kc(e[n]);if(typeof r.type=="string"){let n=dN[r.type];n!==void 0&&(r.type=n)}return r}var Vc,uN,dN,Yc=b(()=>{"use strict";Vc="lmctl.builtin.",uN={Review:`${Vc}Review`,Research:`${Vc}Research`,Consolidate:`${Vc}Consolidate`},dN=Object.fromEntries(Object.entries(uN).map(([t,e])=>[e,t]))});import{readFileSync as fN}from"node:fs";function Xh(t){return mN(t)}function mN(t){let e=Ei(_N(t));if(hN(e),Gh(e)===3)return pN(e);let r=wi.safeParse(e);if(!r.success)throw new Lt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=gN(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Lt(n);return r.data}function pN(t){let e=wt.safeParse(t);if(!e.success)throw new Lt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function hN(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Gh(t);if(!(e===null||Hh.includes(e)))throw new Lt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Hh.join(", ")}`}]})}function Gh(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function _N(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1381
+ `)||e.startsWith("{")||e.startsWith("[")?Jh(t,"$"):e.endsWith(".json")?Jh(fN(e,"utf8"),e):t}function Jh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Lt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function gN(t){let e=[],r=[],n=new Set(Object.keys(t.states));n.has(t.start_at)||r.push({state:"$",ref:t.start_at,kind:"next"}),wN(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function wN(t,e,r){let n=t.errors?.on_unhandled_failure_state;n!==void 0&&(e.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var Hh,Lt,Vh=b(()=>{"use strict";on();an();Yc();Hh=[1,2,3],Lt=class extends Error{errors;unresolvedRefs;constructor(e){super(e.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=e.errors??[],this.unresolvedRefs=e.unresolvedRefs??[]}}});import{createHash as yN}from"node:crypto";function Kh(t,e){let r=EN(e),n=yN("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function EN(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Yh=b(()=>{"use strict";an()});function TN(t,e){let r=SN[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function e_(t){let e=[],r=(x,$)=>{throw new ln([{line:x,message:$}])},n=t.split(`
1382
+ `),s=[];for(let x=0;x<n.length;x+=1){let R=IN(n[x]).trim();R.length>0&&s.push({n:x+1,text:R})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(x,$,R,H,U,L)=>{l.has(x)&&r(H,`duplicate step/terminal id: ${x}`),/^[A-Za-z][\w-]*$/.test(x)||r(H,`invalid id (must start with a letter): ${x}`),l.set(x,{declId:x,type:$,params:R,line:H,isTerminal:U,...L?{members:L}:{}}),u.push(x)},T=x=>{let $=[],R=x+1;for(;R<s.length;R+=1){let H=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[R].text);if(H===null)break;$.push({label:H[1],dst:H[2]})}return{branches:$,nextIdx:R-1}};for(let x=1;x<s.length;x+=1){let{n:$,text:R}=s[x],H=R.split(/\s+/,1)[0];if(/^meta\s*\(/.test(R)){x!==1&&r($,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let U=/^meta\s*\((.*)\)\s*$/.exec(R)??r($,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${R}`),L=sr(U[1],$,r);for(let te of Object.keys(L))Zh.has(te)||r($,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Zh].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(H==="step"){let U=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(R)??r($,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${R}`),L=U[1],te=U[2],_e=U[3],ie=zh[te];ie===void 0&&r($,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(zh).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:St}=TN(ie,sr(_e,$,r));_(L,ie,we,$,!1,Object.keys(St).length>0?St:void 0);continue}if(H==="trigger"){let U=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(R)??r($,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${R}`),L=U[1],te=U[2],_e=U[3],ie=Qh[te];ie===void 0&&r($,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(Qh).join(", ")})`),p.has(L)&&r($,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:ie,parameters:sr(_e,$,r)});continue}if(H==="mcp"||H==="skill"){let U=new RegExp(`^${H}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(R)??r($,`malformed \`${H}\` decl (expected \`${H} <name> = {json} | ${H} <name> = "<file|url>"\`): ${R}`),L=U[1],te=U[2].trim(),_e=H==="mcp"?h:g;_e.has(L)&&r($,`duplicate ${H} declaration: ${L}`);let ie;if(te.startsWith("{")){let we=sr(te,$,r);H==="mcp"?ie={...we,name:L}:((typeof we.content!="string"||we.content.length===0)&&r($,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:L,content:we.content})}else{let we=t_(te);(typeof we!="string"||we.length===0)&&r($,`\`${H} ${L}\`: string form must be a non-empty file path or http(s) URL`),ie=we}_e.set(L,ie);continue}if(H==="terminal"){let U=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(R)??r($,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${R}`);_(U[1],"lmctl/terminal",{name:U[2],kind:U[3]??"neutral"},$,!0);continue}if(H==="seq"){let L=R.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(L.length<3||L.length%2===0)&&r($,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${R}`);for(let te=0;te+2<L.length+1&&!(te+2>L.length-1);te+=2){let _e=L[te],ie=L[te+1],we=L[te+2],St=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:St,dstDeclId:we,line:$})}continue}if(H==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(R)??r($,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${R}`))[1],te=[],_e,ie=x+1;for(;ie<s.length;ie+=1){let we=s[ie].text,St=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(St!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let $n=St[2];te.push({when:St[1].trim(),next:`@terminal:${$n}`}),c.push({srcDeclId:L,port:$n,dstDeclId:St[3],line:s[ie].n});continue}let Ha=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Ha!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\` has more than one \`default\``);let $n=Ha[1];_e=`@terminal:${$n}`,c.push({srcDeclId:L,port:$n,dstDeclId:Ha[2],line:s[ie].n});continue}break}te.length===0&&r($,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},$,!1),x=ie-1;continue}if(H==="loop"){let U=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(R)??r($,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${R}`);_(U[1],"lmctl/loop",sr(U[2],$,r),$,!1);continue}if(H==="foreach"){let U=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(R)??r($,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${R}`),L=sr(U[2],$,r);"mode"in L&&r($,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(U[1],"lmctl/foreach",L,$,!1);continue}if(H==="call"){let U=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(R)??r($,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${R}`),L=U[1],te=sr(U[2],$,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r($,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...we}=te;_(L,"lmctl/subflow",{workflow_name:_e,...we},$,!1),d.push({declId:L,target:_e,line:$});continue}if(H==="decide"){let U=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(R)??r($,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${R}`),L=U[1],te=sr(U[2],$,r),{branches:_e,nextIdx:ie}=T(x);_e.length===0&&r($,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},$,!1,{agent:te});for(let we of _e)c.push({srcDeclId:L,port:we.label,dstDeclId:we.dst,line:$});x=ie;continue}if(H==="entry"){let U=/^entry\s+([A-Za-z][\w-]*)$/.exec(R)??r($,`malformed \`entry\` (expected \`entry <id>\`): ${R}`);f!==void 0&&r($,`duplicate \`entry\` (already set to ${f})`),f=U[1];continue}r($,`unknown statement \`${H}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=x=>{if(Array.isArray(x)){for(let R of x)E(R);return}if(typeof x!="object"||x===null)return;let $=x;if(typeof $.alias=="string")for(let[R,H]of[["mcp",h],["skills",g]]){let U=$[R];Array.isArray(U)&&($[R]=U.map(L=>typeof L=="string"&&H.has(L)?structuredClone(H.get(L)):L))}for(let R of Object.values($))E(R)};for(let x of u){let $=l.get(x);$.members!==void 0&&E($.members)}let v=x=>Kh(i,x),I=u.map(x=>{let $=l.get(x);return{id:v(x),name:x,type:$.type,typeVersion:1,parameters:$.params,...$.members?{members:$.members}:{}}}),k={};for(let x of c){l.has(x.srcDeclId)||r(x.line,`edge source references undeclared step: ${x.srcDeclId}`),l.has(x.dstDeclId)||r(x.line,`dangling edge target: ${x.dstDeclId} is not declared`),l.get(x.srcDeclId).isTerminal&&r(x.line,`terminal \`${x.srcDeclId}\` cannot have an outgoing edge`);let $=v(x.srcDeclId);k[$]??={},k[$][x.port]!==void 0&&r(x.line,`duplicate edge port \`${x.port}\` on step \`${x.srcDeclId}\``),k[$][x.port]=[[{step_id:v(x.dstDeclId),type:"main",index:0}]]}for(let x of u){let $=l.get(x);kN.has($.type)||r($.line,`unknown archetype \`${$.type}\` for step \`${x}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let x of d)x.target===i&&r(x.line,`subflow cycle: \`call ${x.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let P=new Map;for(let x of c){let $=P.get(x.srcDeclId);$===void 0?P.set(x.srcDeclId,[x.dstDeclId]):$.push(x.dstDeclId)}for(let x of u){let $=l.get(x);if($.type!=="lmctl/loop")continue;let R=$.params.body;if(typeof R=="string"&&l.has(R)){let H=P.get(x);H===void 0?P.set(x,[R]):H.push(R)}}let q=new Set([f]),O=[f];for(;O.length>0;){let x=O.shift();for(let $ of P.get(x)??[])q.has($)||(q.add($),O.push($))}for(let x of u)q.has(x)||r(l.get(x).line,`step \`${x}\` is unreachable from entry \`${f}\``);let G=new Map;for(let x of c){let $=G.get(x.srcDeclId);$===void 0&&($=new Set,G.set(x.srcDeclId,$)),$.add(x.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let x of u){let $=l.get(x);if($.isTerminal)continue;let R=G.get(x)??new Set;if($.type==="lmctl/review"){let U=[...R].some(L=>!A.has(L));!R.has("approve")&&!U&&r($.line,`uncovered outcome: review step \`${x}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${x} -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 H=vN[$.type];if(H!==void 0)for(let U of H)R.has(U)||r($.line,`uncovered outcome: required outcome \`${U}\` of step \`${x}\` (\`${$.type}\`) has no connection \u2014 route it (\`seq ${x} -${U}-> <target|terminal>\`)`);else R.size===0&&r($.line,`uncovered outcome: non-terminal step \`${x}\` (\`${$.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let x of u){let $=l.get(x),R=bN[$.type];if(R===void 0)continue;let H={...$.params,...$.members??{},type:R.v2type,state_name:x,...Object.keys(R.outcomes).length>0?{outcomes:R.outcomes}:{}},U=R.schema.safeParse(H);if(!U.success){let L=U.error.issues[0],te=L.path.length===0?"$":L.path.map(String).join(".");r($.line,`step \`${x}\` (\`${$.type}\`) has invalid params for archetype \`${R.v2type}\` at \`${te}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${x} = ${$.type.replace("lmctl/","")}({ ... })\``)}}let F={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:k,entry_step_id:v(f)},z=wt.safeParse(F);if(!z.success)throw new ln(z.error.issues.map(x=>({line:s[0].n,message:`emitted V3 invalid at ${x.path.length===0?"$":x.path.map(String).join(".")}: ${x.message}`})));return z.data}function IN(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function sr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of xN(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=t_(l)}return s}function xN(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function t_(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var bN,SN,zh,ln,kN,vN,Zh,Qh,r_=b(()=>{"use strict";an();Yh();on();bN={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:mi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:pi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:hi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:_i},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:gi}},SN={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};zh={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"},ln=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1383
1383
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1384
1384
  `)}`),this.issues=e,this.name="DslCompileError"}},kN=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"]),vN={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},Zh=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),Qh={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as $N}from"node:fs";function jN(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function NN(t){for(let e of t.split(`
1385
- `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Ce(t){if(typeof t=="string"&&jN()&&NN(t)){let r;try{r=e_(t)}catch(s){throw s instanceof ln?new Ct(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=wt.safeParse(r);if(!n.success)throw new Ct(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=yi(RN(t));if(ON(e)&&e.definition_schema_version===3){let r=wt.safeParse(e);if(!r.success)throw new Ct(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return AN(e)}function AN(t){let e=gi.safeParse(t);if(!e.success)throw new Ct(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new Ct([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Xh(r)}catch(s){throw s instanceof Lt?new Kc(s):s}}function RN(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1386
- `)||e.startsWith("{")||e.startsWith("[")?n_(t):e.endsWith(".json")?n_($N(e,"utf8")):t}function n_(t){return JSON.parse(t)}function ON(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Kc,Ct,cn=b(()=>{"use strict";on();Vh();Vc();an();r_();Kc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Ct=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Ei(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:LN(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:MN(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function LN(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=CN(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function CN(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function MN(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Yc=b(()=>{"use strict"});var s_={};le(s_,{enqueueFromAgentOutput:()=>PN,enqueueFromGitHubIssue:()=>zc,enqueueManual:()=>DN,enqueueScheduled:()=>FN});function zc(t,e){return Si(t,{project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:"gh_issue",source_ref:e.issue_url,dedupe_key:e.dedupe_key??e.issue_url,payload:bi(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function DN(t,e){return Si(t,{project_id:e.project_id,workflow_id_override:null,source:"manual",source_ref:e.source_ref??null,dedupe_key:e.source_ref??null,payload:bi(e.payload),concurrency_key:e.concurrency_key})}function PN(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Si(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:bi(e.payload),concurrency_key:e.concurrency_key})}function FN(t,e){return Si(t,{project_id:e.project_id,workflow_id_override:null,source:"schedule",source_ref:e.source_ref,dedupe_key:e.source_ref,available_at:e.available_at,payload:bi(e.payload),concurrency_key:e.concurrency_key})}function bi(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Si(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Ce(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Ei({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Zc=b(()=>{"use strict";cn();Yc()});async function i_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return o_(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await UN(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...WN(o.parameters_override)},l=o_(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function o_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[zc(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function UN(t,e){if(t===null||t.trim().length===0)return!0;try{return await $r(t,e)===!0}catch{return!1}}function WN(t){if(t===null||t.trim().length===0)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}var a_=b(()=>{"use strict";sn();Zc()});import{spawnSync as BN}from"node:child_process";async function eu(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=BN(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!HN(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await i_({dal:t.dal,project:t.project,issue:JN(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function un(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=qN(r.intake_config);try{let s=await eu({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function qN(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Qc(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function HN(t){return Array.isArray(t)&&t.every(e=>{if(!Qc(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:Qc(n)&&typeof n.name=="string"))})}function JN(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function Qc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ti=b(()=>{"use strict";a_()});function c_(t){return async e=>GN(t.app,e,t.log!==void 0?{log:t.log}:{})}async function GN(t,e,r={}){let n=VN(e.path),s={"content-type":"application/json",...e.headers??{},[ki]:tu},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await KN(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${l_(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${l_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function l_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function VN(t){let e=t.startsWith("/")?t:`/${t}`;return`${XN}${e}`}async function KN(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==ki&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var ki,tu,XN,ru=b(()=>{"use strict";ki="x-mailbox-channel",tu="1",XN="http://mailbox.local"});import{createHash as u_,createHmac as YN,timingSafeEqual as zN}from"node:crypto";function d_(){return async(t,e)=>{let r=f_();if(r===null||rA(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(ki)===tu){await e();return}let n=t.req.query("token");if(n!==void 0&&vi(n,r)){su(t,r),await e();return}if(tA(t,r)){await e();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function f_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function m_(t){let e=f_();return e!==null&&vi(t,e)}function su(t,e,r=new Date){t.header("Set-Cookie",`${nu}=${QN(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function p_(t){t.header("Set-Cookie",`${nu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function QN(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+ZN*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${h_(t,n)}`,"utf8").toString("base64url")}function eA(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:vi(s[2],h_(e,`${s[0]}|${s[1]}`))}function vi(t,e){return zN(u_("sha256").update(t).digest(),u_("sha256").update(e).digest())}function tA(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&vi(r,e))return!0;let n=nA(t.req.header("cookie")??"")[nu];return n!==void 0&&eA(n,e)}function rA(t){return t==="/login"||t==="/logout"}function nA(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function h_(t,e){return YN("sha256",t).update(e).digest("hex")}var nu,ZN,__=b(()=>{"use strict";ru();nu="lmctl_next_session",ZN=30});import{existsSync as dn,mkdirSync as sA,readdirSync as oA,readFileSync as Ii,unlinkSync as iA,writeFileSync as au}from"node:fs";import{join as jr}from"node:path";function et(t){if(!aA.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function w_(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return dA(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:g_,updated_at:g_}:null}function lA(t,e,r,n){let s=r!==null?`
1385
+ `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Ce(t){if(typeof t=="string"&&jN()&&NN(t)){let r;try{r=e_(t)}catch(s){throw s instanceof ln?new Ct(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=wt.safeParse(r);if(!n.success)throw new Ct(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Ei(RN(t));if(ON(e)&&e.definition_schema_version===3){let r=wt.safeParse(e);if(!r.success)throw new Ct(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return AN(e)}function AN(t){let e=wi.safeParse(t);if(!e.success)throw new Ct(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new Ct([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Xh(r)}catch(s){throw s instanceof Lt?new zc(s):s}}function RN(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1386
+ `)||e.startsWith("{")||e.startsWith("[")?n_(t):e.endsWith(".json")?n_($N(e,"utf8")):t}function n_(t){return JSON.parse(t)}function ON(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var zc,Ct,cn=b(()=>{"use strict";on();Vh();Yc();an();r_();zc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Ct=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function bi(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:LN(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:MN(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function LN(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=CN(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function CN(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function MN(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Zc=b(()=>{"use strict"});var s_={};ce(s_,{enqueueFromAgentOutput:()=>PN,enqueueFromGitHubIssue:()=>Qc,enqueueManual:()=>DN,enqueueScheduled:()=>FN});function Qc(t,e){return Ti(t,{project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:"gh_issue",source_ref:e.issue_url,dedupe_key:e.dedupe_key??e.issue_url,payload:Si(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function DN(t,e){return Ti(t,{project_id:e.project_id,workflow_id_override:null,source:"manual",source_ref:e.source_ref??null,dedupe_key:e.source_ref??null,payload:Si(e.payload),concurrency_key:e.concurrency_key})}function PN(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Ti(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Si(e.payload),concurrency_key:e.concurrency_key})}function FN(t,e){return Ti(t,{project_id:e.project_id,workflow_id_override:null,source:"schedule",source_ref:e.source_ref,dedupe_key:e.source_ref,available_at:e.available_at,payload:Si(e.payload),concurrency_key:e.concurrency_key})}function Si(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Ti(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Ce(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=bi({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var eu=b(()=>{"use strict";cn();Zc()});async function i_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return o_(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await UN(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...WN(o.parameters_override)},l=o_(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function o_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Qc(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function UN(t,e){if(t===null||t.trim().length===0)return!0;try{return await $r(t,e)===!0}catch{return!1}}function WN(t){if(t===null||t.trim().length===0)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}var a_=b(()=>{"use strict";sn();eu()});import{spawnSync as BN}from"node:child_process";async function ru(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=BN(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!HN(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await i_({dal:t.dal,project:t.project,issue:JN(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function un(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=qN(r.intake_config);try{let s=await ru({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function qN(t){if(t===null)return{};try{let e=JSON.parse(t);if(!tu(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function HN(t){return Array.isArray(t)&&t.every(e=>{if(!tu(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:tu(n)&&typeof n.name=="string"))})}function JN(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function tu(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var ki=b(()=>{"use strict";a_()});function c_(t){return async e=>GN(t.app,e,t.log!==void 0?{log:t.log}:{})}async function GN(t,e,r={}){let n=VN(e.path),s={"content-type":"application/json",...e.headers??{},[vi]:nu},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await KN(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${l_(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${l_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function l_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function VN(t){let e=t.startsWith("/")?t:`/${t}`;return`${XN}${e}`}async function KN(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==vi&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var vi,nu,XN,su=b(()=>{"use strict";vi="x-mailbox-channel",nu="1",XN="http://mailbox.local"});import{createHash as u_,createHmac as YN,timingSafeEqual as zN}from"node:crypto";function d_(){return async(t,e)=>{let r=f_();if(r===null||rA(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(vi)===nu){await e();return}let n=t.req.query("token");if(n!==void 0&&Ii(n,r)){iu(t,r),await e();return}if(tA(t,r)){await e();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function f_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function m_(t){let e=f_();return e!==null&&Ii(t,e)}function iu(t,e,r=new Date){t.header("Set-Cookie",`${ou}=${QN(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function p_(t){t.header("Set-Cookie",`${ou}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function QN(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+ZN*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${h_(t,n)}`,"utf8").toString("base64url")}function eA(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:Ii(s[2],h_(e,`${s[0]}|${s[1]}`))}function Ii(t,e){return zN(u_("sha256").update(t).digest(),u_("sha256").update(e).digest())}function tA(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&Ii(r,e))return!0;let n=nA(t.req.header("cookie")??"")[ou];return n!==void 0&&eA(n,e)}function rA(t){return t==="/login"||t==="/logout"}function nA(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function h_(t,e){return YN("sha256",t).update(e).digest("hex")}var ou,ZN,__=b(()=>{"use strict";su();ou="lmctl_next_session",ZN=30});import{existsSync as dn,mkdirSync as sA,readdirSync as oA,readFileSync as xi,unlinkSync as iA,writeFileSync as cu}from"node:fs";import{join as jr}from"node:path";function et(t){if(!aA.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function w_(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return dA(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:g_,updated_at:g_}:null}function lA(t,e,r,n){let s=r!==null?`
1387
1387
  description: ${r}`:"";return`---
1388
1388
  name: ${t}${s}
1389
1389
  type: ${e}
1390
1390
  ---
1391
- ${n}`}function cA(t,e,r,n){let s=jr(t,lu),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=dn(s)?Ii(s,"utf8"):"",a=new RegExp(`^- \\[${y_(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1391
+ ${n}`}function cA(t,e,r,n){let s=jr(t,uu),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=dn(s)?xi(s,"utf8"):"",a=new RegExp(`^- \\[${y_(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1392
1392
  `)?`${i}
1393
1393
  ${o}
1394
1394
  `:`${i}${o}
1395
- `,au(s,i,"utf8")}function uA(t,e){let r=jr(t,lu);if(!dn(r))return;let n=Ii(r,"utf8"),s=new RegExp(`^- \\[${y_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&au(r,n.replace(s,""),"utf8")}function y_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function dA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ct(t,e){return t.durable_memory_mode==="db"?new iu(e,t.id):new ou(t.local_path)}var aA,lu,g_,ou,iu,cu=b(()=>{"use strict";aA=/^[a-zA-Z0-9_-]+$/;lu="MEMORY.md",g_="1970-01-01T00:00:00.000Z",ou=class{dir;constructor(e){this.dir=jr(e,"durable-memory")}read(e){et(e);let r=jr(this.dir,`${e}.md`);if(!dn(r))return null;let n=Ii(r,"utf8");return w_(e,n)}write(e){et(e.name),sA(this.dir,{recursive:!0});let r=jr(this.dir,`${e.name}.md`),n=!dn(r),s=lA(e.name,e.type,e.description??null,e.body);return au(r,s,"utf8"),cA(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){et(e);let r=jr(this.dir,`${e}.md`);return dn(r)?(iA(r),uA(this.dir,e),!0):!1}listFiles(){if(!dn(this.dir))return[];let e=oA(this.dir).filter(n=>n.endsWith(".md")&&n!==lu),r=[];for(let n of e){let s=n.slice(0,-3),o=Ii(jr(this.dir,n),"utf8"),i=w_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};iu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){et(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(e){et(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return et(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function b_(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ct(o,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=ct(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!E_.has(a))return n.json({error:`invalid type: must be one of ${[...E_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ct(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ct(o,r),a=n.req.query("type");return n.json(i.list(a))})}var E_,S_=b(()=>{"use strict";cu();E_=new Set(["user","feedback","project","reference"])});function mA(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(fA[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function pA(t){let e=Math.max(1980,t.getFullYear()),r=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,n=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:r,date:n}}function T_(t,e=new Date){let{time:r,date:n}=pA(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=mA(h.data),T=h.data.length,E=new Uint8Array(30+g.length),v=new DataView(E.buffer);v.setUint32(0,67324752,!0),v.setUint16(4,20,!0),v.setUint16(6,0,!0),v.setUint16(8,0,!0),v.setUint16(10,r,!0),v.setUint16(12,n,!0),v.setUint32(14,_,!0),v.setUint32(18,T,!0),v.setUint32(22,T,!0),v.setUint16(26,g.length,!0),v.setUint16(28,0,!0),E.set(g,30),s.push(E,h.data);let x=new Uint8Array(46+g.length),k=new DataView(x.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,r,!0),k.setUint16(14,n,!0),k.setUint32(16,_,!0),k.setUint32(20,T,!0),k.setUint32(24,T,!0),k.setUint16(28,g.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,i,!0),x.set(g,46),o.push(x),i+=E.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var fA,k_=b(()=>{"use strict";fA=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let r=e;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;t[e]=r>>>0}return t})()});import{existsSync as ji,mkdirSync as hA,readdirSync as _A,readFileSync as x_,statSync as gA,unlinkSync as wA,writeFileSync as yA}from"node:fs";import{join as ls}from"node:path";function $_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ut(n);if(typeof s=="string")return A(n,s,400);let o=ie(s,"name"),i=ie(s,"local_path");if(o===null||o.length===0)return A(n,"missing or empty name",400);if(i===null||i.length===0)return A(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return A(n,`project already exists: ${o}`,409);let a=ie(s,"workflow_name")??"bugfix",l,c=ie(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return A(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return A(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ie(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=await ut(n);if(typeof o=="string")return A(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return A(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return A(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return A(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return A(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?A(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ut(n);if(typeof s=="string")return A(n,s,400);let o=ie(s,"name");if(o===null||o.length===0)return A(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return A(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return A(n,"team not found",404);let o=await ut(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"alias"),a=ie(o,"provider");if(i===null||i.length===0)return A(n,"missing or empty alias",400);if(a===null||a.length===0)return A(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return A(n,`member already exists: ${i}`,409);let l=ie(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ie(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return A(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return A(n,"member not found",404);let i=await ut(n);if(typeof i=="string")return A(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return A(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return A(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return A(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return A(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?A(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=ct(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=await ut(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"name"),a=ie(o,"body"),l=ie(o,"type");if(i===null||i.length===0)return A(n,"missing or empty name",400);if(a===null)return A(n,"missing body",400);if(l===null||!xi.includes(l))return A(n,`invalid type: must be one of ${xi.join("|")}`,400);try{et(i)}catch(d){return A(n,d.message,400)}let c=ct(s,r);try{if(c.read(i)!==null)return A(n,`chapter already exists: ${i}`,409)}catch(d){return A(n,d.message,400)}try{c.write({type:l,name:i,description:ie(o,"description"),body:a})}catch(d){return A(n,d.message,400)}let u=c.read(i);return u===null?A(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=ct(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return A(n,a.message,400)}return i===null?A(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=n.req.param("chapter"),i=await ut(n);if(typeof i=="string")return A(n,i,400);let a=ct(s,r),l;try{l=a.read(o)}catch(m){return A(n,m.message,400)}if(l===null)return A(n,"chapter not found",404);let c=ie(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ie(i,"description"):l.description,d=ie(i,"type")??l.type;if(!xi.includes(d))return A(n,`invalid type: must be one of ${xi.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return A(n,m.message,400)}let f=a.read(o);return f===null?A(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=ct(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return A(n,a.message,400)}return i?n.json({removed:!0}):A(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?A(n,"project not found",404):n.json(bA(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=await ut(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"name"),a=ie(o,"body"),l=ie(o,"type");if(i===null||i.length===0)return A(n,"missing or empty name",400);if(a===null)return A(n,"missing body",400);if(l===null||!$i.has(l))return A(n,`invalid type: must be one of ${[...$i].join("|")}`,400);try{et(i)}catch(f){return A(n,f.message,400)}let c=is(s.local_path),u=ls(c,`${i}.md`);if(ji(u))return A(n,`chapter already exists: ${i}`,409);hA(c,{recursive:!0}),I_(u,i,l,ie(o,"description"),a);let d=as(c,i);return d===null?A(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);try{et(n.req.param("chapter"))}catch(i){return A(n,i.message,400)}let o=as(is(s.local_path),n.req.param("chapter"));return o===null?A(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(m){return A(n,m.message,400)}let i=is(s.local_path),a=as(i,o);if(a===null)return A(n,"chapter not found",404);let l=await ut(n);if(typeof l=="string")return A(n,l,400);let c=ie(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ie(l,"description"):a.description,d=ie(l,"type")??a.type;if(!$i.has(d))return A(n,`invalid type: must be one of ${[...$i].join("|")}`,400);I_(ls(i,`${o}.md`),o,d,u,c);let f=as(i,o);return f===null?A(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(a){return A(n,a.message,400)}let i=ls(is(s.local_path),`${o}.md`);return ji(i)?(wA(i),n.json({removed:!0})):A(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>A(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await ut(n);return typeof s=="string"?A(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(v_))),t.post("/api/chat/sessions",async n=>{let s=await EA(n);if(typeof s=="string")return A(n,s,400);let o=s!==null?ie(s,"title"):null,i=r.createChatbotSession(v_,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?A(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return A(n,"chat session not found",404);let o=await ut(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"role"),a=ie(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return A(n,"role must be one of user|assistant|tool",400);if(a===null)return A(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return A(n,"invalid run id",400);if(r.getRun(s)===null)return A(n,"run not found",404);let i=vr(r,s),a=[];for(let c of i){let u=TA(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=x_(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=T_(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 A(t,e,r){return t.json({error:e},r)}async function ut(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function EA(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ie(t,e){let r=t[e];return typeof r!="string"?null:r}function is(t){return ls(t,"ai-test")}function as(t,e){let r=ls(t,`${e}.md`);if(!ji(r))return null;let n=x_(r,"utf8"),s=SA(n),o=gA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function bA(t){let e=is(t);return ji(e)?_A(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=as(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function I_(t,e,r,n,s){let o=n!==null&&n.length>0?`
1395
+ `,cu(s,i,"utf8")}function uA(t,e){let r=jr(t,uu);if(!dn(r))return;let n=xi(r,"utf8"),s=new RegExp(`^- \\[${y_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&cu(r,n.replace(s,""),"utf8")}function y_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function dA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ct(t,e){return t.durable_memory_mode==="db"?new lu(e,t.id):new au(t.local_path)}var aA,uu,g_,au,lu,du=b(()=>{"use strict";aA=/^[a-zA-Z0-9_-]+$/;uu="MEMORY.md",g_="1970-01-01T00:00:00.000Z",au=class{dir;constructor(e){this.dir=jr(e,"durable-memory")}read(e){et(e);let r=jr(this.dir,`${e}.md`);if(!dn(r))return null;let n=xi(r,"utf8");return w_(e,n)}write(e){et(e.name),sA(this.dir,{recursive:!0});let r=jr(this.dir,`${e.name}.md`),n=!dn(r),s=lA(e.name,e.type,e.description??null,e.body);return cu(r,s,"utf8"),cA(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){et(e);let r=jr(this.dir,`${e}.md`);return dn(r)?(iA(r),uA(this.dir,e),!0):!1}listFiles(){if(!dn(this.dir))return[];let e=oA(this.dir).filter(n=>n.endsWith(".md")&&n!==uu),r=[];for(let n of e){let s=n.slice(0,-3),o=xi(jr(this.dir,n),"utf8"),i=w_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};lu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){et(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(e){et(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return et(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function b_(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ct(o,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=ct(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!E_.has(a))return n.json({error:`invalid type: must be one of ${[...E_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ct(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ct(o,r),a=n.req.query("type");return n.json(i.list(a))})}var E_,S_=b(()=>{"use strict";du();E_=new Set(["user","feedback","project","reference"])});function mA(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(fA[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function pA(t){let e=Math.max(1980,t.getFullYear()),r=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,n=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:r,date:n}}function T_(t,e=new Date){let{time:r,date:n}=pA(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=mA(h.data),T=h.data.length,E=new Uint8Array(30+g.length),v=new DataView(E.buffer);v.setUint32(0,67324752,!0),v.setUint16(4,20,!0),v.setUint16(6,0,!0),v.setUint16(8,0,!0),v.setUint16(10,r,!0),v.setUint16(12,n,!0),v.setUint32(14,_,!0),v.setUint32(18,T,!0),v.setUint32(22,T,!0),v.setUint16(26,g.length,!0),v.setUint16(28,0,!0),E.set(g,30),s.push(E,h.data);let I=new Uint8Array(46+g.length),k=new DataView(I.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,r,!0),k.setUint16(14,n,!0),k.setUint32(16,_,!0),k.setUint32(20,T,!0),k.setUint32(24,T,!0),k.setUint16(28,g.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,i,!0),I.set(g,46),o.push(I),i+=E.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var fA,k_=b(()=>{"use strict";fA=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let r=e;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;t[e]=r>>>0}return t})()});import{existsSync as Ni,mkdirSync as hA,readdirSync as _A,readFileSync as x_,statSync as gA,unlinkSync as wA,writeFileSync as yA}from"node:fs";import{join as ls}from"node:path";function $_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ut(n);if(typeof s=="string")return N(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return N(n,"missing or empty name",400);if(i===null||i.length===0)return N(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return N(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return N(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return N(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return N(n,"project not found",404);let o=await ut(n);if(typeof o=="string")return N(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return N(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return N(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return N(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return N(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?N(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ut(n);if(typeof s=="string")return N(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return N(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return N(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return N(n,"team not found",404);let o=await ut(n);if(typeof o=="string")return N(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return N(n,"missing or empty alias",400);if(a===null||a.length===0)return N(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return N(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return N(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return N(n,"member not found",404);let i=await ut(n);if(typeof i=="string")return N(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return N(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return N(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return N(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return N(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?N(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return N(n,"project not found",404);let o=ct(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return N(n,"project not found",404);let o=await ut(n);if(typeof o=="string")return N(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return N(n,"missing or empty name",400);if(a===null)return N(n,"missing body",400);if(l===null||!$i.includes(l))return N(n,`invalid type: must be one of ${$i.join("|")}`,400);try{et(i)}catch(d){return N(n,d.message,400)}let c=ct(s,r);try{if(c.read(i)!==null)return N(n,`chapter already exists: ${i}`,409)}catch(d){return N(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return N(n,d.message,400)}let u=c.read(i);return u===null?N(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return N(n,"project not found",404);let o=ct(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return N(n,a.message,400)}return i===null?N(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return N(n,"project not found",404);let o=n.req.param("chapter"),i=await ut(n);if(typeof i=="string")return N(n,i,400);let a=ct(s,r),l;try{l=a.read(o)}catch(m){return N(n,m.message,400)}if(l===null)return N(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!$i.includes(d))return N(n,`invalid type: must be one of ${$i.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return N(n,m.message,400)}let f=a.read(o);return f===null?N(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return N(n,"project not found",404);let o=ct(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return N(n,a.message,400)}return i?n.json({removed:!0}):N(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?N(n,"project not found",404):n.json(bA(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return N(n,"project not found",404);let o=await ut(n);if(typeof o=="string")return N(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return N(n,"missing or empty name",400);if(a===null)return N(n,"missing body",400);if(l===null||!ji.has(l))return N(n,`invalid type: must be one of ${[...ji].join("|")}`,400);try{et(i)}catch(f){return N(n,f.message,400)}let c=is(s.local_path),u=ls(c,`${i}.md`);if(Ni(u))return N(n,`chapter already exists: ${i}`,409);hA(c,{recursive:!0}),I_(u,i,l,ae(o,"description"),a);let d=as(c,i);return d===null?N(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return N(n,"project not found",404);try{et(n.req.param("chapter"))}catch(i){return N(n,i.message,400)}let o=as(is(s.local_path),n.req.param("chapter"));return o===null?N(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return N(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(m){return N(n,m.message,400)}let i=is(s.local_path),a=as(i,o);if(a===null)return N(n,"chapter not found",404);let l=await ut(n);if(typeof l=="string")return N(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!ji.has(d))return N(n,`invalid type: must be one of ${[...ji].join("|")}`,400);I_(ls(i,`${o}.md`),o,d,u,c);let f=as(i,o);return f===null?N(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return N(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(a){return N(n,a.message,400)}let i=ls(is(s.local_path),`${o}.md`);return Ni(i)?(wA(i),n.json({removed:!0})):N(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>N(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await ut(n);return typeof s=="string"?N(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(v_))),t.post("/api/chat/sessions",async n=>{let s=await EA(n);if(typeof s=="string")return N(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(v_,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?N(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return N(n,"chat session not found",404);let o=await ut(n);if(typeof o=="string")return N(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return N(n,"role must be one of user|assistant|tool",400);if(a===null)return N(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return N(n,"invalid run id",400);if(r.getRun(s)===null)return N(n,"run not found",404);let i=vr(r,s),a=[];for(let c of i){let u=TA(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=x_(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=T_(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 N(t,e,r){return t.json({error:e},r)}async function ut(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function EA(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(t,e){let r=t[e];return typeof r!="string"?null:r}function is(t){return ls(t,"ai-test")}function as(t,e){let r=ls(t,`${e}.md`);if(!Ni(r))return null;let n=x_(r,"utf8"),s=SA(n),o=gA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function bA(t){let e=is(t);return Ni(e)?_A(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=as(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function I_(t,e,r,n,s){let o=n!==null&&n.length>0?`
1396
1396
  description: ${n}`:"",i=`---
1397
1397
  name: ${e}${o}
1398
1398
  type: ${r}
1399
1399
  ---
1400
- ${s}`;yA(t,i,"utf8")}function SA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:o?.[1]?.trim()??null,body:n}}function TA(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.path!==null?kA(t.path):vA(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function kA(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function vA(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var xi,$i,v_,j_=b(()=>{"use strict";Rt();k_();cu();xi=["user","feedback","project","reference"],$i=new Set(["smoke","integration","vision","scenario","regression"]),v_="operator"});function Ae(t,e){return`<!doctype html>
1400
+ ${s}`;yA(t,i,"utf8")}function SA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:o?.[1]?.trim()??null,body:n}}function TA(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.path!==null?kA(t.path):vA(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function kA(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function vA(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var $i,ji,v_,j_=b(()=>{"use strict";Rt();k_();du();$i=["user","feedback","project","reference"],ji=new Set(["smoke","integration","vision","scenario","regression"]),v_="operator"});function Ae(t,e){return`<!doctype html>
1401
1401
  <html lang="en">
1402
1402
  <head>
1403
1403
  <meta charset="utf-8">
@@ -1458,49 +1458,49 @@ ${s}`;yA(t,i,"utf8")}function SA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1458
1458
  </nav>
1459
1459
  <main>${e}</main>
1460
1460
  </body>
1461
- </html>`}function S(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function de(t,e){let r=t.map(s=>`<th>${S(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(o=>`<td>${o}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function ae(t){return`<pre>${S(JSON.stringify(t,null,2))}</pre>`}var uu=b(()=>{"use strict"});function N_(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
1461
+ </html>`}function S(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function fe(t,e){let r=t.map(s=>`<th>${S(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(o=>`<td>${o}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function le(t){return`<pre>${S(JSON.stringify(t,null,2))}</pre>`}var fu=b(()=>{"use strict"});function N_(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
1462
1462
  JOIN step s ON s.id = sa.step_id
1463
1463
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,t).length>0)return;let n=e.getRun(t);if(n===null)return;let s=e.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t);if(s.length===0)return;let o=s[0].id,i=e.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",t),a=e.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
1464
1464
  JOIN step s ON s.id = sa.step_id
1465
- WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let j of a){let H=l.get(j.step_id)??[];H.push({kind:j.kind,id:j.id}),l.set(j.step_id,H)}let c=i.map(j=>({id:j.id,state_name:j.state_name,outcome:j.outcome,duration_ms:j.started_at!==null&&j.ended_at!==null?Math.max(0,new Date(j.ended_at).getTime()-new Date(j.started_at).getTime()):null,artifacts:l.get(j.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let j of d)try{let H=JSON.parse(j.payload);typeof H.elapsedMs=="number"&&H.elapsedMs>0&&(f+=H.elapsedMs)}catch{}let m=u.map(j=>({kind:j.kind,count:j.count,total_elapsed_ms:j.kind==="tool_result"?f:0})),p=c.filter(j=>j.outcome==="request_changes"),h=[...new Set(p.map(j=>j.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),E=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,v=E!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1465
+ WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let A of a){let F=l.get(A.step_id)??[];F.push({kind:A.kind,id:A.id}),l.set(A.step_id,F)}let c=i.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)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let A of d)try{let F=JSON.parse(A.payload);typeof F.elapsedMs=="number"&&F.elapsedMs>0&&(f+=F.elapsedMs)}catch{}let m=u.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"),h=[...new Set(p.map(A=>A.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),E=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,v=E!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1466
1466
  WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,E,g,_):[],k=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1467
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],R=k?.input!==null&&k?.input!==void 0?`input: ${k.input}, output: ${k.output??0}`:"n/a",C=e.getWorkflow(n.workflow_id),q=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,te={run_id:t,workflow_name:C?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:q,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:v,token_totals:R};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(te)})}var A_=b(()=>{"use strict"});import{spawnSync as O_}from"node:child_process";function du(t){return IA[t]??`no install hint; ensure '${t}' is on PATH`}function xA(t){switch(t){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function R_(t){return O_("which",[t],{encoding:"utf8"}).status===0}function L_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!R_(e)){let r=du(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!R_(e)){let s=du(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=xA(e);if(r===null)continue;let n=O_(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:du(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var IA,C_=b(()=>{"use strict";IA={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 $A,readdirSync as jA,readFileSync as NA}from"node:fs";import{join as M_}from"node:path";function AA(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1468
- `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function D_(t,e){let r=t.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function P_(t,e){if(e.length===0)return null;let r=M_(t,"durable-memory");if(!$A(r))return null;let n;try{n=jA(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=NA(M_(r,o),"utf8");if(AA(i).some(l=>e.includes(l))){let l=D_(i,"name")??o.replace(".md",""),c=D_(i,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var F_=b(()=>{"use strict"});function pu(t){let e=t.trim().replace(RA,"").trim();for(let r=0;r<4;r+=1){let n=OA.exec(e);if(n===null)break;e=n[2].trim()}return e}function U_(t){let e=t.trim(),r=LA.exec(e);if(r!==null)return r[2];let n=CA.exec(e);return n!==null?n[0]:null}function cs(t,e){let r=t.split(`
1469
- `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=pu(r[i]),l=fu.exec(a);if(l===null)continue;let c=l[1].trim();if(mu.test(c))continue;let u=U_(c);u!==null&&(n=u,s=i)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let o={};for(let i=s-1;i>=0;i-=1){let a=pu(r[i]),l=fu.exec(a);if(l===null)break;let c=mu.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function W_(t){let e=t.split(`
1470
- `),r=null;for(let n=0;n<e.length;n+=1){let s=pu(e[n]),o=fu.exec(s);if(o===null)continue;let i=o[1].trim();if(mu.test(i))continue;let a=U_(i);if(a===null||!Pr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var RA,OA,fu,mu,LA,CA,hu=b(()=>{"use strict";Mn();RA=/^#{1,6}\s+/,OA=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,fu=/^STANCE:\s+(.+)$/,mu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,LA=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,CA=/^[A-Za-z0-9_-]+/});function B_(t,e,r){return n=>{let s=r(),o=Date.now(),i=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var q_=b(()=>{"use strict"});import{readFileSync as MA}from"node:fs";import{dirname as DA,join as PA}from"node:path";import{fileURLToPath as FA}from"node:url";function BA(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function XA(t){let e=[],r=[];for(let n of t)UA.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function GA(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&WA.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function VA(t,e){if(t.length===0)return{matched:!1};let r=XA(t);for(let n of r){let s=GA(n,e);if(s.matched)return s}return{matched:!1}}function _u(t){return VA(t,JA)}function KA(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function gu(t){return KA(t).split(" ").filter(e=>e.length>0)}var UA,WA,qA,HA,JA,H_=b(()=>{"use strict";UA=new Set(["&&","||",";","|",">",">>","<","<<"]),WA=/^[A-Za-z_][A-Za-z0-9_]*=/;qA=DA(FA(import.meta.url)),HA=JSON.parse(MA(PA(qA,"side_effect_classifier.json"),"utf-8")),JA=BA(HA)});function Ni(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function J_(t,e){try{return await $r(wu(t)??t,Ni(e))===!0}catch{return!1}}async function Ai(t,e){try{return await $r(wu(t)??t,Ni(e))}catch{return}}async function X_(t,e){if(typeof t!="string")return t;let r=wu(t);if(r===null)return t;try{return await $r(r,Ni(e))}catch{return}}async function G_(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=YA(await $r(a,Ni(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function wu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function YA(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var us=b(()=>{"use strict";sn()});import{existsSync as V_,readdirSync as K_,readFileSync as zA,statSync as Y_}from"node:fs";import{join as Oi}from"node:path";function z_(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function J(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function V(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function tt(t,e,r,n,s={}){let o=D(),i=J(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${ds}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Pr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Zs,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:ZA(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function ZA(t){return t.length>8e3?`${t.slice(0,8e3)}
1471
- \u2026[truncated ${t.length-8e3} chars]`:t}function K(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function Z(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function Z_(t,e){let r=e.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let o=or(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Xe(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=or(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=or(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=QA(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return G_(n,e)}function QA(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function or(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function fs(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=B_(e.dal,e.run_id,()=>o),c=yu(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let E=gu(T.summary),v=_u(E);v.matched&&!c&&(u.violation={summary:T.summary,kind:v.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),eR(T,(E,v)=>{m+=E,p+=v})},g=await Xr({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:ve(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),tR(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&Eu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function eR(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Ri(s.input_tokens),a=Ri(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Ri(o.input_tokens),a=Ri(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Ri(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Mt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=J(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await fs({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function fn(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=J(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(Yf(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Xe(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1467
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],P=k?.input!==null&&k?.input!==void 0?`input: ${k.input}, output: ${k.output??0}`:"n/a",q=e.getWorkflow(n.workflow_id),O=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,G={run_id:t,workflow_name:q?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:O,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:v,token_totals:P};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(G)})}var A_=b(()=>{"use strict"});import{spawnSync as O_}from"node:child_process";function mu(t){return IA[t]??`no install hint; ensure '${t}' is on PATH`}function xA(t){switch(t){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function R_(t){return O_("which",[t],{encoding:"utf8"}).status===0}function L_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!R_(e)){let r=mu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!R_(e)){let s=mu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=xA(e);if(r===null)continue;let n=O_(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:mu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var IA,C_=b(()=>{"use strict";IA={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 $A,readdirSync as jA,readFileSync as NA}from"node:fs";import{join as M_}from"node:path";function AA(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1468
+ `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function D_(t,e){let r=t.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function P_(t,e){if(e.length===0)return null;let r=M_(t,"durable-memory");if(!$A(r))return null;let n;try{n=jA(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=NA(M_(r,o),"utf8");if(AA(i).some(l=>e.includes(l))){let l=D_(i,"name")??o.replace(".md",""),c=D_(i,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var F_=b(()=>{"use strict"});function _u(t){let e=t.trim().replace(RA,"").trim();for(let r=0;r<4;r+=1){let n=OA.exec(e);if(n===null)break;e=n[2].trim()}return e}function U_(t){let e=t.trim(),r=LA.exec(e);if(r!==null)return r[2];let n=CA.exec(e);return n!==null?n[0]:null}function cs(t,e){let r=t.split(`
1469
+ `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=_u(r[i]),l=pu.exec(a);if(l===null)continue;let c=l[1].trim();if(hu.test(c))continue;let u=U_(c);u!==null&&(n=u,s=i)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let o={};for(let i=s-1;i>=0;i-=1){let a=_u(r[i]),l=pu.exec(a);if(l===null)break;let c=hu.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function W_(t){let e=t.split(`
1470
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=_u(e[n]),o=pu.exec(s);if(o===null)continue;let i=o[1].trim();if(hu.test(i))continue;let a=U_(i);if(a===null||!Pr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var RA,OA,pu,hu,LA,CA,gu=b(()=>{"use strict";Mn();RA=/^#{1,6}\s+/,OA=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,pu=/^STANCE:\s+(.+)$/,hu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,LA=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,CA=/^[A-Za-z0-9_-]+/});function B_(t,e,r){return n=>{let s=r(),o=Date.now(),i=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var q_=b(()=>{"use strict"});import{readFileSync as MA}from"node:fs";import{dirname as DA,join as PA}from"node:path";import{fileURLToPath as FA}from"node:url";function BA(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function XA(t){let e=[],r=[];for(let n of t)UA.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function GA(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&WA.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function VA(t,e){if(t.length===0)return{matched:!1};let r=XA(t);for(let n of r){let s=GA(n,e);if(s.matched)return s}return{matched:!1}}function wu(t){return VA(t,JA)}function KA(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function yu(t){return KA(t).split(" ").filter(e=>e.length>0)}var UA,WA,qA,HA,JA,H_=b(()=>{"use strict";UA=new Set(["&&","||",";","|",">",">>","<","<<"]),WA=/^[A-Za-z_][A-Za-z0-9_]*=/;qA=DA(FA(import.meta.url)),HA=JSON.parse(MA(PA(qA,"side_effect_classifier.json"),"utf-8")),JA=BA(HA)});function Ai(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function J_(t,e){try{return await $r(Eu(t)??t,Ai(e))===!0}catch{return!1}}async function Ri(t,e){try{return await $r(Eu(t)??t,Ai(e))}catch{return}}async function X_(t,e){if(typeof t!="string")return t;let r=Eu(t);if(r===null)return t;try{return await $r(r,Ai(e))}catch{return}}async function G_(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=YA(await $r(a,Ai(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function Eu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function YA(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var us=b(()=>{"use strict";sn()});import{existsSync as V_,readdirSync as K_,readFileSync as zA,statSync as Y_}from"node:fs";import{join as Li}from"node:path";function z_(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function J(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function tt(t,e,r,n,s={}){let o=M(),i=J(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${ds}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Pr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Zs,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:ZA(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function ZA(t){return t.length>8e3?`${t.slice(0,8e3)}
1471
+ \u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function ee(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function Z_(t,e){let r=e.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let o=or(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Xe(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=or(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=or(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=QA(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return G_(n,e)}function QA(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function or(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function fs(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=B_(e.dal,e.run_id,()=>o),c=bu(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let E=yu(T.summary),v=wu(E);v.matched&&!c&&(u.violation={summary:T.summary,kind:v.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),eR(T,(E,v)=>{m+=E,p+=v})},g=await Xr({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:ve(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),tR(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&Su(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function eR(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Oi(s.input_tokens),a=Oi(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Oi(o.input_tokens),a=Oi(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Oi(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Mt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=J(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await fs({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function fn(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=J(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(Zf(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Xe(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1472
1472
 
1473
- `);try{let p=await fs({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=cs(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function mn(t,e){return(e?.length??0)>0?P_(t.project.local_path,e):null}function Q_(t){return _u(gu(t))}function yu(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1473
+ `);try{let p=await fs({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=cs(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function mn(t,e){return(e?.length??0)>0?P_(t.project.local_path,e):null}function Q_(t){return wu(yu(t))}function bu(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1474
1474
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1475
- ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(r.length===0)return!1;let n=r[0];return t.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function Eu(t,e){if(!V_(t))return!1;let r=Oi(t,"durable-memory");function n(s){let o;try{o=K_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Oi(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(Y_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function tR(t,e,r){let n=Oi(t.local_path,"durable-memory");if(!V_(n))return;let s;try{s=K_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Oi(n,o),a;try{a=Y_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=zA(i,"utf8")}catch{continue}let c=nR(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1476
- `);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function nR(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!rR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var ds,rR,We=b(()=>{"use strict";Pe();on();Jn();F_();hu();Mn();q_();H_();us();ds="__paused__:";rR=new Set(["user","feedback","project","reference"])});import{spawnSync as eg}from"node:child_process";function sR(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=eg("git",["diff","--quiet"],{cwd:o}).status!==0,a=eg("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),K(t,r,n,Bc),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),K(t,r,n,"clean"),V(t.workflow,e.next)}var tg,rg=b(()=>{"use strict";We();tg={description:{displayName:"Assert Repo Clean",name:"assert-repo-clean",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:t=>sR(t,t.state)}});async function oR(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await J_(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),K(t,r,n,"matched"),V(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),K(t,r,n,"no_match"),e.default_next!==void 0?V(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":Z(t.workflow)}}var ng,sg=b(()=>{"use strict";We();us();ng={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async t=>oR(t,t.state)}});async function iR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=mn(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await fn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1475
+ ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(r.length===0)return!1;let n=r[0];return t.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function Su(t,e){if(!V_(t))return!1;let r=Li(t,"durable-memory");function n(s){let o;try{o=K_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Li(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(Y_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function tR(t,e,r){let n=Li(t.local_path,"durable-memory");if(!V_(n))return;let s;try{s=K_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Li(n,o),a;try{a=Y_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=zA(i,"utf8")}catch{continue}let c=nR(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1476
+ `);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function nR(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!rR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var ds,rR,We=b(()=>{"use strict";Pe();on();Jn();F_();gu();Mn();q_();H_();us();ds="__paused__:";rR=new Set(["user","feedback","project","reference"])});import{spawnSync as eg}from"node:child_process";function sR(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=eg("git",["diff","--quiet"],{cwd:o}).status!==0,a=eg("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),Y(t,r,n,Hc),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Y(t,r,n,"clean"),K(t.workflow,e.next)}var tg,rg=b(()=>{"use strict";We();tg={description:{displayName:"Assert Repo Clean",name:"assert-repo-clean",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:t=>sR(t,t.state)}});async function oR(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await J_(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),Y(t,r,n,"matched"),K(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Y(t,r,n,"no_match"),e.default_next!==void 0?K(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":ee(t.workflow)}}var ng,sg=b(()=>{"use strict";We();us();ng={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async t=>oR(t,t.state)}});async function iR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=mn(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await fn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1477
1477
  ${m}`:null).filter(m=>m!==null).join(`
1478
1478
 
1479
- `),c=`${n}:consolidator`,u=await fn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&K(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),K(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Mt(t,n,m,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.ok)}var og,ig=b(()=>{"use strict";We();og={description:{displayName:"Consolidate",name:"consolidate",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>iR(t,t.state)}});async function aR(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await Ai(e.items_from,t),a=dR(i);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await cR(t,e,s.id,a,l):await lR(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),K(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}return V(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function lR(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await lg(t,e,r,n[i],i,s);if(s.routed!==null||(o.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return o}async function cR(t,e,r,n,s){let o=new Array(n.length),i=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;i<n.length&&s.routed===null;){let l=i;i+=1,o[l]=await lg(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function lg(t,e,r,n,s,o){let i=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=i}(l.kind==="paused"||l.kind==="escalate")&&o.routed===null&&(o.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":uR(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:u}}),{index:s,value:n,outcome:u}}function uR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function dR(t){if(!Array.isArray(t))return null;let e=[];for(let r of t)if(typeof r=="string")e.push(r);else if(typeof r=="number"||typeof r=="boolean")e.push(String(r));else return null;return e}var ag,cg=b(()=>{"use strict";We();us();ag={description:{displayName:"For Each",name:"foreach",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>aR(t,t.state)}});async function fR(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:Z(t.workflow)}}let i=mn(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,r);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[n]="done",e.write_back_durable_memory&&await Mt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),K(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let f=a.last_operator_input??"";try{let m=await fs({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),K(t,r,n,"done"),e.write_back_durable_memory&&await Mt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(ug({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ee?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Z(t.workflow)}}}return{kind:"paused"}}let l=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await Xe(e.agent.initial_prompt_template,t,n),d=i?`${i}
1479
+ `),c=`${n}:consolidator`,u=await fn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Y(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Y(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Mt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var og,ig=b(()=>{"use strict";We();og={description:{displayName:"Consolidate",name:"consolidate",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>iR(t,t.state)}});async function aR(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await Ri(e.items_from,t),a=dR(i);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await cR(t,e,s.id,a,l):await lR(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),Y(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function lR(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await lg(t,e,r,n[i],i,s);if(s.routed!==null||(o.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return o}async function cR(t,e,r,n,s){let o=new Array(n.length),i=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;i<n.length&&s.routed===null;){let l=i;i+=1,o[l]=await lg(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function lg(t,e,r,n,s,o){let i=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=i}(l.kind==="paused"||l.kind==="escalate")&&o.routed===null&&(o.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":uR(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:u}}),{index:s,value:n,outcome:u}}function uR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function dR(t){if(!Array.isArray(t))return null;let e=[];for(let r of t)if(typeof r=="string")e.push(r);else if(typeof r=="number"||typeof r=="boolean")e.push(String(r));else return null;return e}var ag,cg=b(()=>{"use strict";We();us();ag={description:{displayName:"For Each",name:"foreach",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>aR(t,t.state)}});async function fR(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=mn(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,r);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[n]="done",e.write_back_durable_memory&&await Mt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),Y(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=a.last_operator_input??"";try{let m=await fs({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),Y(t,r,n,"done"),e.write_back_durable_memory&&await Mt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(ug({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ee?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}}return{kind:"paused"}}let l=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await Xe(e.agent.initial_prompt_template,t,n),d=i?`${i}
1480
1480
 
1481
- ${u}`:u;try{let f=await fs({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Mt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(ug({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}}function ug(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=D();e.dal.setRunPausedState(e.run_id,`${ds}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(mR({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function mR(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=pR(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:hR(o,3),paused_at:i,created_run_inputs:or(e.job.payload)}}function pR(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function hR(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var dg,fg=b(()=>{"use strict";Jn();We();dg={description:{displayName:"Interactive",name:"interactive",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>fR(t,t.state)}});async function _R(t,e){let r=t.stateId,n=t.displayName,s=Z_(t,e.over);if(s===null){let d=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:Z(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=gR(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),K(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:Z(t.workflow)}}return V(t.workflow,e.outcomes.ok)}function gR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var mg,pg=b(()=>{"use strict";We();mg={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>_R(t,t.state)}});import{createHash as wR}from"node:crypto";import{existsSync as yR,mkdirSync as ER,readFileSync as bR,writeFileSync as SR}from"node:fs";import{dirname as TR,isAbsolute as _g,normalize as kR,resolve as ms}from"node:path";import{Document as vR,ExternalHyperlink as IR,HeadingLevel as pn,LevelFormat as xR,Packer as $R,Paragraph as dt,Table as jR,TableCell as NR,TableRow as AR,TextRun as ft,WidthType as RR}from"docx";import{marked as OR}from"marked";async function LR(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await CR(t,e,n),i=await MR(t,e),a=await DR(t,e.title),l=await BR(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return ER(TR(i),{recursive:!0}),SR(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:wR("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),K(t,r,n,{output_path:i,path:i,bytes:l.length}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),K(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function CR(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Xe(e.markdown_source,t,r)).trim(),o=(n.length===0?WR(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=FR(t.project.local_path,o);if(i!==null){if(!yR(i))throw new Error(`markdown_source file not found: ${i}`);return Li(bR(i,"utf8"))}return Li(o)}async function MR(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=PR(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function DR(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function PR(t,e){let r=ms(t);return kR(_g(e)?ms(e):ms(r,e))}function FR(t,e){return UR(e)?_g(e)?ms(e):ms(t,e):null}function UR(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function WR(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return Li(s);let o=t.dal.query(`SELECT sa.content
1481
+ ${u}`:u;try{let f=await fs({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Mt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(ug({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function ug(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=M();e.dal.setRunPausedState(e.run_id,`${ds}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(mR({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function mR(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=pR(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:hR(o,3),paused_at:i,created_run_inputs:or(e.job.payload)}}function pR(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function hR(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var dg,fg=b(()=>{"use strict";Jn();We();dg={description:{displayName:"Interactive",name:"interactive",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>fR(t,t.state)}});async function _R(t,e){let r=t.stateId,n=t.displayName,s=Z_(t,e.over);if(s===null){let d=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=gR(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),Y(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function gR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var mg,pg=b(()=>{"use strict";We();mg={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>_R(t,t.state)}});import{createHash as wR}from"node:crypto";import{existsSync as yR,mkdirSync as ER,readFileSync as bR,writeFileSync as SR}from"node:fs";import{dirname as TR,isAbsolute as _g,normalize as kR,resolve as ms}from"node:path";import{Document as vR,ExternalHyperlink as IR,HeadingLevel as pn,LevelFormat as xR,Packer as $R,Paragraph as dt,Table as jR,TableCell as NR,TableRow as AR,TextRun as ft,WidthType as RR}from"docx";import{marked as OR}from"marked";async function LR(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await CR(t,e,n),i=await MR(t,e),a=await DR(t,e.title),l=await BR(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return ER(TR(i),{recursive:!0}),SR(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:wR("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),Y(t,r,n,{output_path:i,path:i,bytes:l.length}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function CR(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Xe(e.markdown_source,t,r)).trim(),o=(n.length===0?WR(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=FR(t.project.local_path,o);if(i!==null){if(!yR(i))throw new Error(`markdown_source file not found: ${i}`);return Ci(bR(i,"utf8"))}return Ci(o)}async function MR(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=PR(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function DR(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function PR(t,e){let r=ms(t);return kR(_g(e)?ms(e):ms(r,e))}function FR(t,e){return UR(e)?_g(e)?ms(e):ms(t,e):null}function UR(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function WR(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return Ci(s);let o=t.dal.query(`SELECT sa.content
1482
1482
  FROM step_artifact sa
1483
1483
  JOIN step s ON s.id = sa.step_id
1484
1484
  WHERE s.run_id = ?
1485
1485
  AND s.state_name LIKE ?
1486
1486
  AND sa.content IS NOT NULL
1487
1487
  ORDER BY sa.id DESC
1488
- LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Li(o[0].content)}function Li(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function BR(t,e){let r=wg(OR.lexer(t,{gfm:!0})),n=new vR({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:xR.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new dt("")]:r}]});return $R.toBuffer(n)}function wg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new dt({heading:KR(r.depth),children:ar(ir(r))}));break;case"paragraph":e.push(new dt({children:ar(ir(r))}));break;case"text":e.push(new dt({children:ir(r).length===0?[new ft(r.text)]:ar(ir(r))}));break;case"blockquote":e.push(...wg(ir(r)).map(n=>n instanceof dt?n:new dt({children:[new ft(r.text)]})));break;case"list":XR(r)&&e.push(...qR(r));break;case"table":GR(r)&&e.push(HR(r));break;case"code":VR(r)&&e.push(...JR(r));break;case"hr":e.push(new dt(""));break;case"html":r.text.trim().length>0&&e.push(new dt({children:[new ft(r.text)]}));break;default:break}return e}function ar(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new ft({text:n.text,...bu(e)}));break;case"strong":r.push(...ar(ir(n),{...e,bold:!0}));break;case"em":r.push(...ar(ir(n),{...e,italics:!0}));break;case"codespan":r.push(new ft({text:n.text,...bu({...e,code:!0})}));break;case"link":r.push(new IR({link:n.href,children:ar(ir(n),{...e})}));break;case"br":r.push(new ft({text:"",break:1}));break;case"image":r.push(new ft({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new ft({text:n.text,strike:!0}));break;default:r.push(new ft({text:n.raw,...bu(e)}));break}return r.length===0?[new ft("")]:r}function bu(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function qR(t){return t.items.map(e=>new dt({children:ar(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:hg(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:hg(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function hg(t){return t.task?`[${t.checked?"x":" "}] `:""}function HR(t){let e=[t.header,...t.rows].map(r=>new AR({children:r.map(n=>new NR({children:[new dt({children:ar(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new jR({width:{size:100,type:RR.PERCENTAGE},rows:e})}function JR(t){return t.text.split(`
1489
- `).map(r=>new dt({children:[new ft({text:r.length===0?" ":r,font:"Courier New"})]}))}function ir(t){let e=t.tokens;return Array.isArray(e)?e:[]}function XR(t){return t.type==="list"&&Array.isArray(t.items)}function GR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function VR(t){return t.type==="code"&&typeof t.text=="string"}function KR(t){switch(t){case 1:return pn.HEADING_1;case 2:return pn.HEADING_2;case 3:return pn.HEADING_3;case 4:return pn.HEADING_4;case 5:return pn.HEADING_5;default:return pn.HEADING_6}}var gg,yg=b(()=>{"use strict";We();gg={description:{displayName:"Render DOCX",name:"render-docx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"markdown_source",displayName:"Markdown Source",type:"string",required:!0,description:"Markdown string or project-relative .md path. Expressions are evaluated before rendering."},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .docx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional document metadata title."}],mutates_external_state:!0,builtin:!0},execute:async t=>LR(t,t.state)}});import{createHash as YR}from"node:crypto";import{existsSync as zR,mkdirSync as ZR,readFileSync as Eg,statSync as QR}from"node:fs";import{dirname as eO,isAbsolute as bg,normalize as tO,resolve as ps}from"node:path";import{marked as rO}from"marked";import nO from"write-excel-file/node";async function sO(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await oO(t,e),i=iO(e.input_format),a=await aO(t,e),l=await lO(t,e.title),c=i==="markdown"?gO(o):fO(o);await wO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=QR(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=YR("sha256").update(Eg(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),K(t,r,n,{output_path:a,path:a,bytes:u}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),K(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function oO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Xe(e.source,t,t.stateId)).trim(),n=uO(t.project.local_path,r);if(n!==null){if(!zR(n))throw new Error(`source file not found: ${n}`);return Eg(n,"utf8")}return r}function iO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function aO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=cO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function lO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function cO(t,e){let r=ps(t);return tO(bg(e)?ps(e):ps(r,e))}function uO(t,e){return dO(e)?bg(e)?ps(e):ps(t,e):null}function dO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function fO(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!Ci(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>mO(r,n))}function mO(t,e){if(!Ci(t))throw new Error(`sheets[${e}] must be an object`);let r=pO(t.headers,`sheets[${e}].headers`),n=hO(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:r,rows:n,headerStyle:_O(t.styles)}}function pO(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))throw new Error(`${e} must be an array of strings`);return t}function hO(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function _O(t){if(!Ci(t)||!Ci(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function gO(t){let e=rO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(vO(s)){n=s.text;continue}IO(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function wO(t){ZR(eO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:SO(n.name,e),data:yO(n),columns:bO(n)}));await nO(r).toFile(t.outputPath)}function yO(t){let e=[];if(t.headers.length>0){let r=kO(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(EO));return e.length===0?[[{}]]:e}function EO(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function bO(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function SO(t,e){let r=TO(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function TO(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function kO(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function vO(t){return t.type==="heading"&&typeof t.text=="string"}function IO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Ci(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Sg,Tg=b(()=>{"use strict";We();Sg={description:{displayName:"Render XLSX",name:"render-xlsx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"source",displayName:"Source",type:"string",required:!0,description:"JSON string, markdown table text, or path to a .json/.md/.markdown file."},{name:"input_format",displayName:"Input Format",type:"options",default:"json",options:[{name:"JSON",value:"json"},{name:"Markdown",value:"markdown"}]},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .xlsx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional workbook title."}],mutates_external_state:!0,builtin:!0},execute:async t=>sO(t,t.state)}});import{spawnSync as xO}from"node:child_process";async function jO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(xO("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),K(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?V(t.workflow,h):{kind:"terminal",terminal:Z(t.workflow)}}let o=mn(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await fn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1490
- ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=W_(p.text);if(g!==null){let _=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let T=Object.keys(e.outcomes_from_stance),E=cs(p.text,T);if(E.outcome===null){let x=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(x.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let v=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,E.outcome,"outcomes_from_stance"),K(t,r,n,E.outcome),V(t.workflow,e.outcomes_from_stance[E.outcome])}let g=cs(p.text,$O);if(g.outcome!==null){let T=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),K(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),K(t,r,n,"approve"),e.write_back_durable_memory){let T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await Mt(t,n,T,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>fn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1491
- ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),K(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await Mt(t,n,_,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1488
+ LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Ci(o[0].content)}function Ci(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function BR(t,e){let r=wg(OR.lexer(t,{gfm:!0})),n=new vR({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:xR.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new dt("")]:r}]});return $R.toBuffer(n)}function wg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new dt({heading:KR(r.depth),children:ar(ir(r))}));break;case"paragraph":e.push(new dt({children:ar(ir(r))}));break;case"text":e.push(new dt({children:ir(r).length===0?[new ft(r.text)]:ar(ir(r))}));break;case"blockquote":e.push(...wg(ir(r)).map(n=>n instanceof dt?n:new dt({children:[new ft(r.text)]})));break;case"list":XR(r)&&e.push(...qR(r));break;case"table":GR(r)&&e.push(HR(r));break;case"code":VR(r)&&e.push(...JR(r));break;case"hr":e.push(new dt(""));break;case"html":r.text.trim().length>0&&e.push(new dt({children:[new ft(r.text)]}));break;default:break}return e}function ar(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new ft({text:n.text,...Tu(e)}));break;case"strong":r.push(...ar(ir(n),{...e,bold:!0}));break;case"em":r.push(...ar(ir(n),{...e,italics:!0}));break;case"codespan":r.push(new ft({text:n.text,...Tu({...e,code:!0})}));break;case"link":r.push(new IR({link:n.href,children:ar(ir(n),{...e})}));break;case"br":r.push(new ft({text:"",break:1}));break;case"image":r.push(new ft({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new ft({text:n.text,strike:!0}));break;default:r.push(new ft({text:n.raw,...Tu(e)}));break}return r.length===0?[new ft("")]:r}function Tu(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function qR(t){return t.items.map(e=>new dt({children:ar(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:hg(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:hg(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function hg(t){return t.task?`[${t.checked?"x":" "}] `:""}function HR(t){let e=[t.header,...t.rows].map(r=>new AR({children:r.map(n=>new NR({children:[new dt({children:ar(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new jR({width:{size:100,type:RR.PERCENTAGE},rows:e})}function JR(t){return t.text.split(`
1489
+ `).map(r=>new dt({children:[new ft({text:r.length===0?" ":r,font:"Courier New"})]}))}function ir(t){let e=t.tokens;return Array.isArray(e)?e:[]}function XR(t){return t.type==="list"&&Array.isArray(t.items)}function GR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function VR(t){return t.type==="code"&&typeof t.text=="string"}function KR(t){switch(t){case 1:return pn.HEADING_1;case 2:return pn.HEADING_2;case 3:return pn.HEADING_3;case 4:return pn.HEADING_4;case 5:return pn.HEADING_5;default:return pn.HEADING_6}}var gg,yg=b(()=>{"use strict";We();gg={description:{displayName:"Render DOCX",name:"render-docx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"markdown_source",displayName:"Markdown Source",type:"string",required:!0,description:"Markdown string or project-relative .md path. Expressions are evaluated before rendering."},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .docx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional document metadata title."}],mutates_external_state:!0,builtin:!0},execute:async t=>LR(t,t.state)}});import{createHash as YR}from"node:crypto";import{existsSync as zR,mkdirSync as ZR,readFileSync as Eg,statSync as QR}from"node:fs";import{dirname as eO,isAbsolute as bg,normalize as tO,resolve as ps}from"node:path";import{marked as rO}from"marked";import nO from"write-excel-file/node";async function sO(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await oO(t,e),i=iO(e.input_format),a=await aO(t,e),l=await lO(t,e.title),c=i==="markdown"?gO(o):fO(o);await wO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=QR(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=YR("sha256").update(Eg(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),Y(t,r,n,{output_path:a,path:a,bytes:u}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function oO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Xe(e.source,t,t.stateId)).trim(),n=uO(t.project.local_path,r);if(n!==null){if(!zR(n))throw new Error(`source file not found: ${n}`);return Eg(n,"utf8")}return r}function iO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function aO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=cO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function lO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function cO(t,e){let r=ps(t);return tO(bg(e)?ps(e):ps(r,e))}function uO(t,e){return dO(e)?bg(e)?ps(e):ps(t,e):null}function dO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function fO(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!Mi(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>mO(r,n))}function mO(t,e){if(!Mi(t))throw new Error(`sheets[${e}] must be an object`);let r=pO(t.headers,`sheets[${e}].headers`),n=hO(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:r,rows:n,headerStyle:_O(t.styles)}}function pO(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))throw new Error(`${e} must be an array of strings`);return t}function hO(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function _O(t){if(!Mi(t)||!Mi(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function gO(t){let e=rO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(vO(s)){n=s.text;continue}IO(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function wO(t){ZR(eO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:SO(n.name,e),data:yO(n),columns:bO(n)}));await nO(r).toFile(t.outputPath)}function yO(t){let e=[];if(t.headers.length>0){let r=kO(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(EO));return e.length===0?[[{}]]:e}function EO(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function bO(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function SO(t,e){let r=TO(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function TO(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function kO(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function vO(t){return t.type==="heading"&&typeof t.text=="string"}function IO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Mi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Sg,Tg=b(()=>{"use strict";We();Sg={description:{displayName:"Render XLSX",name:"render-xlsx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"source",displayName:"Source",type:"string",required:!0,description:"JSON string, markdown table text, or path to a .json/.md/.markdown file."},{name:"input_format",displayName:"Input Format",type:"options",default:"json",options:[{name:"JSON",value:"json"},{name:"Markdown",value:"markdown"}]},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .xlsx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional workbook title."}],mutates_external_state:!0,builtin:!0},execute:async t=>sO(t,t.state)}});import{spawnSync as xO}from"node:child_process";async function jO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(xO("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Y(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?K(t.workflow,h):{kind:"terminal",terminal:ee(t.workflow)}}let o=mn(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await fn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1490
+ ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=W_(p.text);if(g!==null){let _=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let T=Object.keys(e.outcomes_from_stance),E=cs(p.text,T);if(E.outcome===null){let I=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(I.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let v=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,E.outcome,"outcomes_from_stance"),Y(t,r,n,E.outcome),K(t.workflow,e.outcomes_from_stance[E.outcome])}let g=cs(p.text,$O);if(g.outcome!==null){let T=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),Y(t,r,n,"approve"),e.write_back_durable_memory){let T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await Mt(t,n,T,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>fn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1491
+ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),Y(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await Mt(t,n,_,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1492
1492
 
1493
- `),e.loop_feedback_artifact!==void 0){let g=J(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),K(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:Z(t.workflow)}}var $O,kg,vg=b(()=>{"use strict";hu();We();$O=["blocked","failed","aborted"],kg={description:{displayName:"Review",name:"review",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>jO(t,t.state)}});import{spawnSync as NO}from"node:child_process";async function AO(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=yu(t,n),i=Q_(s);if(i.matched&&!o){let h=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:Z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=NO("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Eu(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Z(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),K(t,r,n,m),V(t.workflow,p))}var Ig,xg=b(()=>{"use strict";We();Ig={description:{displayName:"Shell Step",name:"shell-step",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],mutates_external_state:!0,builtin:!0},execute:async t=>AO(t,t.state)}});async function RO(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:Z(t.workflow)};let i=Ce(o.definition),a=await OO(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Z(t.workflow)};K(t,r,n,LO(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:Z(t.workflow)}:V(t.workflow,u)}async function OO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await X_(s,t);r[n]=o===s?await Ai(s,t):o}return r}function LO(t,e,r){let n={};for(let s of r)n[s.name]=CO(t,e,s);return n}function CO(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=MO(s,r.source_field);if(o.found)return o.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function MO(t,e){switch(e){case"id":return{found:!0,value:t.id};case"run_id":return{found:!0,value:t.run_id};case"parent_step_id":return{found:!0,value:t.parent_step_id};case"state_name":return{found:!0,value:t.state_name};case"outcome":return{found:!0,value:t.outcome};case"status_detail":return{found:!0,value:t.status_detail};case"started_at":return{found:!0,value:t.started_at};case"ended_at":return{found:!0,value:t.ended_at};default:return{found:!1}}}var $g,jg=b(()=>{"use strict";cn();We();us();$g={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async t=>RO(t,t.state)}});function DO(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),K(t,r,n,s),{kind:"terminal",terminal:s}}var Ng,Ag=b(()=>{"use strict";We();Ng={description:{displayName:"Terminal",name:"terminal",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[],outputs:[],properties:[{name:"kind",displayName:"Kind",type:"options",required:!0,options:[{name:"success",value:"success"},{name:"failure",value:"failure"},{name:"neutral",value:"neutral"}]},{name:"name",displayName:"Name",type:"string",required:!0}],builtin:!0},execute:t=>DO(t,t.state)}});async function PO(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=FO(t.cursor),a=o.filter(UO).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function FO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function UO(t){if(t===null||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.id=="number"&&typeof e.number=="number"&&typeof e.html_url=="string"&&typeof e.title=="string"}var Rg,Og=b(()=>{"use strict";Rg={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async t=>PO(t)}});async function WO(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var Lg,Cg=b(()=>{"use strict";Lg={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async t=>WO(t)}});function Mg(t){t.register(tg),t.register(kg),t.register(og),t.register(dg),t.register(mg),t.register(gg),t.register(Sg),t.register(Ig),t.register(ng),t.register(ag),t.register($g),t.register(Ng),t.register(Lg),t.register(Rg)}var Dg=b(()=>{"use strict";rg();sg();ig();cg();fg();pg();yg();Tg();vg();xg();jg();Ag();Og();Cg()});function Di(){return Mi===null&&(Mi=new Su,Mg(Mi)),Mi}var BO,Su,Mi,Tu=b(()=>{"use strict";Dg();BO={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"},Su=class{types=new Map;register(e){let r=`${e.description.namespace}/${e.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,e)}get(e){let r=e.includes("/")?e:BO[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Mi=null});async function Ug(t){Jg(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let r=t.dal.getProjectByJob(t.job.id);if(r===null)throw new Error(`job ${t.job.id} has no project`);let n=HO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=hs(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=L_(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(hs(n)){let m=ku({dal:t.dal,workflow:Fi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:or(t.job.payload)??{},team_id:t.team.id}),p=await Bg(n,m,i.current_state??n.entry_step_id);return Fg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=ku({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:or(t.job.payload)??{},team_id:t.team.id}),f=await Wg(d,i.current_state??n.start_at);return Fg(t.dal,r.id,i.id,n.name,f),f}function Fg(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function ku(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await vu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Jg(n);let o=hs(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=ku({dal:t.dal,workflow:hs(n)?Fi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return hs(n)?Bg(n,a,i.current_state??n.entry_step_id):Wg(a,i.current_state??n.start_at)}};return e}async function Wg(t,e){let r=e;if(r.startsWith(ds))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Dt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=Pi(t,Z(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Dt(t,l.terminal);r=l.state;continue}let i,a=Hg(t,r);if(a!==null){let l=J(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===Cn)return Dt(t,ll);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):tt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await vu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Pi(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Dt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=Pi(t,Z(t.workflow));return n.kind==="terminal"?Dt(t,n.terminal):Dt(t,Z(t.workflow))}async function Bg(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return tt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Hg(e,a.id);if(l!==null){let m=J(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===Cn)return Dt(e,ll);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(e);o=h;continue}let c=await qO(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Me(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Fi(t,a);try{let p=Pi(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Dt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(e);o=h.id;continue}finally{e.workflow=m}}if(Pr(d))return tt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Dt(e,"aborted")}async function qO(t,e,r){let n=qg(e,r),s=t.workflow;t.workflow=Fi(e,r);try{return await vu(t,r.id,n,r.name)}finally{t.workflow=s}}function qg(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function vu(t,e,r,n){let s=Di().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?GO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(z_(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function HO(t,e){try{let r=JSON.parse(t);if(XO(r)&&r.definition_schema_version===3)return wt.parse(r)}catch{return e}return e}function hs(t){return t.definition_schema_version===3}function Fi(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=qg(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:JO(e.parameters.kind)}),n.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:n,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function JO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function XO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function GO(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function Dt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{N_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Me(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Hg(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function Pi(t,e){if(!VO(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let r=t.workflow.errors;return r===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&KO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function VO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function KO(t,e,r){let n=YO(t),s=r.capture_evidence&&n!==null?zO(t,n.id):[];t.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function YO(t){return t.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t.run_id)[0]??null}function zO(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(n=>n.path)}function Jg(t){if(!Pg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Pg.join(", ")}`)}var Pg,Xg=b(()=>{"use strict";an();A_();C_();We();Tu();Mn();Pg=[1,2,3]});import{readFileSync as ZO,readdirSync as QO}from"node:fs";import{basename as eL,join as tL,resolve as rL}from"node:path";function Kg(t={}){let e=rL(t.workflowsDir??"workflows"),r=QO(e).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:r.map(n=>nL(tL(e,n)))}}function nL(t){let e=eL(t);try{let r=ZO(t,"utf8"),n=Ce(r);return Zg(e,n)}catch(r){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Qg(r)}}}function Yg(t,e){try{let r=Ce(e);return Zg(t,r)}catch(r){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Qg(r)}}}function zg(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1493
+ `),e.loop_feedback_artifact!==void 0){let g=J(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var $O,kg,vg=b(()=>{"use strict";gu();We();$O=["blocked","failed","aborted"],kg={description:{displayName:"Review",name:"review",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>jO(t,t.state)}});import{spawnSync as NO}from"node:child_process";async function AO(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=bu(t,n),i=Q_(s);if(i.matched&&!o){let h=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=NO("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Su(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:ee(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),K(t.workflow,p))}var Ig,xg=b(()=>{"use strict";We();Ig={description:{displayName:"Shell Step",name:"shell-step",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],mutates_external_state:!0,builtin:!0},execute:async t=>AO(t,t.state)}});async function RO(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:ee(t.workflow)};let i=Ce(o.definition),a=await OO(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:ee(t.workflow)};Y(t,r,n,LO(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:ee(t.workflow)}:K(t.workflow,u)}async function OO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await X_(s,t);r[n]=o===s?await Ri(s,t):o}return r}function LO(t,e,r){let n={};for(let s of r)n[s.name]=CO(t,e,s);return n}function CO(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=MO(s,r.source_field);if(o.found)return o.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function MO(t,e){switch(e){case"id":return{found:!0,value:t.id};case"run_id":return{found:!0,value:t.run_id};case"parent_step_id":return{found:!0,value:t.parent_step_id};case"state_name":return{found:!0,value:t.state_name};case"outcome":return{found:!0,value:t.outcome};case"status_detail":return{found:!0,value:t.status_detail};case"started_at":return{found:!0,value:t.started_at};case"ended_at":return{found:!0,value:t.ended_at};default:return{found:!1}}}var $g,jg=b(()=>{"use strict";cn();We();us();$g={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async t=>RO(t,t.state)}});function DO(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var Ng,Ag=b(()=>{"use strict";We();Ng={description:{displayName:"Terminal",name:"terminal",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[],outputs:[],properties:[{name:"kind",displayName:"Kind",type:"options",required:!0,options:[{name:"success",value:"success"},{name:"failure",value:"failure"},{name:"neutral",value:"neutral"}]},{name:"name",displayName:"Name",type:"string",required:!0}],builtin:!0},execute:t=>DO(t,t.state)}});async function PO(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=FO(t.cursor),a=o.filter(UO).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function FO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function UO(t){if(t===null||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.id=="number"&&typeof e.number=="number"&&typeof e.html_url=="string"&&typeof e.title=="string"}var Rg,Og=b(()=>{"use strict";Rg={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async t=>PO(t)}});async function WO(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var Lg,Cg=b(()=>{"use strict";Lg={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async t=>WO(t)}});function Mg(t){t.register(tg),t.register(kg),t.register(og),t.register(dg),t.register(mg),t.register(gg),t.register(Sg),t.register(Ig),t.register(ng),t.register(ag),t.register($g),t.register(Ng),t.register(Lg),t.register(Rg)}var Dg=b(()=>{"use strict";rg();sg();ig();cg();fg();pg();yg();Tg();vg();xg();jg();Ag();Og();Cg()});function Pi(){return Di===null&&(Di=new ku,Mg(Di)),Di}var BO,ku,Di,vu=b(()=>{"use strict";Dg();BO={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"},ku=class{types=new Map;register(e){let r=`${e.description.namespace}/${e.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,e)}get(e){let r=e.includes("/")?e:BO[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Di=null});async function Ug(t){Jg(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let r=t.dal.getProjectByJob(t.job.id);if(r===null)throw new Error(`job ${t.job.id} has no project`);let n=HO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=hs(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=L_(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(hs(n)){let m=Iu({dal:t.dal,workflow:Ui(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:or(t.job.payload)??{},team_id:t.team.id}),p=await Bg(n,m,i.current_state??n.entry_step_id);return Fg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Iu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:or(t.job.payload)??{},team_id:t.team.id}),f=await Wg(d,i.current_state??n.start_at);return Fg(t.dal,r.id,i.id,n.name,f),f}function Fg(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function Iu(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await xu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Jg(n);let o=hs(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=Iu({dal:t.dal,workflow:hs(n)?Ui(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return hs(n)?Bg(n,a,i.current_state??n.entry_step_id):Wg(a,i.current_state??n.start_at)}};return e}async function Wg(t,e){let r=e;if(r.startsWith(ds))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Dt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=Fi(t,ee(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Dt(t,l.terminal);r=l.state;continue}let i,a=Hg(t,r);if(a!==null){let l=J(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,r,r,a),a===Cn)return Dt(t,cl);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):tt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await xu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Fi(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Dt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=Fi(t,ee(t.workflow));return n.kind==="terminal"?Dt(t,n.terminal):Dt(t,ee(t.workflow))}async function Bg(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return tt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Hg(e,a.id);if(l!==null){let m=J(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===Cn)return Dt(e,cl);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(e);o=h;continue}let c=await qO(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Me(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Ui(t,a);try{let p=Fi(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Dt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(e);o=h.id;continue}finally{e.workflow=m}}if(Pr(d))return tt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Dt(e,"aborted")}async function qO(t,e,r){let n=qg(e,r),s=t.workflow;t.workflow=Ui(e,r);try{return await xu(t,r.id,n,r.name)}finally{t.workflow=s}}function qg(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function xu(t,e,r,n){let s=Pi().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?GO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(z_(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function HO(t,e){try{let r=JSON.parse(t);if(XO(r)&&r.definition_schema_version===3)return wt.parse(r)}catch{return e}return e}function hs(t){return t.definition_schema_version===3}function Ui(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=qg(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:JO(e.parameters.kind)}),n.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:n,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function JO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function XO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function GO(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function Dt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{N_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Me(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Hg(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function Fi(t,e){if(!VO(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let r=t.workflow.errors;return r===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&KO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function VO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function KO(t,e,r){let n=YO(t),s=r.capture_evidence&&n!==null?zO(t,n.id):[];t.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function YO(t){return t.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t.run_id)[0]??null}function zO(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(n=>n.path)}function Jg(t){if(!Pg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Pg.join(", ")}`)}var Pg,Xg=b(()=>{"use strict";an();A_();C_();We();vu();Mn();Pg=[1,2,3]});import{readFileSync as ZO,readdirSync as QO}from"node:fs";import{basename as eL,join as tL,resolve as rL}from"node:path";function Kg(t={}){let e=rL(t.workflowsDir??"workflows"),r=QO(e).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:r.map(n=>nL(tL(e,n)))}}function nL(t){let e=eL(t);try{let r=ZO(t,"utf8"),n=Ce(r);return Zg(e,n)}catch(r){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Qg(r)}}}function Yg(t,e){try{let r=Ce(e);return Zg(t,r)}catch(r){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Qg(r)}}}function zg(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1494
1494
  `)}
1495
- `}function Zg(t,e){let r=oL(e),n=iL(e);if(r===null||n===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=sL(e.inputs);return s.length>0?{file:t,workflow_name:e.name,status:"PASS_NEEDS_INPUTS",first_step_id:r,first_step_type:n,first_step_disposition:`needs_inputs:${n}`,note:`load ok; graph ok; entry step is ${r}; requires inputs: ${s.join(", ")}`}:{file:t,workflow_name:e.name,status:"PASS",first_step_id:r,first_step_type:n,first_step_disposition:`ready:${n}`,note:"load ok; graph ok; first step entered without inputs"}}function sL(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function oL(t){return Iu(t)?t.entry_step_id:t.start_at}function iL(t){return Iu(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Iu(t){return t.definition_schema_version===3}function Qg(t){return t instanceof Ct?t.issues.map(e=>`${e.path}: ${e.message}`).join("; "):t instanceof SyntaxError?`JSON parse failed: ${t.message}`:t instanceof Error?t.message:String(t)}function ew(t){let e=new Set;if(Iu(t))for(let r of t.steps){let n=r.members??{};Gg(n,e)}else for(let r of Object.values(t.states))Gg(r,e);return[...e].sort()}function Gg(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=Vg(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=Vg(i);a!==null&&e.add(a)}}}function Vg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Ui=b(()=>{"use strict";cn()});function aL({dal:t}){let e=t.listProjects();for(let r of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,Wi)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=lL(t,r,i);if(a<20)continue;let c=i??"initial",u=`${_s}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:Wi,source_ref:_s,payload:JSON.stringify({kind:_s,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function lL(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1495
+ `}function Zg(t,e){let r=oL(e),n=iL(e);if(r===null||n===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=sL(e.inputs);return s.length>0?{file:t,workflow_name:e.name,status:"PASS_NEEDS_INPUTS",first_step_id:r,first_step_type:n,first_step_disposition:`needs_inputs:${n}`,note:`load ok; graph ok; entry step is ${r}; requires inputs: ${s.join(", ")}`}:{file:t,workflow_name:e.name,status:"PASS",first_step_id:r,first_step_type:n,first_step_disposition:`ready:${n}`,note:"load ok; graph ok; first step entered without inputs"}}function sL(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function oL(t){return $u(t)?t.entry_step_id:t.start_at}function iL(t){return $u(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function $u(t){return t.definition_schema_version===3}function Qg(t){return t instanceof Ct?t.issues.map(e=>`${e.path}: ${e.message}`).join("; "):t instanceof SyntaxError?`JSON parse failed: ${t.message}`:t instanceof Error?t.message:String(t)}function ew(t){let e=new Set;if($u(t))for(let r of t.steps){let n=r.members??{};Gg(n,e)}else for(let r of Object.values(t.states))Gg(r,e);return[...e].sort()}function Gg(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=Vg(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=Vg(i);a!==null&&e.add(a)}}}function Vg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Wi=b(()=>{"use strict";cn()});function aL({dal:t}){let e=t.listProjects();for(let r of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,Bi)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=lL(t,r,i);if(a<20)continue;let c=i??"initial",u=`${_s}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:Bi,source_ref:_s,payload:JSON.stringify({kind:_s,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function lL(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1496
1496
  FROM run r
1497
1497
  JOIN job j ON j.id = r.job_id
1498
1498
  WHERE j.project_id = ?
1499
1499
  AND r.terminal_state IS NOT NULL
1500
- ${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function tw(t){for(let e of cL)try{e(t)}catch{}}var Wi,_s,cL,xu=b(()=>{"use strict";Wi="memory_policy",_s="memory_consolidation_request";cL=[aL]});var aw={};le(aw,{getOrInsertConsolidationWorkflow:()=>nw,runJobById:()=>gs,runOnce:()=>Ar,startWorker:()=>pL});import{createHash as uL}from"node:crypto";import{readFileSync as dL}from"node:fs";import{pathToFileURL as fL}from"node:url";function nw(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Qo({swallow:!0});let n=ei(e);if(n===null)return null;let s=dL(n,"utf8"),o=Ce(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:fL(n).href,source_sha256:uL("sha256").update(s).digest("hex")})}catch{return null}}async function Ar(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??rw,evaluator:n=>ow(t.dal,n)}),r===null?null:await sw(t.dal,r,e)}catch(n){if(r!==null)return lr(t.dal,r,"worker_run_failed",Nr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Bi(Nr(n))})})}catch{}return null}finally{t.max_concurrent}}async function gs(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??rw,evaluator:s=>ow(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await sw(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...lr(t.dal,r,"worker_run_failed",Nr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Bi(Nr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function sw(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return lr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===Wi&&e.source_ref===_s,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=nw(t):i=iw(t,e,n),i===null)return lr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return lr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Ce(i.definition)}catch(d){return lr(t,e,"worker_workflow_invalid",Nr(d),r,n)}let u=hL(c,l);if(u.length>0)return lr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await Ug({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return lr(t,e,"worker_run_failed",Nr(d),r,n,a)}}function ow(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=iw(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Ce(n.definition)}catch{s=null}return Ei({workflow:s,job:e,project:r})}function iw(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function pL(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Ar(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Bi(Nr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??mL))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function lr(t,e,r,n,s,o,i){let a=Bi(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Nr(t){return t instanceof Error?t.message:String(t)}function Bi(t){return t.length>4096?t.slice(0,4096):t}function hL(t,e){let r=ew(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var rw,mL,ws=b(()=>{"use strict";ti();Xg();cn();Ui();Yc();xu();rw=6e5,mL=5e3});import{existsSync as _L,readFileSync as gL}from"node:fs";import{marked as wL}from"marked";function dw(t,e){t.get("/layman",r=>r.html(Ae("Layman Home",yL(e.dal)))),t.get("/api/layman",r=>r.json(hw(e.dal))),t.get("/layman/start/:workflow",r=>{let n=uw(r);return n===null?r.notFound():r.html(Ae(`Start ${hn(n)}`,SL(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=uw(r);return n===null?r.notFound():n==="newspaper"?lw(r,e.dal):TL(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=kr(e.dal,qi(r,"id"));return n===null?r.notFound():r.html(Ae(`Run ${n.id}`,IL(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=kr(e.dal,qi(r,"id"));return n===null?r.notFound():r.json(DL(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>$L(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Ae("Newspaper Subscriptions",CL(e.dal)))),t.post("/layman/newspaper",r=>lw(r,e.dal)),t.delete("/layman/newspaper/:id",r=>cw(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>cw(r,e.dal))}function yL(t){let e=hw(t);return`<section class="layman-home">
1500
+ ${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function tw(t){for(let e of cL)try{e(t)}catch{}}var Bi,_s,cL,ju=b(()=>{"use strict";Bi="memory_policy",_s="memory_consolidation_request";cL=[aL]});var aw={};ce(aw,{getOrInsertConsolidationWorkflow:()=>nw,runJobById:()=>gs,runOnce:()=>Ar,startWorker:()=>pL});import{createHash as uL}from"node:crypto";import{readFileSync as dL}from"node:fs";import{pathToFileURL as fL}from"node:url";function nw(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{ei({swallow:!0});let n=ti(e);if(n===null)return null;let s=dL(n,"utf8"),o=Ce(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:fL(n).href,source_sha256:uL("sha256").update(s).digest("hex")})}catch{return null}}async function Ar(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??rw,evaluator:n=>ow(t.dal,n)}),r===null?null:await sw(t.dal,r,e)}catch(n){if(r!==null)return lr(t.dal,r,"worker_run_failed",Nr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:qi(Nr(n))})})}catch{}return null}finally{t.max_concurrent}}async function gs(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??rw,evaluator:s=>ow(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await sw(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...lr(t.dal,r,"worker_run_failed",Nr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:qi(Nr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function sw(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return lr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===Bi&&e.source_ref===_s,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=nw(t):i=iw(t,e,n),i===null)return lr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return lr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Ce(i.definition)}catch(d){return lr(t,e,"worker_workflow_invalid",Nr(d),r,n)}let u=hL(c,l);if(u.length>0)return lr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await Ug({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return lr(t,e,"worker_run_failed",Nr(d),r,n,a)}}function ow(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=iw(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Ce(n.definition)}catch{s=null}return bi({workflow:s,job:e,project:r})}function iw(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function pL(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Ar(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:qi(Nr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??mL))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function lr(t,e,r,n,s,o,i){let a=qi(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Nr(t){return t instanceof Error?t.message:String(t)}function qi(t){return t.length>4096?t.slice(0,4096):t}function hL(t,e){let r=ew(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var rw,mL,ws=b(()=>{"use strict";ri();Xg();cn();Wi();Zc();ju();rw=6e5,mL=5e3});import{existsSync as _L,readFileSync as gL}from"node:fs";import{marked as wL}from"marked";function dw(t,e){t.get("/layman",r=>r.html(Ae("Layman Home",yL(e.dal)))),t.get("/api/layman",r=>r.json(hw(e.dal))),t.get("/layman/start/:workflow",r=>{let n=uw(r);return n===null?r.notFound():r.html(Ae(`Start ${hn(n)}`,SL(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=uw(r);return n===null?r.notFound():n==="newspaper"?lw(r,e.dal):TL(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=kr(e.dal,Hi(r,"id"));return n===null?r.notFound():r.html(Ae(`Run ${n.id}`,IL(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=kr(e.dal,Hi(r,"id"));return n===null?r.notFound():r.json(DL(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>$L(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Ae("Newspaper Subscriptions",CL(e.dal)))),t.post("/layman/newspaper",r=>lw(r,e.dal)),t.delete("/layman/newspaper/:id",r=>cw(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>cw(r,e.dal))}function yL(t){let e=hw(t);return`<section class="layman-home">
1501
1501
  <h1>Welcome</h1>
1502
1502
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1503
- <div class="grid">${Hi.map(EL).join("")}</div>
1503
+ <div class="grid">${Ji.map(EL).join("")}</div>
1504
1504
  <h2>Recent Activity</h2>
1505
1505
  ${bL(e.recent_runs)}
1506
1506
  <section class="metric">
@@ -1512,7 +1512,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1512
1512
  <h2>${S(t.title)}</h2>
1513
1513
  <p>${S(t.description)}</p>
1514
1514
  <p><a href="/layman/start/${encodeURIComponent(t.name)}">Start</a></p>
1515
- </article>`}function bL(t){return de(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${S(e.id)}</a>`,S(hn(e.workflow_name)),S(e.terminal_state??e.current_state??"queued"),S(e.started_at)]))}function SL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${S(hn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${S(hn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=fw(n);return e==="info-qa"?`<h1>Ask a Question</h1>
1515
+ </article>`}function bL(t){return fe(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${S(e.id)}</a>`,S(hn(e.workflow_name)),S(e.terminal_state??e.current_state??"queued"),S(e.started_at)]))}function SL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${S(hn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${S(hn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=fw(n);return e==="info-qa"?`<h1>Ask a Question</h1>
1516
1516
  <form method="post" action="/layman/start/info-qa">
1517
1517
  ${s}
1518
1518
  <label>Ask anything<textarea name="question" rows="8" required></textarea></label>
@@ -1530,27 +1530,27 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1530
1530
  <h2>Running</h2>
1531
1531
  <p class="muted">Current stage: <strong>${S(e.current_state??"starting")}</strong></p>
1532
1532
  ${mw(e)}
1533
- </section>`}function mw(t){let e=t.steps.map(r=>[S(r.id),S(`\u25B6 ${r.state_name}`),S(r.outcome??"running"),S(r.status_detail??"")]);return de(["step","stage","outcome","detail"],e)}function xL(t,e){return`<section class="metric paused-interactive">
1533
+ </section>`}function mw(t){let e=t.steps.map(r=>[S(r.id),S(`\u25B6 ${r.state_name}`),S(r.outcome??"running"),S(r.status_detail??"")]);return fe(["step","stage","outcome","detail"],e)}function xL(t,e){return`<section class="metric paused-interactive">
1534
1534
  <h2>${S(UL(e.state_name))}</h2>
1535
1535
  <p class="muted">The agent is waiting for your response.</p>
1536
1536
  <h3>Agent output</h3>
1537
- <div class="metric">${Ru(e.last_agent_output??"")}</div>
1537
+ <div class="metric">${Lu(e.last_agent_output??"")}</div>
1538
1538
  <form method="post" action="/layman/run/${S(t.id)}/respond">
1539
1539
  <input type="hidden" name="step_id" value="${S(e.step_id)}">
1540
1540
  <label>Your response<textarea name="input" rows="7"></textarea></label>
1541
1541
  <button type="submit" name="done" value="false">Send response</button>
1542
1542
  <button type="submit" name="done" value="true">Done with this stage</button>
1543
1543
  </form>
1544
- </section>`}async function $L(t,e){let r=qi(t,"id"),n=await t.req.parseBody(),s=Number(Ge(n.step_id)),o=Ge(n.input),i=Ge(n.done)==="true";if(!Number.isInteger(s))return t.html(Ae("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(jL(e,a.run.id),await Ar({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Ae("Interactive response",`<p class="error">Could not submit response: ${S(a.reason)}</p>`),400)}function jL(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!ju(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>ju(i)&&i.name===r.current_state&&typeof i.id=="string");ju(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function NL(t,e,r){let n=WL(e.terminal_state);return`<section class="metric terminal-run">
1544
+ </section>`}async function $L(t,e){let r=Hi(t,"id"),n=await t.req.parseBody(),s=Number(Ge(n.step_id)),o=Ge(n.input),i=Ge(n.done)==="true";if(!Number.isInteger(s))return t.html(Ae("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(jL(e,a.run.id),await Ar({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Ae("Interactive response",`<p class="error">Could not submit response: ${S(a.reason)}</p>`),400)}function jL(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!Au(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>Au(i)&&i.name===r.current_state&&typeof i.id=="string");Au(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function NL(t,e,r){let n=WL(e.terminal_state);return`<section class="metric terminal-run">
1545
1545
  <h2>${n?"Complete":"Stopped"}</h2>
1546
1546
  <p>Status: <strong>${S(e.terminal_state)}</strong></p>
1547
1547
  ${n?AL(t,e,r):OL(e)}
1548
1548
  <h2>Stage Log</h2>
1549
1549
  ${mw(e)}
1550
- </section>`}function AL(t,e,r){if(r==="info-qa"){let n=Au(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Ru(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return RL(t,e);if(r==="newspaper"){let n=Au(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Ru(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function RL(t,e){let r=vr(t,e.id),n=$u(r,["render_docx"]),s=$u(r,["render_xlsx"]),o=Au(e,["review:coder[0]_transcript","chat_output_md"])??LL($u(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${S(a)}">${S(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1550
+ </section>`}function AL(t,e,r){if(r==="info-qa"){let n=Ou(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Lu(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return RL(t,e);if(r==="newspaper"){let n=Ou(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Lu(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function RL(t,e){let r=vr(t,e.id),n=Nu(r,["render_docx"]),s=Nu(r,["render_xlsx"]),o=Ou(e,["review:coder[0]_transcript","chat_output_md"])??LL(Nu(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${S(a)}">${S(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1551
1551
  <pre>${S(qL(BL(o??"No preview available."),30))}</pre>
1552
1552
  <h3>Downloads</h3>
1553
- ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function OL(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${S(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function Au(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function $u(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function LL(t){if(t===null||!_L(t)||!t.endsWith(".md"))return null;try{return gL(t,"utf8")}catch{return null}}function CL(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1553
+ ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function OL(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${S(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function Ou(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Nu(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function LL(t){if(t===null||!_L(t)||!t.endsWith(".md"))return null;try{return gL(t,"utf8")}catch{return null}}function CL(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1554
1554
  ${ML(_w(t))}
1555
1555
  <h2>Add Subscription</h2>
1556
1556
  ${e.length===0?'<p class="error">Create a project before subscribing.</p>':pw(e,"/layman/newspaper")}`}function pw(t,e){return`<form method="post" action="${S(e)}">
@@ -1564,40 +1564,40 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1564
1564
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1565
1565
  <label>Output directory<input name="output_dir" value="digests"></label>
1566
1566
  <button type="submit">Create subscription</button>
1567
- </form>`}async function lw(t,e){let r=await t.req.parseBody(),n=ww(e,r);if(n===null)return t.html(Ae("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Ae("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ge(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(Ae("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ge(r.output_dir).trim()||"digests",schedule:FL(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function cw(t,e){let r=qi(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function ML(t){return de(["id","project","topics","status","action"],t.map(e=>{let r=JL(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[S(e.id),S(e.project_name),S(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function hw(t){let e=_w(t);return{workflows:Hi,recent_runs:PL(t),newspaper_subscriptions:e.length}}function DL(t,e){let r=gw(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.terminal_state,paused_interactive:r?.status==="waiting_operator"?{step_id:r.step_id,state_name:r.state_name,last_agent_output:r.last_agent_output}:null,steps:e.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function PL(t){return t.query(`SELECT r.*, w.name AS workflow_name
1567
+ </form>`}async function lw(t,e){let r=await t.req.parseBody(),n=ww(e,r);if(n===null)return t.html(Ae("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Ae("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ge(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(Ae("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ge(r.output_dir).trim()||"digests",schedule:FL(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function cw(t,e){let r=Hi(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function ML(t){return fe(["id","project","topics","status","action"],t.map(e=>{let r=JL(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[S(e.id),S(e.project_name),S(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function hw(t){let e=_w(t);return{workflows:Ji,recent_runs:PL(t),newspaper_subscriptions:e.length}}function DL(t,e){let r=gw(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.terminal_state,paused_interactive:r?.status==="waiting_operator"?{step_id:r.step_id,state_name:r.state_name,last_agent_output:r.last_agent_output}:null,steps:e.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function PL(t){return t.query(`SELECT r.*, w.name AS workflow_name
1568
1568
  FROM run r
1569
1569
  JOIN workflow w ON w.id = r.workflow_id
1570
- WHERE w.name IN (${Nu.map(()=>"?").join(",")})
1570
+ WHERE w.name IN (${Ru.map(()=>"?").join(",")})
1571
1571
  ORDER BY r.id DESC
1572
- LIMIT 10`,...Nu)}function _w(t){return t.query(`SELECT pw.*, p.name AS project_name
1572
+ LIMIT 10`,...Ru)}function _w(t){return t.query(`SELECT pw.*, p.name AS project_name
1573
1573
  FROM project_workflow pw
1574
1574
  JOIN workflow w ON w.id = pw.workflow_id
1575
1575
  JOIN project p ON p.id = pw.project_id
1576
1576
  WHERE w.name = ?
1577
- ORDER BY pw.id DESC`,"newspaper")}function gw(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function ww(t,e){let r=Number(Ge(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function FL(t){let e=Ge(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ge(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function uw(t){let e=t.req.param("workflow");return Nu.includes(e)?e:null}function hn(t){return Hi.find(e=>e.name===t)?.title??t}function UL(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Ru(t){return wL.parse(t,{async:!1})}function WL(t){return t==="done"||t==="pr_ready"||t==="merged"}function BL(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function qL(t,e){return t.split(`
1577
+ ORDER BY pw.id DESC`,"newspaper")}function gw(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function ww(t,e){let r=Number(Ge(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function FL(t){let e=Ge(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ge(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function uw(t){let e=t.req.param("workflow");return Ru.includes(e)?e:null}function hn(t){return Ji.find(e=>e.name===t)?.title??t}function UL(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Lu(t){return wL.parse(t,{async:!1})}function WL(t){return t==="done"||t==="pr_ready"||t==="merged"}function BL(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function qL(t,e){return t.split(`
1578
1578
  `).slice(0,e).join(`
1579
- `)}function HL(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ge(t){return typeof t=="string"?t:""}function JL(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function ju(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function qi(t,e){return Number(t.req.param(e))}var Hi,Nu,yw=b(()=>{"use strict";ws();Rt();uu();Hi=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],Nu=Hi.map(t=>t.name)});function GL(t){return t.replace(/^\/+/,"")}function Ew(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function _n(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=GL(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return Ew(t.userId)&&Ew(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${XL}/${t.identityId}/`}function KL(t){return String(Math.max(0,Math.floor(t))).padStart(VL,"0")}function Ou(t,e,r){return`${t}${e}${KL(r)}.json`}function Ji(t,e){return`${t}${e}`}function Xi(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var XL,VL,Gi=b(()=>{"use strict";XL="mailbox";VL=12});function Pt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Vi[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=Vi[a&15]+i,a=a>>4;let l=Vi[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Vi[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Vi,Ki=b(()=>{"use strict";Vi="0123456789abcdef"});function Cu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Mu(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function vw(t){return t.conversation_id===kw&&ZL(t.payload)}function ZL(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function QL(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:vw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var bw,Sw,Tw,YL,kw,zL,Lu,Rr,Yi=b(()=>{"use strict";Gi();Ki();bw=3e3,Sw=1e4,Tw=12e3,YL=1e3,kw="__lmctl_heartbeat__",zL={kind:"heartbeat"},Lu={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Rr=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(e){this.opts=e,this.basePrefix=_n({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=Cu(e.readIntervalMs??e.pollIntervalMs??bw,bw),this.heartbeatIdleMs=Cu(e.heartbeatIdleMs??Sw,Sw),this.backoffReadIntervalMs=Cu(e.backoffReadIntervalMs??e.pollIntervalMs??Tw,Tw)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let e=this.opts.timers??Lu;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=Ji(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:YL,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Xi(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:Pt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=Ou(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??Lu;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let e=(this.cursor??0)+1,r=Ou(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(Mu(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),vw(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=QL(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??Lu;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(kw,zL)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as eC}from"@hono/node-server/conninfo";function Iw(t,e){let r=e.bucket??tC,n=e.remoteAddressOf??(o=>nC(o)),s=o=>{let i=n(o);return sC(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Du(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Mu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Pu(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Du(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:Pu(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=Du(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=rC(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:Pu(d)},500)}})}function Du(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function rC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function nC(t){try{return eC(t).remote.address}catch{return}}function sC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Pu(t){return t instanceof Error?t.message:String(t)}var tC,xw=b(()=>{"use strict";Yi();tC="local"});function $w(t,e){t.get("/mailbox/workspace",r=>aC(r,e)),t.get("/mailbox/projects",r=>lC(r,e)),t.get("/mailbox/projects/:id",r=>cC(r,e)),t.post("/mailbox/projects",r=>uC(r,e)),t.patch("/mailbox/projects/:id",r=>dC(r,e)),t.delete("/mailbox/projects/:id",r=>fC(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>mC(r,e)),t.get("/mailbox/prompts/:id",r=>pC(r,e))}function aC(t,e){e.dal.ensureWorkspace({id:wn,name:Fu});let r=jw(e.dal),n={id:wn,name:Fu,created_at:iC,projects:r};return t.json({workspace:n})}function lC(t,e){return t.json({projects:jw(e.dal)})}function cC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(gn)){let s=Uu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Qi(s)})}let n=Aw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Nw(n)})}async function uC(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:wn,name:Fu});let s=e.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 t.json({project:Qi(s)},201)}async function dC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(gn)){let o=Uu(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:Qi(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function fC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(gn)){let n=Uu(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function mC(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Aw(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${oC}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await hC({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${Zi}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function pC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=_C(e.dal,r);return t.json({result:n})}function jw(t){let e=t.listProjects().map(Nw),r=t.listWebProjectsActive(wn).map(Qi);return[...e,...r].sort(IC)}function Nw(t){return{id:`${Zi}${t.id}`,workspace_id:wn,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function Qi(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${gn}${t.id}`,workspace_id:t.workspace_id,name:t.name,repo_path:t.repo_path,config_json:e,last_active_at:t.last_active_at,created_at:t.created_at}}function Uu(t,e){if(!e.startsWith(gn))return null;let r=e.slice(gn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Aw(t,e){if(e.startsWith(Zi)){let n=e.slice(Zi.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function hC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Zc(),s_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function _C(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=TC(t,o?.team_id??null),a=SC(s),l=kC(n,a,i.length>0),c=vC(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:gC(t,o.workflow_name),d=u.totalEstimatedMs,f=Rw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:wC(t,s.id),g=yC(s,a,h,u.perStep,i),_=EC(h,u.perStep),T=bC(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...zi(d,f),...T},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...zi(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...zi(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...zi(d,f),...T},errors_json:null,duration_ms:c}}function gC(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function wC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function yC(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Rw(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function EC(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function bC(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Rw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function zi(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function SC(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function TC(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function kC(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function vC(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function IC(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var Zi,gn,oC,wn,Fu,iC,Ow=b(()=>{"use strict";Zi="project:",gn="web_project:",oC="prompt:",wn="default",Fu="Default workspace",iC=new Date(0).toISOString()});import{Buffer as Lw}from"node:buffer";function Cw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Mw(t){return jC[t]}function Dw(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var xC,$C,ea,jC,Wu=b(()=>{"use strict";xC=1e4,$C=256*1024,ea=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Cw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,xC),this.pushByteCap=Cw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,$C),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=Lw.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${r} bytes=${Lw.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1579
+ `)}function HL(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ge(t){return typeof t=="string"?t:""}function JL(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function Au(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Hi(t,e){return Number(t.req.param(e))}var Ji,Ru,yw=b(()=>{"use strict";ws();Rt();fu();Ji=[{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."}],Ru=Ji.map(t=>t.name)});function GL(t){return t.replace(/^\/+/,"")}function Ew(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function _n(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=GL(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return Ew(t.userId)&&Ew(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${XL}/${t.identityId}/`}function KL(t){return String(Math.max(0,Math.floor(t))).padStart(VL,"0")}function Cu(t,e,r){return`${t}${e}${KL(r)}.json`}function Xi(t,e){return`${t}${e}`}function Gi(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var XL,VL,Vi=b(()=>{"use strict";XL="mailbox";VL=12});function Pt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Ki[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=Ki[a&15]+i,a=a>>4;let l=Ki[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Ki[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Ki,Yi=b(()=>{"use strict";Ki="0123456789abcdef"});function Du(t,e){return!Number.isFinite(t)||t<=0?e:t}function Pu(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function vw(t){return t.conversation_id===kw&&ZL(t.payload)}function ZL(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function QL(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:vw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var bw,Sw,Tw,YL,kw,zL,Mu,Rr,zi=b(()=>{"use strict";Vi();Yi();bw=3e3,Sw=1e4,Tw=12e3,YL=1e3,kw="__lmctl_heartbeat__",zL={kind:"heartbeat"},Mu={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Rr=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(e){this.opts=e,this.basePrefix=_n({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=Du(e.readIntervalMs??e.pollIntervalMs??bw,bw),this.heartbeatIdleMs=Du(e.heartbeatIdleMs??Sw,Sw),this.backoffReadIntervalMs=Du(e.backoffReadIntervalMs??e.pollIntervalMs??Tw,Tw)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let e=this.opts.timers??Mu;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=Xi(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:YL,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Gi(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:Pt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=Cu(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??Mu;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let e=(this.cursor??0)+1,r=Cu(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(Pu(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),vw(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=QL(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??Mu;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(kw,zL)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as eC}from"@hono/node-server/conninfo";function Iw(t,e){let r=e.bucket??tC,n=e.remoteAddressOf??(o=>nC(o)),s=o=>{let i=n(o);return sC(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Fu(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Pu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Uu(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Fu(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:Uu(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=Fu(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=rC(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:Uu(d)},500)}})}function Fu(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function rC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function nC(t){try{return eC(t).remote.address}catch{return}}function sC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Uu(t){return t instanceof Error?t.message:String(t)}var tC,xw=b(()=>{"use strict";zi();tC="local"});function $w(t,e){t.get("/mailbox/workspace",r=>aC(r,e)),t.get("/mailbox/projects",r=>lC(r,e)),t.get("/mailbox/projects/:id",r=>cC(r,e)),t.post("/mailbox/projects",r=>uC(r,e)),t.patch("/mailbox/projects/:id",r=>dC(r,e)),t.delete("/mailbox/projects/:id",r=>fC(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>mC(r,e)),t.get("/mailbox/prompts/:id",r=>pC(r,e))}function aC(t,e){e.dal.ensureWorkspace({id:wn,name:Wu});let r=jw(e.dal),n={id:wn,name:Wu,created_at:iC,projects:r};return t.json({workspace:n})}function lC(t,e){return t.json({projects:jw(e.dal)})}function cC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(gn)){let s=Bu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:ea(s)})}let n=Aw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Nw(n)})}async function uC(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:wn,name:Wu});let s=e.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 t.json({project:ea(s)},201)}async function dC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(gn)){let o=Bu(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:ea(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function fC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(gn)){let n=Bu(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function mC(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Aw(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${oC}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await hC({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${Qi}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function pC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=_C(e.dal,r);return t.json({result:n})}function jw(t){let e=t.listProjects().map(Nw),r=t.listWebProjectsActive(wn).map(ea);return[...e,...r].sort(IC)}function Nw(t){return{id:`${Qi}${t.id}`,workspace_id:wn,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function ea(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${gn}${t.id}`,workspace_id:t.workspace_id,name:t.name,repo_path:t.repo_path,config_json:e,last_active_at:t.last_active_at,created_at:t.created_at}}function Bu(t,e){if(!e.startsWith(gn))return null;let r=e.slice(gn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Aw(t,e){if(e.startsWith(Qi)){let n=e.slice(Qi.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function hC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(eu(),s_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function _C(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=TC(t,o?.team_id??null),a=SC(s),l=kC(n,a,i.length>0),c=vC(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:gC(t,o.workflow_name),d=u.totalEstimatedMs,f=Rw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:wC(t,s.id),g=yC(s,a,h,u.perStep,i),_=EC(h,u.perStep),T=bC(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Zi(d,f),...T},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Zi(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...Zi(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Zi(d,f),...T},errors_json:null,duration_ms:c}}function gC(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function wC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function yC(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Rw(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function EC(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function bC(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Rw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Zi(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function SC(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function TC(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function kC(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function vC(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function IC(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var Qi,gn,oC,wn,Wu,iC,Ow=b(()=>{"use strict";Qi="project:",gn="web_project:",oC="prompt:",wn="default",Wu="Default workspace",iC=new Date(0).toISOString()});import{Buffer as Lw}from"node:buffer";function Cw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Mw(t){return jC[t]}function Dw(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var xC,$C,ta,jC,qu=b(()=>{"use strict";xC=1e4,$C=256*1024,ta=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Cw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,xC),this.pushByteCap=Cw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,$C),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=Lw.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${r} bytes=${Lw.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1580
1580
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1581
- `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};jC={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 Fw(t,e){t.post("/mailbox/terminal/launch",r=>NC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>AC(r,e)),t.get("/mailbox/terminal/sessions",r=>RC(r,e))}async function NC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Pw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Dw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Mw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function AC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Pw.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function RC(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var Pw,Uw=b(()=>{"use strict";Wu();Pw=/^[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 OC}from"node:buffer";function MC(t){try{return OC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function Ww(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Bw(t){return DC[t]}function qw(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var LC,CC,ta,DC,Bu=b(()=>{"use strict";LC=2e3,CC=64*1024,ta=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Ww(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,LC),this.pushByteCap=Ww(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,CC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=MC(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};DC={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 Jw(t,e){t.post("/mailbox/chat/launch",r=>PC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>FC(r,e)),t.get("/mailbox/chat/sessions",r=>UC(r,e))}async function PC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Hw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=qw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Bw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function FC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Hw.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),t.json({session_id:n,ended:!0}))}function UC(t,e){let r=e.persistentSessionManager;return r===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:r.listSessions()})}var Hw,Xw=b(()=>{"use strict";Bu();Hw=/^[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 WC}from"node:fs";function Vw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Gw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=WC(e.path,{encoding:"utf8"});return Gw(r)}catch{return[]}}function Gw(t){let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);return e.length===0?[]:e.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var Kw=b(()=>{"use strict"});function Yw(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function ra(t,e){let r=t.query(`SELECT id, kind FROM attention
1581
+ `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};jC={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 Fw(t,e){t.post("/mailbox/terminal/launch",r=>NC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>AC(r,e)),t.get("/mailbox/terminal/sessions",r=>RC(r,e))}async function NC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Pw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Dw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Mw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function AC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Pw.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function RC(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var Pw,Uw=b(()=>{"use strict";qu();Pw=/^[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 OC}from"node:buffer";function MC(t){try{return OC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function Ww(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Bw(t){return DC[t]}function qw(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var LC,CC,ra,DC,Hu=b(()=>{"use strict";LC=2e3,CC=64*1024,ra=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Ww(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,LC),this.pushByteCap=Ww(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,CC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=MC(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};DC={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 Jw(t,e){t.post("/mailbox/chat/launch",r=>PC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>FC(r,e)),t.get("/mailbox/chat/sessions",r=>UC(r,e))}async function PC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Hw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=qw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Bw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function FC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Hw.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),t.json({session_id:n,ended:!0}))}function UC(t,e){let r=e.persistentSessionManager;return r===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:r.listSessions()})}var Hw,Xw=b(()=>{"use strict";Hu();Hw=/^[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 WC}from"node:fs";function Vw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Gw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=WC(e.path,{encoding:"utf8"});return Gw(r)}catch{return[]}}function Gw(t){let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);return e.length===0?[]:e.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var Kw=b(()=>{"use strict"});function Yw(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function na(t,e){let r=t.query(`SELECT id, kind FROM attention
1582
1582
  WHERE run_id = ?
1583
1583
  AND acknowledged_at IS NULL
1584
1584
  AND requires_user = 1
1585
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var na=b(()=>{"use strict"});function iy(t,e){t.all("/runtime/*",r=>BC(r.req.raw,e))}async function BC(t,e){try{return Response.json(await qC(t,e))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function qC(t,e){let r=new URL(t.url),n=YC(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return qu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return sa(t,n.id,s[2]),HC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){sa(t,n.id,s[2]);let o=Zw(e.dal,s[4]);return zw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return qu(t),e.dal.listTeams().map(o=>KC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=Qw(e.dal,ey(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead chat body does not match route team");return ry(t,n.id,i.context),ty(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=Qw(e.dal,ey(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead message body does not match route team");ry(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return ty(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){sa(t,n.id,s[2]);let o=Zw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new se(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return GC(e.dal,o,a),zw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ys(t,n.id),e.dal.listWorkflows().map(o=>zC(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ys(t,n.id);let o=QC(e.dal,s[2]);return ZC(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ys(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return eM(e.dal,o,i).map(l=>sy(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ys(t,n.id);let o=ny(e.dal,s[2]);return sy(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ys(t,n.id);let o=ny(e.dal,s[2]),i=rM(e.dal,o);return{runId:Vu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function HC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>ay(t,e,r))}}function zw(t,e,r){let n=ay(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:JC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:XC(t,r)}}function ay(t,e,r){let n=ly(t,r.id),s=Ju(n);return{id:r.name,workspaceId:e.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function JC(t,e){let r=ly(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:Ju(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 XC(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function GC(t,e,r){let n=VC(t,e.id);if(n!==null){let s=ra(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new se(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=gt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new se(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function ly(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",e)[0]??null}function VC(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e)[0]??null}function Ju(t){return t===null?"queued":t.terminal_state===null?"running":t.terminal_state==="done"||t.terminal_state==="success"?"succeeded":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"cancelled":"failed"}function Zw(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function Qw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new se(404,`team not found: ${e}`);return r}function ey(t){return t.startsWith("team:")?t.slice(5):t}function KC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function ty(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??oy}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function YC(t){let e=t.workspaceName??Nn()??hr.default;return{id:e,name:e}}function qu(t){if(t.headers.get("x-lmctl-workspace-id")!==oy)throw new se(400,"runtime request requires global-admin workspace identity")}function sa(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new se(400,"runtime workspace identity does not match route")}function ys(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==e)throw new se(400,"runtime workspace identity does not match server workspace")}function ry(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");sa(t,e,r.workspaceId);return}qu(t)}function Xu(t){return`${yn}${Gu(t.name)}`}function Gu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Vu(t){return`${Hu}${t.id}`}function zC(t){let e=oa(t.definition);return{id:Xu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function ZC(t){let e=oa(t.definition);return{id:Xu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function oa(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function QC(t,e){if(!e.startsWith(yn))throw new se(404,`template not found: ${e}`);let r=e.slice(yn.length),n=t.listWorkflows().filter(s=>Gu(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new se(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function ny(t,e){if(!e.startsWith(Hu))throw new se(404,`run not found: ${e}`);let r=e.slice(Hu.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new se(404,`run not found: ${e}`);return s}function eM(t,e,r){if(r!==null){if(!r.startsWith(yn))return[];let s=r.slice(yn.length),o=t.listWorkflows().filter(a=>Gu(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function sy(t,e){let r=t.getWorkflow(e.workflow_id),n=Ju(e),s=tM(r,e);return{id:Vu(e),templateId:r===null?`${yn}unknown`:Xu(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function tM(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[oa(t.definition).nameToId.get(r)??r]}function rM(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:oa(r.definition),s=c=>n.nameToId.get(c)??c,o=Vu(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=nM(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),d=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function nM(t){if(t.outcome===null)return"step.failed";let e=t.status_detail;return e==="failed"||e==="error"||e==="aborted"?"step.failed":"step.completed"}var oy,yn,Hu,se,cy=b(()=>{"use strict";Ve();na();Rt();oy="global-admin";yn="template:",Hu="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as sM,writeFileSync as oM}from"node:fs";import{randomUUID as uy}from"node:crypto";import{dirname as iM,resolve as ia,sep as dy}from"node:path";async function my(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!dM(n))return t.text("missing image file",400);if(n.size>aM)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=fM(s);if(o===null||!(o in fy))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=lM(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?ia(uM()):ia(i.local_path),l=ia(a,"uploads",uy()),c=ia(l,`${uy()}${fy[o]}`);if(!cM(c,a))return t.text("invalid upload path",400);sM(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);oM(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function lM(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function cM(t,e){let r=e.endsWith(dy)?e:`${e}${dy}`;return t.startsWith(r)}function uM(){return iM(ce())}function dM(t){return typeof File<"u"&&t instanceof File}function fM(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10?"image/png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":t.length>=12&&t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":t.length>=12&&t.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(t.subarray(8,12).toString("ascii"))?"image/heic":t.length>=5&&t.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var aM,fy,py=b(()=>{"use strict";Ve();aM=10*1024*1024,fy={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as aa}from"node:fs";import{basename as mM,dirname as pM,extname as hM,isAbsolute as _M,join as gM,relative as wM}from"node:path";import{fileURLToPath as yM}from"node:url";import{Hono as EM}from"hono";import{serveStatic as yt}from"@hono/node-server/serve-static";function by(t){let e=new EM,r=[],n=t.localWebui!==void 0?Yu(t.localWebui.webuiDir):bM();if(t.localWebui!==void 0&&Iw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=SM();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,yt({root:n})),e.use("/vendor/*",s,yt({root:n})),e.use("/src/*",s,yt({root:n})),e.get("/",s,yt({root:n,path:"index.html"})),e.get("/admin",s,yt({root:n,path:"index.html"})),e.get("/admin/*",s,yt({root:n,path:"index.html"})),e.get("/terminal",s,yt({root:n,path:"index.html"})),e.get("/terminal/*",s,yt({root:n,path:"index.html"})),e.get("/chat",s,yt({root:n,path:"index.html"})),e.get("/chat/*",s,yt({root:n,path:"index.html"}))}else e.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return e.use("*",d_()),e.get("/login",s=>s.html(Ae("Login",`
1585
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var sa=b(()=>{"use strict"});function iy(t,e){t.all("/runtime/*",r=>BC(r.req.raw,e))}async function BC(t,e){try{return Response.json(await qC(t,e))}catch(r){if(r instanceof oe)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 qC(t,e){let r=new URL(t.url),n=YC(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Ju(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return oa(t,n.id,s[2]),HC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){oa(t,n.id,s[2]);let o=Zw(e.dal,s[4]);return zw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Ju(t),e.dal.listTeams().map(o=>KC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=Qw(e.dal,ey(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead chat body does not match route team");return ry(t,n.id,i.context),ty(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=Qw(e.dal,ey(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead message body does not match route team");ry(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime lead message requires draft.body");return ty(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){oa(t,n.id,s[2]);let o=Zw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new oe(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime workflow message requires draft.body");return GC(e.dal,o,a),zw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ys(t,n.id),e.dal.listWorkflows().map(o=>zC(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ys(t,n.id);let o=QC(e.dal,s[2]);return ZC(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ys(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new oe(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return eM(e.dal,o,i).map(l=>sy(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ys(t,n.id);let o=ny(e.dal,s[2]);return sy(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ys(t,n.id);let o=ny(e.dal,s[2]),i=rM(e.dal,o);return{runId:Yu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new oe(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function HC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>ay(t,e,r))}}function zw(t,e,r){let n=ay(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:JC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:XC(t,r)}}function ay(t,e,r){let n=ly(t,r.id),s=Gu(n);return{id:r.name,workspaceId:e.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function JC(t,e){let r=ly(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:Gu(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 XC(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function GC(t,e,r){let n=VC(t,e.id);if(n!==null){let s=na(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new oe(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=gt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new oe(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new oe(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function ly(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",e)[0]??null}function VC(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e)[0]??null}function Gu(t){return t===null?"queued":t.terminal_state===null?"running":t.terminal_state==="done"||t.terminal_state==="success"?"succeeded":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"cancelled":"failed"}function Zw(t,e){let r=t.findProjectByName(e);if(r===null)throw new oe(404,`project not found: ${e}`);return r}function Qw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new oe(404,`team not found: ${e}`);return r}function ey(t){return t.startsWith("team:")?t.slice(5):t}function KC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function ty(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??oy}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function YC(t){let e=t.workspaceName??Nn()??hr.default;return{id:e,name:e}}function Ju(t){if(t.headers.get("x-lmctl-workspace-id")!==oy)throw new oe(400,"runtime request requires global-admin workspace identity")}function oa(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new oe(400,"runtime workspace identity does not match route")}function ys(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e)throw new oe(400,"runtime workspace identity does not match server workspace")}function ry(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new oe(400,"workspace manager context requires workspace identity");oa(t,e,r.workspaceId);return}Ju(t)}function Vu(t){return`${yn}${Ku(t.name)}`}function Ku(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Yu(t){return`${Xu}${t.id}`}function zC(t){let e=ia(t.definition);return{id:Vu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function ZC(t){let e=ia(t.definition);return{id:Vu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ia(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function QC(t,e){if(!e.startsWith(yn))throw new oe(404,`template not found: ${e}`);let r=e.slice(yn.length),n=t.listWorkflows().filter(s=>Ku(s.name)===r);if(n.length===0)throw new oe(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new oe(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function ny(t,e){if(!e.startsWith(Xu))throw new oe(404,`run not found: ${e}`);let r=e.slice(Xu.length);if(!/^[1-9]\d*$/.test(r))throw new oe(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new oe(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new oe(404,`run not found: ${e}`);return s}function eM(t,e,r){if(r!==null){if(!r.startsWith(yn))return[];let s=r.slice(yn.length),o=t.listWorkflows().filter(a=>Ku(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function sy(t,e){let r=t.getWorkflow(e.workflow_id),n=Gu(e),s=tM(r,e);return{id:Yu(e),templateId:r===null?`${yn}unknown`:Vu(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function tM(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[ia(t.definition).nameToId.get(r)??r]}function rM(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ia(r.definition),s=c=>n.nameToId.get(c)??c,o=Yu(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=nM(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),d=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function nM(t){if(t.outcome===null)return"step.failed";let e=t.status_detail;return e==="failed"||e==="error"||e==="aborted"?"step.failed":"step.completed"}var oy,yn,Xu,oe,cy=b(()=>{"use strict";Ve();sa();Rt();oy="global-admin";yn="template:",Xu="run:";oe=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as sM,writeFileSync as oM}from"node:fs";import{randomUUID as uy}from"node:crypto";import{dirname as iM,resolve as aa,sep as dy}from"node:path";async function my(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!dM(n))return t.text("missing image file",400);if(n.size>aM)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=fM(s);if(o===null||!(o in fy))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=lM(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?aa(uM()):aa(i.local_path),l=aa(a,"uploads",uy()),c=aa(l,`${uy()}${fy[o]}`);if(!cM(c,a))return t.text("invalid upload path",400);sM(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);oM(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function lM(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function cM(t,e){let r=e.endsWith(dy)?e:`${e}${dy}`;return t.startsWith(r)}function uM(){return iM(ue())}function dM(t){return typeof File<"u"&&t instanceof File}function fM(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10?"image/png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":t.length>=12&&t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":t.length>=12&&t.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(t.subarray(8,12).toString("ascii"))?"image/heic":t.length>=5&&t.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var aM,fy,py=b(()=>{"use strict";Ve();aM=10*1024*1024,fy={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as la}from"node:fs";import{basename as mM,dirname as pM,extname as hM,isAbsolute as _M,join as gM,relative as wM}from"node:path";import{fileURLToPath as yM}from"node:url";import{Hono as EM}from"hono";import{serveStatic as yt}from"@hono/node-server/serve-static";function by(t){let e=new EM,r=[],n=t.localWebui!==void 0?Zu(t.localWebui.webuiDir):bM();if(t.localWebui!==void 0&&Iw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=SM();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,yt({root:n})),e.use("/vendor/*",s,yt({root:n})),e.use("/src/*",s,yt({root:n})),e.get("/",s,yt({root:n,path:"index.html"})),e.get("/admin",s,yt({root:n,path:"index.html"})),e.get("/admin/*",s,yt({root:n,path:"index.html"})),e.get("/terminal",s,yt({root:n,path:"index.html"})),e.get("/terminal/*",s,yt({root:n,path:"index.html"})),e.get("/chat",s,yt({root:n,path:"index.html"})),e.get("/chat/*",s,yt({root:n,path:"index.html"}))}else e.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return e.use("*",d_()),e.get("/login",s=>s.html(Ae("Login",`
1586
1586
  <h1>Login</h1>
1587
1587
  <form method="post" action="/login">
1588
1588
  <label>Token <input name="token" type="password"></label>
1589
1589
  <button type="submit">Login</button>
1590
1590
  </form>
1591
- `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return m_(i)?(su(s,i),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(p_(s),s.redirect("/login",302))),dw(e,{dal:t.dal}),iy(e,{dal:t.dal}),$w(e,{dal:t.dal}),Fw(e,{terminalSessionManager:t.terminalSessionManager}),Jw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Gn(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await oc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return U(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),b_(e,{dal:t.dal}),$_(e,{dal:t.dal}),e.get("/api/status",s=>U(s,Oo(t.dal),jM)),e.get("/api/projects",s=>U(s,Lo(t.dal),NM)),e.get("/api/teams",s=>U(s,Np(t.dal),OM)),e.get("/api/workflows",s=>U(s,Co(t.dal),LM)),e.get("/api/workflows/verify",s=>{let o=Kg();return s.req.header("accept")?.includes("text/plain")?s.text(zg(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,Ap(t.dal,{status:s.req.query("status")}),CM)),e.post("/api/uploads",s=>my(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Mo(t.dal,ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return U(s,d,ae)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(ws(),aw)),i=Mo(t.dal,ee(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():U(s,o,ae)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():U(s,t.dal.listProjectWorkflows(o.id),AM)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await En(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{nr(u)}catch{return s.text("invalid condition",400)}let d=vM(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return U(s,m,ae)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ee(s,"id"))?U(s,{removed:!0},ae):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(ee(s,"id"),!0);return o===null?s.notFound():U(s,o,ae)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(ee(s,"id"),!1);return o===null?s.notFound():U(s,o,ae)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=_y(s.req.query("status"),IM);if(typeof i=="string")return s.text(i,400);let a=_y(s.req.query("severity"),Ty);return typeof a=="string"?s.text(a,400):U(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),RM)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await En(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=xM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=$M(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return U(s,d,ae)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.post("/api/issues/:id/claim",async s=>{let o=ee(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await En(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):U(s,c,ae)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await En(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):U(s,l,ae)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(ee(s,"id"));if(o===null)return s.notFound();let i=await En(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return U(s,t.dal.closeIssue(ee(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),ae)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(ee(s,"id"));if(o===null)return s.notFound();let i=await En(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return U(s,t.dal.reopenIssue(ee(s,"id"),a),ae)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return U(s,{...o,owner:a,repo:l},ae)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=ee(s,"run_id"),i=s.req.query("kind"),a=vr(t.dal,o,i);return U(s,a,ae)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=ee(s,"run_id"),i=s.req.param("kind"),a=vr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):U(s,l,ae);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=TM(l.path);if(kM(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=mM(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return U(s,l,ae)}return U(s,l,ae)}),e.get("/api/runs",s=>U(s,Vr(t.dal,{limit:Ku(s,"limit")??100}),MM)),e.get("/api/runs/:id",s=>{let o=kr(t.dal,ee(s,"id"));return o===null?s.notFound():U(s,o,DM)}),e.get("/api/runs/:id/where",s=>{let o=Kr(t.dal,ee(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Po(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Fo(t.dal,ee(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Uo(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(ee(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(la(t.daemon),U(s,i,gy)):U(s,i,gy,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=ee(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(la(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>hy(s,t.dal,o=>U(s,o,FM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Cp(t.dal,ee(s,"id"),ee(s,"step_id"));return o===null?s.notFound():Sy(s)?s.html(`<pre>${S(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>hy(s,t.dal,o=>{let i=Vw(o);return U(s,i,a=>de(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>U(s,Mp(t.dal,{type:s.req.query("type")}),UM)),e.get("/api/external-signals",s=>U(s,Dp(t.dal,{unhandled:s.req.query("unhandled")==="true"}),WM)),e.get("/api/attentions",s=>U(s,Zt(t.dal,{unacked:s.req.query("unacked")==="true"}),BM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(ee(s,"id"));return o===null?s.notFound():U(s,o,i=>`<p>acknowledged attention ${S(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=Do(t.dal,l);return U(s,c,u=>`<h1>Escalations</h1>${de(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=gt(t.dal,ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.post("/api/escalations/:id/respond",async s=>{let o=ee(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=gt(t.dal,o);if(c===null)return s.notFound();let u=Zt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);la(t.daemon);let p=Zt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return la(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=Rp(t.dal,{status:i,pr_url:o});return U(s,a,qM)}),e.get("/api/submitted-prs/:id",s=>{let o=ee(s,"id"),i=Op(t.dal,o);return i===null?s.notFound():U(s,i,HM)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),wy)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Gn(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),wy)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Gn(s.req.param("team_name"));try{let i=await Tp(t.dal,o,s.req.param("alias"));return U(s,i,a=>yy("compacted",a.row))}catch(i){if(i instanceof Xn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Gn(s.req.param("team_name")),i=await oc(t.dal,o,s.req.param("alias"));return U(s,i,a=>yy(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,Ey)),e.post("/api/intake/scan",async s=>(r=await un(t.dal),U(s,r,Ey))),e.get("/api/stats/run-throughput",s=>U(s,Up(t.dal),JM)),e.get("/api/daemon/state",s=>U(s,t.daemon?.state??null,XM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return U(s,{disabled:!0},ae);let o=await t.daemon.runCycle();return U(s,{state:t.daemon.state,result:o},ae)}),e.get("/metrics/:project_id",s=>{let o=ee(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=fc(t.dal,o),l=mc(t.dal,{project_id:o});return s.html(Ae(`Metrics \u2014 ${i.name}`,GM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=ee(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Ku(s,"since_days");return s.json(fc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=ee(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Ku(s,"since_days");return s.json(mc(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(ee(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function hy(t,e,r){let n=dc(e,ee(t,"id"),ee(t,"step_id"));return n===null?t.notFound():r(n)}function la(t){t!==void 0&&t.runCycle().catch(()=>{})}function U(t,e,r,n=200){return Sy(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function Sy(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function bM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return aa(`${t}/index.html`)?Yu(t):null;let e="src/serve/webui-dist";if(aa(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(aa(`${r}/index.html`))return r;let n=gM(pM(yM(import.meta.url)),"webui-dist");return aa(`${n}/index.html`)?Yu(n):null}function Yu(t){if(!_M(t))return t;let e=wM(process.cwd(),t);return e.length===0?".":e}function SM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ee(t,e){return Number(t.req.param(e))}function Ku(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function TM(t){switch(hM(t).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function kM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function En(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}function vM(t){if(t==null)return null;if(typeof t=="string"){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return JSON.stringify(e)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof t=="object"&&!Array.isArray(t)?JSON.stringify(t):"error:parameters_override must be a JSON object"}function _y(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function xM(t){if(t!=null)return typeof t=="string"&&Ty.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function $M(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function jM(t){return`<h1>Status</h1><div class="grid">
1591
+ `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return m_(i)?(iu(s,i),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(p_(s),s.redirect("/login",302))),dw(e,{dal:t.dal}),iy(e,{dal:t.dal}),$w(e,{dal:t.dal}),Fw(e,{terminalSessionManager:t.terminalSessionManager}),Jw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Gn(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await ac(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return W(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),b_(e,{dal:t.dal}),$_(e,{dal:t.dal}),e.get("/api/status",s=>W(s,Lo(t.dal),jM)),e.get("/api/projects",s=>W(s,Co(t.dal),NM)),e.get("/api/teams",s=>W(s,Np(t.dal),OM)),e.get("/api/workflows",s=>W(s,Mo(t.dal),LM)),e.get("/api/workflows/verify",s=>{let o=Kg();return s.req.header("accept")?.includes("text/plain")?s.text(zg(o)):s.json(o)}),e.get("/api/jobs",s=>W(s,Ap(t.dal,{status:s.req.query("status")}),CM)),e.post("/api/uploads",s=>my(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Do(t.dal,re(s,"id"));return o===null?s.notFound():W(s,o,le)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return W(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(ws(),aw)),i=Do(t.dal,re(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():W(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():W(s,t.dal.listProjectWorkflows(o.id),AM)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await En(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{nr(u)}catch{return s.text("invalid condition",400)}let d=vM(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return W(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():W(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?W(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():W(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():W(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=_y(s.req.query("status"),IM);if(typeof i=="string")return s.text(i,400);let a=_y(s.req.query("severity"),Ty);return typeof a=="string"?s.text(a,400):W(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),RM)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await En(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=xM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=$M(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return W(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():W(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=re(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await En(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):W(s,c,le)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await En(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):W(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await En(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return W(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await En(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return W(s,t.dal.reopenIssue(re(s,"id"),a),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return W(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=vr(t.dal,o,i);return W(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=vr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):W(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=TM(l.path);if(kM(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=mM(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return W(s,l,le)}return W(s,l,le)}),e.get("/api/runs",s=>W(s,Vr(t.dal,{limit:zu(s,"limit")??100}),MM)),e.get("/api/runs/:id",s=>{let o=kr(t.dal,re(s,"id"));return o===null?s.notFound():W(s,o,DM)}),e.get("/api/runs/:id/where",s=>{let o=Kr(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Fo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Uo(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Wo(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(re(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(ca(t.daemon),W(s,i,gy)):W(s,i,gy,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=re(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(ca(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>hy(s,t.dal,o=>W(s,o,FM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Cp(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():Sy(s)?s.html(`<pre>${S(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>hy(s,t.dal,o=>{let i=Vw(o);return W(s,i,a=>fe(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>W(s,Mp(t.dal,{type:s.req.query("type")}),UM)),e.get("/api/external-signals",s=>W(s,Dp(t.dal,{unhandled:s.req.query("unhandled")==="true"}),WM)),e.get("/api/attentions",s=>W(s,Zt(t.dal,{unacked:s.req.query("unacked")==="true"}),BM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():W(s,o,i=>`<p>acknowledged attention ${S(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=Po(t.dal,l);return W(s,c,u=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=gt(t.dal,re(s,"id"));return o===null?s.notFound():W(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=re(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=gt(t.dal,o);if(c===null)return s.notFound();let u=Zt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);ca(t.daemon);let p=Zt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return ca(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=Rp(t.dal,{status:i,pr_url:o});return W(s,a,qM)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Op(t.dal,o);return i===null?s.notFound():W(s,i,HM)}),e.get("/api/sessions",s=>W(s,t.dal.latestSessionSizes(),wy)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Gn(s.req.param("team_name"));return W(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),wy)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Gn(s.req.param("team_name"));try{let i=await Tp(t.dal,o,s.req.param("alias"));return W(s,i,a=>yy("compacted",a.row))}catch(i){if(i instanceof Xn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Gn(s.req.param("team_name")),i=await ac(t.dal,o,s.req.param("alias"));return W(s,i,a=>yy(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>W(s,r,Ey)),e.post("/api/intake/scan",async s=>(r=await un(t.dal),W(s,r,Ey))),e.get("/api/stats/run-throughput",s=>W(s,Up(t.dal),JM)),e.get("/api/daemon/state",s=>W(s,t.daemon?.state??null,XM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return W(s,{disabled:!0},le);let o=await t.daemon.runCycle();return W(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=re(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=pc(t.dal,o),l=hc(t.dal,{project_id:o});return s.html(Ae(`Metrics \u2014 ${i.name}`,GM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=zu(s,"since_days");return s.json(pc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=zu(s,"since_days");return s.json(hc(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(re(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function hy(t,e,r){let n=mc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function ca(t){t!==void 0&&t.runCycle().catch(()=>{})}function W(t,e,r,n=200){return Sy(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function Sy(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function bM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return la(`${t}/index.html`)?Zu(t):null;let e="src/serve/webui-dist";if(la(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(la(`${r}/index.html`))return r;let n=gM(pM(yM(import.meta.url)),"webui-dist");return la(`${n}/index.html`)?Zu(n):null}function Zu(t){if(!_M(t))return t;let e=wM(process.cwd(),t);return e.length===0?".":e}function SM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function zu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function TM(t){switch(hM(t).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function kM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function En(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}function vM(t){if(t==null)return null;if(typeof t=="string"){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return JSON.stringify(e)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof t=="object"&&!Array.isArray(t)?JSON.stringify(t):"error:parameters_override must be a JSON object"}function _y(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function xM(t){if(t!=null)return typeof t=="string"&&Ty.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function $M(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function jM(t){return`<h1>Status</h1><div class="grid">
1592
1592
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
1593
1593
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
1594
1594
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
1595
1595
  <div class="metric"><strong>${t.attentions.unacked}</strong><br>unacked attentions</div>
1596
- </div><p class="muted">generated ${S(t.generated_at)}</p>`}function NM(t){return`<h1>Projects</h1>${de(["id","name","workflow","team","path"],t.map(e=>[S(e.id),S(e.name),S(e.workflow_name),S(e.team_id),S(e.local_path)]))}`}function AM(t){return`<h1>Project Workflows</h1>${de(["id","workflow","condition","priority","enabled"],t.map(e=>[S(e.id),S(e.workflow_id),S(e.condition),S(e.priority),S(e.enabled)]))}`}function RM(t){return`<h1>Issues</h1>${de(["id","status","severity","title","ai test"],t.map(e=>[S(e.id),S(e.status),S(e.severity),S(e.title),S(e.ai_test_path)]))}`}function OM(t){return`<h1>Teams</h1>${de(["id","name","members"],t.map(e=>[S(e.id),S(e.name),S(e.members.map(r=>r.alias).join(", "))]))}`}function LM(t){return`<h1>Workflows</h1>${de(["id","name","version"],t.map(e=>[S(e.id),`<a href="/workflows/${encodeURIComponent(e.name)}">${S(e.name)}</a>`,S(e.version)]))}`}function CM(t){return`<h1>Jobs</h1>${de(["id","status","source","source_ref","run"],t.map(e=>[S(e.id),S(e.status),S(e.source),S(e.source_ref),S(e.run_id)]))}`}function MM(t){return`<h1>Runs</h1>${de(["id","job","current","terminal","started"],t.map(e=>[`<a href="/runs/${e.id}">${S(e.id)}</a>`,S(e.job_id),S(e.current_state),S(e.terminal_state),S(e.started_at)]))}`}function DM(t){let e=PM(t);return`<h1>Run ${S(t.id)}</h1>
1597
- ${ae({id:t.id,terminal_state:t.terminal_state,current_state:t.current_state,job_id:t.job_id})}
1596
+ </div><p class="muted">generated ${S(t.generated_at)}</p>`}function NM(t){return`<h1>Projects</h1>${fe(["id","name","workflow","team","path"],t.map(e=>[S(e.id),S(e.name),S(e.workflow_name),S(e.team_id),S(e.local_path)]))}`}function AM(t){return`<h1>Project Workflows</h1>${fe(["id","workflow","condition","priority","enabled"],t.map(e=>[S(e.id),S(e.workflow_id),S(e.condition),S(e.priority),S(e.enabled)]))}`}function RM(t){return`<h1>Issues</h1>${fe(["id","status","severity","title","ai test"],t.map(e=>[S(e.id),S(e.status),S(e.severity),S(e.title),S(e.ai_test_path)]))}`}function OM(t){return`<h1>Teams</h1>${fe(["id","name","members"],t.map(e=>[S(e.id),S(e.name),S(e.members.map(r=>r.alias).join(", "))]))}`}function LM(t){return`<h1>Workflows</h1>${fe(["id","name","version"],t.map(e=>[S(e.id),`<a href="/workflows/${encodeURIComponent(e.name)}">${S(e.name)}</a>`,S(e.version)]))}`}function CM(t){return`<h1>Jobs</h1>${fe(["id","status","source","source_ref","run"],t.map(e=>[S(e.id),S(e.status),S(e.source),S(e.source_ref),S(e.run_id)]))}`}function MM(t){return`<h1>Runs</h1>${fe(["id","job","current","terminal","started"],t.map(e=>[`<a href="/runs/${e.id}">${S(e.id)}</a>`,S(e.job_id),S(e.current_state),S(e.terminal_state),S(e.started_at)]))}`}function DM(t){let e=PM(t);return`<h1>Run ${S(t.id)}</h1>
1597
+ ${le({id:t.id,terminal_state:t.terminal_state,current_state:t.current_state,job_id:t.job_id})}
1598
1598
  ${e}
1599
1599
  <h2>Steps</h2>
1600
- ${de(["id","state","outcome","detail"],t.steps.map(r=>[`<span hx-get="/api/runs/${t.id}/steps/${r.id}" hx-target="#step-${r.id}" hx-swap="innerHTML">${S(r.id)}</span><div id="step-${r.id}"></div>`,S(r.state_name),S(r.outcome),S(r.status_detail)]))}`}function PM(t){let e="__paused__:";if(typeof t.current_state!="string"||!t.current_state.startsWith(e)||t.workflow===null)return"";let r=t.current_state.slice(e.length),n;try{n=JSON.parse(t.workflow.definition)}catch{return`<section class="pause"><h2>Paused at ${S(r)}</h2><p>(workflow definition unparseable)</p></section>`}let s=n.states?.[r],o=s?.schema?.outcomes??[];if(o.length===0)return`<section class="pause"><h2>Paused at ${S(r)}</h2><p>(state has no declared outcomes)</p></section>`;let i=typeof s?.prompt=="string"?s.prompt:"",l=[...t.steps].reverse().find(f=>f.state_name===r)?.artifacts.find(f=>f.kind==="pause_context"),c="";if(l?.content!==null&&l?.content!==void 0)try{let f=JSON.parse(l.content);typeof f.prompt=="string"&&(c=f.prompt)}catch{}let u=c!==""?c:i,d=o.map((f,m)=>`<label class="pause-outcome"><input type="radio" name="outcome" value="${S(f)}"${m===0?" checked":""}/> <code>${S(f)}</code></label>`).join(" ");return`<section class="pause" id="pause-section" style="border:2px solid #d28e00;background:#fff8e6;padding:1em;margin:1em 0;">
1600
+ ${fe(["id","state","outcome","detail"],t.steps.map(r=>[`<span hx-get="/api/runs/${t.id}/steps/${r.id}" hx-target="#step-${r.id}" hx-swap="innerHTML">${S(r.id)}</span><div id="step-${r.id}"></div>`,S(r.state_name),S(r.outcome),S(r.status_detail)]))}`}function PM(t){let e="__paused__:";if(typeof t.current_state!="string"||!t.current_state.startsWith(e)||t.workflow===null)return"";let r=t.current_state.slice(e.length),n;try{n=JSON.parse(t.workflow.definition)}catch{return`<section class="pause"><h2>Paused at ${S(r)}</h2><p>(workflow definition unparseable)</p></section>`}let s=n.states?.[r],o=s?.schema?.outcomes??[];if(o.length===0)return`<section class="pause"><h2>Paused at ${S(r)}</h2><p>(state has no declared outcomes)</p></section>`;let i=typeof s?.prompt=="string"?s.prompt:"",l=[...t.steps].reverse().find(f=>f.state_name===r)?.artifacts.find(f=>f.kind==="pause_context"),c="";if(l?.content!==null&&l?.content!==void 0)try{let f=JSON.parse(l.content);typeof f.prompt=="string"&&(c=f.prompt)}catch{}let u=c!==""?c:i,d=o.map((f,m)=>`<label class="pause-outcome"><input type="radio" name="outcome" value="${S(f)}"${m===0?" checked":""}/> <code>${S(f)}</code></label>`).join(" ");return`<section class="pause" id="pause-section" style="border:2px solid #d28e00;background:#fff8e6;padding:1em;margin:1em 0;">
1601
1601
  <h2 style="margin-top:0;">\u2605 Paused at <code>${S(r)}</code> \u2014 operator decision required</h2>
1602
1602
  ${u!==""?`<blockquote style="border-left:3px solid #888;padding-left:0.8em;margin-left:0;color:#444;white-space:pre-wrap;">${S(u)}</blockquote>`:""}
1603
1603
  <form hx-post="/api/runs/${S(t.id)}/resume" hx-target="#pause-result" hx-swap="innerHTML">
@@ -1608,11 +1608,11 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1608
1608
  </fieldset>
1609
1609
  </form>
1610
1610
  <div id="pause-result" style="margin-top:0.6em;"></div>
1611
- </section>`}function FM(t){return`<section><h3>${S(t.state_name)}</h3>${ae(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function gy(t){return t.resumed?`<p>resumed run ${S(t.run.id)}</p>`:`<p>resume failed: ${S(t.reason)}</p>`}function UM(t){return`<h1>External Objects</h1>${de(["id","type","provider","external_id","status","url"],t.map(e=>[S(e.id),S(e.type),S(e.provider),S(e.external_id),S(e.status),S(e.url)]))}`}function WM(t){return`<h1>External Signals</h1>${de(["id","object","kind","handled"],t.map(e=>[S(e.id),S(e.object_id),S(e.kind),S(e.handled_at)]))}`}function BM(t){let e=`<style>
1611
+ </section>`}function FM(t){return`<section><h3>${S(t.state_name)}</h3>${le(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function gy(t){return t.resumed?`<p>resumed run ${S(t.run.id)}</p>`:`<p>resume failed: ${S(t.reason)}</p>`}function UM(t){return`<h1>External Objects</h1>${fe(["id","type","provider","external_id","status","url"],t.map(e=>[S(e.id),S(e.type),S(e.provider),S(e.external_id),S(e.status),S(e.url)]))}`}function WM(t){return`<h1>External Signals</h1>${fe(["id","object","kind","handled"],t.map(e=>[S(e.id),S(e.object_id),S(e.kind),S(e.handled_at)]))}`}function BM(t){let e=`<style>
1612
1612
  @keyframes attn-flicker { 0%,100%{background:#fff8e6;} 50%{background:#ffd766;} }
1613
1613
  tr.requires-user { animation: attn-flicker 1.4s ease-in-out infinite; font-weight:600; }
1614
1614
  tr.requires-user td:first-child::before { content:"\u2605 "; color:#d28e00; }
1615
- </style>`,r=t.map(n=>{let s=(n.requires_user??0)===1&&n.acknowledged_at===null,o=n.run_id!==null?`<a href="/runs/${S(n.run_id)}">${S(n.id)}</a>`:S(n.id),i=n.acknowledged_at===null?`<button hx-post="/api/attentions/${n.id}/ack" hx-swap="outerHTML">Ack</button>`:S(n.acknowledged_at),a=[o,S(n.kind),S(n.severity),i];return`<tr${s?' class="requires-user"':""}>${a.map(l=>`<td>${l}</td>`).join("")}</tr>`}).join("");return`<h1>Attentions</h1>${e}<table><thead><tr><th>id</th><th>kind</th><th>severity</th><th>ack</th></tr></thead><tbody>${r}</tbody></table>`}function qM(t){return`<h1>Submitted PRs</h1>${de(["id","repo","pr","status","last state","submitted","last scan"],t.map(e=>[`<a href="/api/submitted-prs/${S(e.id)}">${S(e.id)}</a>`,S(e.repo),`<a href="${S(e.pr_url)}" target="_blank" rel="noreferrer">${S(e.pr_url.replace(/^https:\/\/github\.com\//,""))}</a>`,S(e.status),S(e.last_known_state??""),S(e.submitted_at),S(e.last_scanned_at??"")]))}`}function HM(t){return t===null?"<p>not found</p>":`<h1>PR ${S(t.id)}</h1><dl>
1615
+ </style>`,r=t.map(n=>{let s=(n.requires_user??0)===1&&n.acknowledged_at===null,o=n.run_id!==null?`<a href="/runs/${S(n.run_id)}">${S(n.id)}</a>`:S(n.id),i=n.acknowledged_at===null?`<button hx-post="/api/attentions/${n.id}/ack" hx-swap="outerHTML">Ack</button>`:S(n.acknowledged_at),a=[o,S(n.kind),S(n.severity),i];return`<tr${s?' class="requires-user"':""}>${a.map(l=>`<td>${l}</td>`).join("")}</tr>`}).join("");return`<h1>Attentions</h1>${e}<table><thead><tr><th>id</th><th>kind</th><th>severity</th><th>ack</th></tr></thead><tbody>${r}</tbody></table>`}function qM(t){return`<h1>Submitted PRs</h1>${fe(["id","repo","pr","status","last state","submitted","last scan"],t.map(e=>[`<a href="/api/submitted-prs/${S(e.id)}">${S(e.id)}</a>`,S(e.repo),`<a href="${S(e.pr_url)}" target="_blank" rel="noreferrer">${S(e.pr_url.replace(/^https:\/\/github\.com\//,""))}</a>`,S(e.status),S(e.last_known_state??""),S(e.submitted_at),S(e.last_scanned_at??"")]))}`}function HM(t){return t===null?"<p>not found</p>":`<h1>PR ${S(t.id)}</h1><dl>
1616
1616
  <dt>repo</dt><dd>${S(t.repo)}</dd>
1617
1617
  <dt>pr</dt><dd><a href="${S(t.pr_url)}" target="_blank" rel="noreferrer">${S(t.pr_url)}</a></dd>
1618
1618
  <dt>issue</dt><dd>${t.issue_url===null?"\u2014":`<a href="${S(t.issue_url)}" target="_blank" rel="noreferrer">${S(t.issue_url)}</a>`}</dd>
@@ -1622,39 +1622,39 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1622
1622
  <dt>submitted_at</dt><dd>${S(t.submitted_at)}</dd>
1623
1623
  <dt>last_scanned_at</dt><dd>${S(t.last_scanned_at??"\u2014")}</dd>
1624
1624
  <dt>last_known_state</dt><dd>${S(t.last_known_state??"\u2014")}</dd>
1625
- </dl>`}function wy(t){return`<h1>Sessions</h1>${de(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=$o(e.team_name),n=encodeURIComponent(e.alias);return[S(e.team_name),S(e.alias),S(e.sessionid),S(e.input_tokens),S(e.cache_tokens),S(e.output_tokens),S(e.total_tokens),S(e.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function yy(t,e){return e===null?`<span>${S(t)}</span>`:`<span>${S(t)} ${S(e.team_name)}/${S(e.alias)}</span>`}function JM(t){return`<h1>Run Throughput</h1>${de(["workflow","terminal","count"],t.map(e=>[S(e.workflow_name),S(e.terminal_state),S(e.count)]))}`}function Ey(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${de(["project","scanned","new jobs","error"],t.map(e=>[S(e.project_name),S(e.scanned),S(e.new_jobs),S(e.error)]))}`}function XM(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${ae(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function GM(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[S(l.state_name),S(l.total),S(l.request_changes),S(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[S(l.state_name),S(l.lt_5min),S(l.btw_5_15min),S(l.btw_15_60min),S(l.gt_60min),S(l.no_end)]),i=e.retry_counts.map(l=>[S(l.state_name),S(l.retried_runs),S(l.avg_retries)]),a=r.map(l=>[S(l.tool_name),S(l.invocations),S(l.successes),S(l.hit_rate_pct),S(l.avg_latency_ms??"n/a"),S(l.p50_latency_ms??"n/a"),S(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${S(t)}</h1>
1625
+ </dl>`}function wy(t){return`<h1>Sessions</h1>${fe(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=jo(e.team_name),n=encodeURIComponent(e.alias);return[S(e.team_name),S(e.alias),S(e.sessionid),S(e.input_tokens),S(e.cache_tokens),S(e.output_tokens),S(e.total_tokens),S(e.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function yy(t,e){return e===null?`<span>${S(t)}</span>`:`<span>${S(t)} ${S(e.team_name)}/${S(e.alias)}</span>`}function JM(t){return`<h1>Run Throughput</h1>${fe(["workflow","terminal","count"],t.map(e=>[S(e.workflow_name),S(e.terminal_state),S(e.count)]))}`}function Ey(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${fe(["project","scanned","new jobs","error"],t.map(e=>[S(e.project_name),S(e.scanned),S(e.new_jobs),S(e.error)]))}`}function XM(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${le(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function GM(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[S(l.state_name),S(l.total),S(l.request_changes),S(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[S(l.state_name),S(l.lt_5min),S(l.btw_5_15min),S(l.btw_15_60min),S(l.gt_60min),S(l.no_end)]),i=e.retry_counts.map(l=>[S(l.state_name),S(l.retried_runs),S(l.avg_retries)]),a=r.map(l=>[S(l.tool_name),S(l.invocations),S(l.successes),S(l.hit_rate_pct),S(l.avg_latency_ms??"n/a"),S(l.p50_latency_ms??"n/a"),S(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${S(t)}</h1>
1626
1626
  <h2>Request-changes rate</h2>
1627
1627
  <p>Total: ${S(n.request_changes)} of ${S(n.total)} steps (${S(n.rate_pct)})</p>
1628
- ${de(["state","total steps","request_changes","rate"],s)}
1628
+ ${fe(["state","total steps","request_changes","rate"],s)}
1629
1629
  <h2>Step duration distribution</h2>
1630
- ${de(["state","&lt;5min","5-15min","15-60min","&gt;60min","no end"],o)}
1630
+ ${fe(["state","&lt;5min","5-15min","15-60min","&gt;60min","no end"],o)}
1631
1631
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
1632
- ${de(["state","retried runs","avg attempts"],i)}
1632
+ ${fe(["state","retried runs","avg attempts"],i)}
1633
1633
  <h2>Tool efficacy</h2>
1634
- ${de(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var IM,Ty,ky=b(()=>{"use strict";Ti();sn();__();S_();j_();Rt();uu();yw();xw();Ow();Uw();Xw();Kw();cy();jo();py();Ui();IM=["open","assigned","closed","reopened"],Ty=["low","medium","high","critical"]});function VM(t){return Math.floor(t/6e4)*6e4}function KM(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)YM(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function YM(t,e){let r=Date.now(),n=VM(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function vy(t,e=250){let r=setInterval(()=>{try{KM(t)}catch{}},e);return{stop(){clearInterval(r)}}}var Iy=b(()=>{"use strict"});function ZM({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1634
+ ${fe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var IM,Ty,ky=b(()=>{"use strict";ki();sn();__();S_();j_();Rt();fu();yw();xw();Ow();Uw();Xw();Kw();cy();No();py();Wi();IM=["open","assigned","closed","reopened"],Ty=["low","medium","high","critical"]});function VM(t){return Math.floor(t/6e4)*6e4}function KM(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)YM(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function YM(t,e){let r=Date.now(),n=VM(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function vy(t,e=250){let r=setInterval(()=>{try{KM(t)}catch{}},e);return{stop(){clearInterval(r)}}}var Iy=b(()=>{"use strict"});function ZM({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1635
1635
  FROM run r
1636
1636
  JOIN job j ON j.id = r.job_id
1637
1637
  WHERE j.project_id = ?
1638
1638
  AND r.terminal_state IS NOT NULL
1639
1639
  ORDER BY r.id DESC
1640
- LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,zM).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,xy)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:xy,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function $y(t){for(let e of QM)try{e(t)}catch{}}var zM,xy,QM,jy=b(()=>{"use strict";zM="request_changes",xy="reviewer_rejection_rate_high";QM=[ZM]});function Es(){let t=process.env.LMCTL_DAEMON_INTERVAL_MS;if(t===void 0||t.trim().length===0)return 5e3;let e=Number(t);return Number.isFinite(e)&&e>0?e:5e3}function Ny(t){let e=t.intervalMs??Es(),r=t.runOnceFn??Ar,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??vy)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Ay(t.dal,t.monitorSessionActivityFn??ic,e,n).finally(()=>{a=null})),a.finally(()=>u(ac(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=eD(t.dal,r,t.collectSessionSizesFn??Sp,t.scanIntakeFn??un,t.monitorSessionActivityFn??ic,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function eD(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(tw({dal:t}),$y({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await Ay(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function Ay(t,e,r,n){let s=ac(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var zu=b(()=>{"use strict";Ti();ws();xu();jo();Iy();jy();lc()});function Ry(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var Oy=b(()=>{"use strict"});import{mkdirSync as tD,readFileSync as rD,readdirSync as nD,statSync as sD,writeFileSync as oD}from"node:fs";import{dirname as iD,join as Cy,sep as Ly}from"node:path";function ca(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case My:return aD(t,s.input);case Dy:return lD(t,s.input);case Py:return cD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:ed,GetObjectCommand:Qu,PutObjectCommand:Zu}}}function aD(t,e){let r=Fy(t,e.Key);return tD(iD(r),{recursive:!0}),oD(r,e.Body),{}}function lD(t,e){let r=Fy(t,e.Key),n;try{n=rD(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function cD(t,e){let r=e.Prefix??"";Uy(r);let s=uD(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function Fy(t,e){return Uy(e),Cy(t,e)}function Uy(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function uD(t){let e=[],r=(n,s)=>{let o;try{o=nD(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=Cy(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Ly==="/"?a:a.split(Ly).join("/");e.push({key:c,lastModified:sD(l).mtime})}}};return r(t,""),e}var My,Dy,Py,Zu,Qu,ed,td=b(()=>{"use strict";My="localfs-put",Dy="localfs-get",Py="localfs-list",Zu=class{input;_localfsTag=My;constructor(e){this.input=e}},Qu=class{input;_localfsTag=Dy;constructor(e){this.input=e}},ed=class{input;_localfsTag=Py;constructor(e){this.input=e}}});function Wy(){return{put:0,get:0,list:0}}function rd(t,e=dD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function nd(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var dD,ua,sd=b(()=>{"use strict";dD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};ua=class{counts=Wy();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Wy(),e}estimateCostUsd(e){return rd(this.counts,e)}}});function By(t){let e=t.now??Date.now,r=t.timers??fD,n=null,s=null;async function o(){let l=e(),c=nd(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=rd(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===nd(e())}}}var fD,qy=b(()=>{"use strict";sd();fD={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var od=b(()=>{"use strict";Gi();Ki();Ki()});function mD(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function pD(t){return t.reply_to!==void 0&&t.response!==void 0}function hD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Hy(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var da,bs,Jy=b(()=>{"use strict";od();da=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},bs=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new da("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Pt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(Hy(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Hy(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new da;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=mD(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(pD(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??hD(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:Pt(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function id(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;return!(e.kind!=="terminal"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.data!="string"||typeof e.ts!="number")}var Xy=b(()=>{"use strict"});function ad(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var Gy=b(()=>{"use strict"});function cd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var ld,Vy=b(()=>{"use strict";ld="daemon:events"});function Yy(t){return{kind:"prompt",prompt_id:t.prompt_id??Pt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function ud(t){if(t===null||typeof t!="object")return!1;let e=t;return e.kind==="prompt"&&typeof e.prompt_id=="string"&&e.prompt_id.length>0&&typeof e.root_teamfile=="string"&&e.root_teamfile.length>0&&typeof e.text=="string"}var Ky,dd=b(()=>{"use strict";od();Ky="prompt:root"});function Ss(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Zy(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function _D(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Zy(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function zy(t,e=60){if(typeof t!="string"||t==="")return!0;let r=_D(t);return r===null?!0:Date.now()/1e3>=r-e}function Zy(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var fd=b(()=>{"use strict"});async function fa(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":gD},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var gD,md=b(()=>{"use strict";gD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Qy,mkdirSync as eE,readFileSync as tE,writeFileSync as rE}from"node:fs";import{homedir as nE}from"node:os";import{dirname as sE,join as oE}from"node:path";function Ts(){return process.env.LMCTL_DEVICE_AUTH_PATH??oE(nE(),".lmctl","device-auth.json")}function iE(){return process.env.LMCTL_TOKEN_PATH??oE(nE(),".lmctl","cli-tokens.json")}function pd(t=Ts()){try{let e=JSON.parse(tE(t,"utf8"));return typeof e.userId!="string"||e.userId===""||typeof e.refreshToken!="string"||e.refreshToken===""?null:{userId:e.userId,refreshToken:e.refreshToken}}catch{return null}}function aE(t,e=Ts()){eE(sE(e),{recursive:!0,mode:448}),rE(e,JSON.stringify(t,null,2));try{Qy(e,384)}catch{}}function hd(t,e=iE()){let r={};try{r=JSON.parse(tE(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};eE(sE(e),{recursive:!0,mode:448}),rE(e,JSON.stringify(s,null,2));try{Qy(e,384)}catch{}}async function lE(t){let e=t.deviceAuthPath??Ts(),r=pd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await fa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return hd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??iE()),{idToken:n.idToken,userId:r.userId}}var _d=b(()=>{"use strict";md()});function cE(t){if(t.length===0||!t.startsWith("---"))throw new Et("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1641
- `);if(e[0]!=="---")throw new Et("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Et(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!wD.has(c))throw new Et(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ma.join(", ")}`);r[c]=u}if(n===-1)throw new Et("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ma)if(r[i]===void 0)throw new Et(`missing required frontmatter key "${i}" \u2014 required: ${ma.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var ma,wD,Et,uE=b(()=>{"use strict";ma=["title","description","members"],wD=new Set(ma),Et=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as yD,writeFileSync as qK,renameSync as HK,existsSync as fE}from"node:fs";import{basename as ED,resolve as bn,dirname as gd}from"node:path";function SD(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function TD(t){return/^\s*_MEMBER_\s+\S/.test(t)}function kD(t){return/^\s*_SESSION_\s+\S/.test(t)}function vD(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function ID(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function yd(t){let e=ED(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Re(t){let e=yD(t,"utf-8"),r=gd(bn(t)),n=Ed(e,yd(t),{baseDir:r,sourcePath:bn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=bn(r,s.sessiondir));return n}function Ed(t,e,r={}){let n=[],s=[],o=[],i=[];r.sourcePath,r.baseDir;let a=t;if(a.startsWith("#teamfile:")){let u=a.indexOf(`
1640
+ LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,zM).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,xy)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:xy,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function $y(t){for(let e of QM)try{e(t)}catch{}}var zM,xy,QM,jy=b(()=>{"use strict";zM="request_changes",xy="reviewer_rejection_rate_high";QM=[ZM]});function Es(){let t=process.env.LMCTL_DAEMON_INTERVAL_MS;if(t===void 0||t.trim().length===0)return 5e3;let e=Number(t);return Number.isFinite(e)&&e>0?e:5e3}function Ny(t){let e=t.intervalMs??Es(),r=t.runOnceFn??Ar,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??vy)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Ay(t.dal,t.monitorSessionActivityFn??lc,e,n).finally(()=>{a=null})),a.finally(()=>u(cc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=eD(t.dal,r,t.collectSessionSizesFn??Sp,t.scanIntakeFn??un,t.monitorSessionActivityFn??lc,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function eD(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(tw({dal:t}),$y({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await Ay(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function Ay(t,e,r,n){let s=cc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var Qu=b(()=>{"use strict";ki();ws();ju();No();Iy();jy();uc()});function Ry(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var Oy=b(()=>{"use strict"});import{mkdirSync as tD,readFileSync as rD,readdirSync as nD,statSync as sD,writeFileSync as oD}from"node:fs";import{dirname as iD,join as Cy,sep as Ly}from"node:path";function ua(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case My:return aD(t,s.input);case Dy:return lD(t,s.input);case Py:return cD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:rd,GetObjectCommand:td,PutObjectCommand:ed}}}function aD(t,e){let r=Fy(t,e.Key);return tD(iD(r),{recursive:!0}),oD(r,e.Body),{}}function lD(t,e){let r=Fy(t,e.Key),n;try{n=rD(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function cD(t,e){let r=e.Prefix??"";Uy(r);let s=uD(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function Fy(t,e){return Uy(e),Cy(t,e)}function Uy(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function uD(t){let e=[],r=(n,s)=>{let o;try{o=nD(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=Cy(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Ly==="/"?a:a.split(Ly).join("/");e.push({key:c,lastModified:sD(l).mtime})}}};return r(t,""),e}var My,Dy,Py,ed,td,rd,nd=b(()=>{"use strict";My="localfs-put",Dy="localfs-get",Py="localfs-list",ed=class{input;_localfsTag=My;constructor(e){this.input=e}},td=class{input;_localfsTag=Dy;constructor(e){this.input=e}},rd=class{input;_localfsTag=Py;constructor(e){this.input=e}}});function Wy(){return{put:0,get:0,list:0}}function sd(t,e=dD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function od(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var dD,da,id=b(()=>{"use strict";dD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};da=class{counts=Wy();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Wy(),e}estimateCostUsd(e){return sd(this.counts,e)}}});function By(t){let e=t.now??Date.now,r=t.timers??fD,n=null,s=null;async function o(){let l=e(),c=od(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=sd(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===od(e())}}}var fD,qy=b(()=>{"use strict";id();fD={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var ad=b(()=>{"use strict";Vi();Yi();Yi()});function mD(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function pD(t){return t.reply_to!==void 0&&t.response!==void 0}function hD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Hy(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var fa,bs,Jy=b(()=>{"use strict";ad();fa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},bs=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new fa("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Pt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(Hy(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Hy(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new fa;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=mD(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(pD(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??hD(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:Pt(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function ld(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;return!(e.kind!=="terminal"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.data!="string"||typeof e.ts!="number")}var Xy=b(()=>{"use strict"});function cd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var Gy=b(()=>{"use strict"});function dd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var ud,Vy=b(()=>{"use strict";ud="daemon:events"});function Yy(t){return{kind:"prompt",prompt_id:t.prompt_id??Pt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function fd(t){if(t===null||typeof t!="object")return!1;let e=t;return e.kind==="prompt"&&typeof e.prompt_id=="string"&&e.prompt_id.length>0&&typeof e.root_teamfile=="string"&&e.root_teamfile.length>0&&typeof e.text=="string"}var Ky,md=b(()=>{"use strict";ad();Ky="prompt:root"});function Ss(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Zy(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function _D(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Zy(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function zy(t,e=60){if(typeof t!="string"||t==="")return!0;let r=_D(t);return r===null?!0:Date.now()/1e3>=r-e}function Zy(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var pd=b(()=>{"use strict"});async function ma(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":gD},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var gD,hd=b(()=>{"use strict";gD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Qy,mkdirSync as eE,readFileSync as tE,writeFileSync as rE}from"node:fs";import{homedir as nE}from"node:os";import{dirname as sE,join as oE}from"node:path";function Ts(){return process.env.LMCTL_DEVICE_AUTH_PATH??oE(nE(),".lmctl","device-auth.json")}function iE(){return process.env.LMCTL_TOKEN_PATH??oE(nE(),".lmctl","cli-tokens.json")}function _d(t=Ts()){try{let e=JSON.parse(tE(t,"utf8"));return typeof e.userId!="string"||e.userId===""||typeof e.refreshToken!="string"||e.refreshToken===""?null:{userId:e.userId,refreshToken:e.refreshToken}}catch{return null}}function aE(t,e=Ts()){eE(sE(e),{recursive:!0,mode:448}),rE(e,JSON.stringify(t,null,2));try{Qy(e,384)}catch{}}function gd(t,e=iE()){let r={};try{r=JSON.parse(tE(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};eE(sE(e),{recursive:!0,mode:448}),rE(e,JSON.stringify(s,null,2));try{Qy(e,384)}catch{}}async function lE(t){let e=t.deviceAuthPath??Ts(),r=_d(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await ma({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return gd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??iE()),{idToken:n.idToken,userId:r.userId}}var wd=b(()=>{"use strict";hd()});function cE(t){if(t.length===0||!t.startsWith("---"))throw new Et("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1641
+ `);if(e[0]!=="---")throw new Et("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Et(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!wD.has(c))throw new Et(`unknown frontmatter key "${c}" \u2014 allowed keys: ${pa.join(", ")}`);r[c]=u}if(n===-1)throw new Et("frontmatter not closed (missing trailing `---` on its own line)");for(let i of pa)if(r[i]===void 0)throw new Et(`missing required frontmatter key "${i}" \u2014 required: ${pa.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var pa,wD,Et,uE=b(()=>{"use strict";pa=["title","description","members"],wD=new Set(pa),Et=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as yD,writeFileSync as HK,renameSync as JK,existsSync as fE}from"node:fs";import{basename as ED,resolve as bn,dirname as yd}from"node:path";function SD(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function TD(t){return/^\s*_MEMBER_\s+\S/.test(t)}function kD(t){return/^\s*_SESSION_\s+\S/.test(t)}function vD(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function ID(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function bd(t){let e=ED(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Re(t){let e=yD(t,"utf-8"),r=yd(bn(t)),n=Sd(e,bd(t),{baseDir:r,sourcePath:bn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=bn(r,s.sessiondir));return n}function Sd(t,e,r={}){let n=[],s=[],o=[],i=[];r.sourcePath,r.baseDir;let a=t;if(a.startsWith("#teamfile:")){let u=a.indexOf(`
1642
1642
  `);a=u>=0?a.slice(u+1):""}let l=null;if(a.startsWith("---"))try{l=cE(a)}catch(u){if(u instanceof Et)i.push(`frontmatter: ${u.message}`);else throw u}let c=t.split(`
1643
1643
  `);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(kD(d))throw new Error(`line ${f}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if(vD(d)){s.push(f);continue}if(ID(d)){let g=d.replace(/^\s*_SKILL_\s*/,"").trim(),_=g.length===0?[]:g.split(/\s+/u);if(_.length!==1){i.push(`line ${f}: _SKILL_ requires exactly one https:// URL or local path: ${d.trim()}`);continue}let T=_[0];try{if(new URL(T).protocol!=="https:"){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(T)&&!/^[A-Za-z]:[\\/]/u.test(T)){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}o.push(T);continue}if(!TD(d))continue;let m=SD(d);for(let g of Object.keys(m))if(!dE.includes(g))throw new Error(`line ${f}: unknown key "${g}" on _MEMBER_ line: ${d.trim()}
1644
- allowed keys: ${dE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function bd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===wd.toLowerCase());n.length>1&&r.push({field:wd,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?bn(e,o.teamfile):bn(o.teamfile);if(!fE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Re(a),c=bt(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else bD.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function bt(t){return t.members.find(e=>e.alias.toLowerCase()===wd.toLowerCase())}function Sd(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=bn(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!fE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Re(o),l=bt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return Sd(l,gd(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||gd(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function pa(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var wd,bD,dE,Ft=b(()=>{"use strict";uE();wd="Lead",bD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);dE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as xD,realpathSync as $D}from"node:fs";import{dirname as jD}from"node:path";function Td(t){ND(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function ND(t){let e=t.payload.root_teamfile;try{e=$D(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await Sn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await Sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=AD(e);if("error"in r)return await Sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-LD(t.env??process.env)).toISOString()});if(!s.acquired){let o=OD(r.alias,s.current);return await Sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??Sr)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await Sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await Sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function AD(t){if(!xD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Re(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=bt(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??jD(t)}}async function Sn(t,e){let r=hE(e.message),n=e.response===null?null:hE(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function hE(t){return t.length<=mE?{text:t,truncated:!1}:{text:t.slice(0,mE),truncated:!0}}function RD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function OD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:RD(t,e)}function LD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return pE;let r=Number(e);return!Number.isFinite(r)||r<=0?pE:r}var mE,pE,_E=b(()=>{"use strict";At();Ft();mE=256*1024,pE=30*60*1e3});import{chmodSync as SE,existsSync as CD,mkdirSync as TE,readFileSync as wa,writeFileSync as kE}from"node:fs";import{dirname as kd,resolve as ha,join as vE}from"node:path";import{fileURLToPath as MD}from"node:url";import{homedir as IE}from"node:os";import{CognitoIdentityClient as DD,GetIdCommand as PD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as gE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as FD,ListObjectsV2Command as UD,PutObjectCommand as WD,S3Client as wE}from"@aws-sdk/client-s3";function vs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:XD(t.selfUrl),n={},s;for(let x of r)if(CD(x)){n=JD(x),s=x;break}let o=(...x)=>{for(let k of x)if(typeof k=="string"&&k!=="")return k},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??BD,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??qD,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??HD,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??ya,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=ga(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ga(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=ga(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=ga(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),v=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...E!==void 0?{mailboxKey:E}:{},...v!==void 0?{tokenPath:v}:{}},f}function JD(t){try{let e=wa(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function XD(t){let e=kd(MD(t??import.meta.url));return[ha(e,"..","..","..","..","infra","terraform","terraform.tfstate"),ha(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ha(e,"..","..","..","infra","terraform","terraform.tfstate"),ha(e,"..","..","infra","terraform","terraform.tfstate")]}function ga(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function GD(t){let e=VD(t.intervalMs)??xE,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function VD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function $E(t){let e=t.tokenPath??vE(IE(),".lmctl","cli-tokens.json"),r=EE(t.tokenPath);if(zy(r.cognito?.idToken)&&pd()!==null)try{await lE({region:t.region,clientId:t.cognitoClientId??ya,cliTokensPath:e}),r=EE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(j){let H=j instanceof Error?j.message:String(j);t.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await bE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=gE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new wE({region:t.region,credentials:a}),c={ListObjectsV2Command:UD,GetObjectCommand:FD,PutObjectCommand:WD},u=Ss(n),d=u??o,f=t.deviceId,m=_n({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let j=p.loadMailboxCursor(d,m);if(j!==null)h=j.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let H=!1,me=0;for(;!H&&me<2;){me+=1;try{let I=Ji(m,"web"),$=0,O;do{let B=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of B.Contents??[]){let L=Xi(F.Key??"",m,"web");L!==void 0&&L>$&&($=L)}O=B.IsTruncated===!0?B.NextContinuationToken:void 0}while(O!==void 0);h=$,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${$} for user_id=${d}`),H=!0}catch(I){let $=I instanceof Error?I.message:String(I);if(i&&me===1&&zD(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${$}); clearing + refreshing`),YD(e),i=!1,o=await bE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=gE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new wE({region:t.region,credentials:a}),m=_n({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${$}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,E=t.promptTriggerStore,v=new ua,x=new Rr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:j=>v.record(j),onMessage:async j=>{if(_!==void 0&&id(j.payload)){_.onInbound(j.payload);return}if(T!==void 0&&ad(j.payload)){await T.onInbound(j.payload);return}if(!cd(j.payload)){if(E!==void 0&&ud(j.payload)){Td({store:E,payload:j.payload,log:t.log});return}g!==null&&await g.handleIncoming(j.payload,j)}},...p!==void 0?{onCursorAdvance:j=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:j,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new bs({client:x,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async j=>x.putMessage({conversation_id:`terminal:${j.session_id}`,payload:j})),T!==void 0&&T.setPublish(async j=>x.putMessage({conversation_id:`provider:${j.session_id}`,payload:j}));let k=j=>x.putMessage({conversation_id:ld,payload:j});x.start();let R=t.chatLogTailStore===void 0?void 0:GD({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??xE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let C=t.deviceId??o,q=`${d}/usage/`,te;return te=t.usageStore===void 0?void 0:By({meter:v,store:t.usageStore,userId:d,deviceId:C,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:j,costUsd:H,ceilingUsd:me})=>{t.log?.(`[usage] month ${j} cost $${H.toFixed(4)} >= ceiling $${me} \u2014 blocking mailbox`),x.stop().catch(()=>{}),te?.stop()},publishOwnRollup:async(j,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${q}${C}-${j}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async j=>{let H={put:0,get:0,list:0},me;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:q,MaxKeys:1e3,...me!==void 0?{ContinuationToken:me}:{}}));for(let $ of I.Contents??[]){let O=$.Key??"";if(O.endsWith(`-${j}.json`))try{let B=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(B.Body===void 0)continue;let F=JSON.parse(await B.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}me=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(me!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:x,fetchClient:g,publishDaemonEvent:k,async stop(){R?.stop(),te!==void 0&&(await te.flushNow().catch(()=>{}),te.stop()),await g.stop().catch(()=>{}),await x.stop().catch(()=>{})}}}async function jE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:ca(t.rootDir),r=_n({identityId:ks,userId:ks,deviceId:yE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Rr({bucket:"local",identityId:ks,userId:ks,deviceId:yE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&id(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&ad(c.payload)){await o.onInbound(c.payload);return}if(!cd(c.payload)){if(i!==void 0&&ud(c.payload)){Td({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??_a,readIntervalMs:t.readIntervalMs??_a,heartbeatIdleMs:t.heartbeatIdleMs??_a,backoffReadIntervalMs:t.backoffReadIntervalMs??_a});n=new bs({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:ld,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:ks,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function EE(t){let e=t??vE(IE(),".lmctl","cli-tokens.json");try{let r=wa(e,"utf8");return JSON.parse(r)}catch{return{}}}function KD(t,e){if(e===void 0||e==="")return;let r={};try{let s=wa(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};TE(kd(t),{recursive:!0,mode:448}),kE(t,JSON.stringify(n,null,2));try{SE(t,384)}catch{}}function YD(t){let e={};try{let n=wa(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,TE(kd(t),{recursive:!0,mode:448}),kE(t,JSON.stringify(r,null,2));try{SE(t,384)}catch{}}async function bE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new DD({region:t.region}).send(new PD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{KD(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function zD(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var xE,_a,ya,BD,qD,HD,ks,yE,vd=b(()=>{"use strict";Yi();td();sd();qy();Jy();Xy();Gy();Vy();dd();Gi();fd();_d();_E();xE=3e3,_a=1e3,ya="79u5jhkk46qofog661c9i0bdcs",BD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",qD="us-east-1_4iUdFggDn",HD="lmctl-next-preview-mailbox-254332045686";ks="local",yE="local"});import{spawn as jd}from"node:child_process";import{createInterface as NE}from"node:readline";var Id,xd,$d,AE,RE=b(()=>{"use strict";co();je();Id=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=jd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=NE({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1644
+ allowed keys: ${dE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function Td(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===Ed.toLowerCase());n.length>1&&r.push({field:Ed,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?bn(e,o.teamfile):bn(o.teamfile);if(!fE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Re(a),c=bt(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else bD.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function bt(t){return t.members.find(e=>e.alias.toLowerCase()===Ed.toLowerCase())}function kd(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=bn(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!fE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Re(o),l=bt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return kd(l,yd(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||yd(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function ha(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Ed,bD,dE,Ft=b(()=>{"use strict";uE();Ed="Lead",bD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);dE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as xD,realpathSync as $D}from"node:fs";import{dirname as jD}from"node:path";function vd(t){ND(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function ND(t){let e=t.payload.root_teamfile;try{e=$D(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await Sn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await Sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=AD(e);if("error"in r)return await Sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-LD(t.env??process.env)).toISOString()});if(!s.acquired){let o=OD(r.alias,s.current);return await Sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??Sr)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await Sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await Sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function AD(t){if(!xD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Re(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=bt(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??jD(t)}}async function Sn(t,e){let r=hE(e.message),n=e.response===null?null:hE(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function hE(t){return t.length<=mE?{text:t,truncated:!1}:{text:t.slice(0,mE),truncated:!0}}function RD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function OD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:RD(t,e)}function LD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return pE;let r=Number(e);return!Number.isFinite(r)||r<=0?pE:r}var mE,pE,_E=b(()=>{"use strict";At();Ft();mE=256*1024,pE=30*60*1e3});import{chmodSync as SE,existsSync as CD,mkdirSync as TE,readFileSync as ya,writeFileSync as kE}from"node:fs";import{dirname as Id,resolve as _a,join as vE}from"node:path";import{fileURLToPath as MD}from"node:url";import{homedir as IE}from"node:os";import{CognitoIdentityClient as DD,GetIdCommand as PD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as gE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as FD,ListObjectsV2Command as UD,PutObjectCommand as WD,S3Client as wE}from"@aws-sdk/client-s3";function vs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:XD(t.selfUrl),n={},s;for(let I of r)if(CD(I)){n=JD(I),s=I;break}let o=(...I)=>{for(let k of I)if(typeof k=="string"&&k!=="")return k},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??BD,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??qD,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??HD,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ea,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=wa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=wa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=wa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=wa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),v=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...E!==void 0?{mailboxKey:E}:{},...v!==void 0?{tokenPath:v}:{}},f}function JD(t){try{let e=ya(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function XD(t){let e=Id(MD(t??import.meta.url));return[_a(e,"..","..","..","..","infra","terraform","terraform.tfstate"),_a(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),_a(e,"..","..","..","infra","terraform","terraform.tfstate"),_a(e,"..","..","infra","terraform","terraform.tfstate")]}function wa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function GD(t){let e=VD(t.intervalMs)??xE,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function VD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function $E(t){let e=t.tokenPath??vE(IE(),".lmctl","cli-tokens.json"),r=EE(t.tokenPath);if(zy(r.cognito?.idToken)&&_d()!==null)try{await lE({region:t.region,clientId:t.cognitoClientId??Ea,cliTokensPath:e}),r=EE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let F=A instanceof Error?A.message:String(A);t.log?.(`[mx-mailbox] device-auth refresh failed: ${F}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await bE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=gE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new wE({region:t.region,credentials:a}),c={ListObjectsV2Command:UD,GetObjectCommand:FD,PutObjectCommand:WD},u=Ss(n),d=u??o,f=t.deviceId,m=_n({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(d,m);if(A!==null)h=A.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let F=!1,z=0;for(;!F&&z<2;){z+=1;try{let x=Xi(m,"web"),$=0,R;do{let H=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:x,MaxKeys:1e3,...R!==void 0?{ContinuationToken:R}:{}}));for(let U of H.Contents??[]){let L=Gi(U.Key??"",m,"web");L!==void 0&&L>$&&($=L)}R=H.IsTruncated===!0?H.NextContinuationToken:void 0}while(R!==void 0);h=$,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${$} for user_id=${d}`),F=!0}catch(x){let $=x instanceof Error?x.message:String(x);if(i&&z===1&&zD(x)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${$}); clearing + refreshing`),YD(e),i=!1,o=await bE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=gE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new wE({region:t.region,credentials:a}),m=_n({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${$}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,E=t.promptTriggerStore,v=new da,I=new Rr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>v.record(A),onMessage:async A=>{if(_!==void 0&&ld(A.payload)){_.onInbound(A.payload);return}if(T!==void 0&&cd(A.payload)){await T.onInbound(A.payload);return}if(!dd(A.payload)){if(E!==void 0&&fd(A.payload)){vd({store:E,payload:A.payload,log:t.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new bs({client:I,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),T!==void 0&&T.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let k=A=>I.putMessage({conversation_id:ud,payload:A});I.start();let P=t.chatLogTailStore===void 0?void 0:GD({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??xE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let q=t.deviceId??o,O=`${d}/usage/`,G;return G=t.usageStore===void 0?void 0:By({meter:v,store:t.usageStore,userId:d,deviceId:q,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:F,ceilingUsd:z})=>{t.log?.(`[usage] month ${A} cost $${F.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),I.stop().catch(()=>{}),G?.stop()},publishOwnRollup:async(A,F)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${O}${q}-${A}.json`,Body:JSON.stringify({...F,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let F={put:0,get:0,list:0},z;do{let x=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:O,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let $ of x.Contents??[]){let R=$.Key??"";if(R.endsWith(`-${A}.json`))try{let H=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:R}));if(H.Body===void 0)continue;let U=JSON.parse(await H.Body.transformToString("utf-8"));F.put+=U.put??0,F.get+=U.get??0,F.list+=U.list??0}catch{}}z=x.IsTruncated===!0?x.NextContinuationToken:void 0}while(z!==void 0);return F},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:I,fetchClient:g,publishDaemonEvent:k,async stop(){P?.stop(),G!==void 0&&(await G.flushNow().catch(()=>{}),G.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function jE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:ua(t.rootDir),r=_n({identityId:ks,userId:ks,deviceId:yE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Rr({bucket:"local",identityId:ks,userId:ks,deviceId:yE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&ld(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&cd(c.payload)){await o.onInbound(c.payload);return}if(!dd(c.payload)){if(i!==void 0&&fd(c.payload)){vd({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??ga,readIntervalMs:t.readIntervalMs??ga,heartbeatIdleMs:t.heartbeatIdleMs??ga,backoffReadIntervalMs:t.backoffReadIntervalMs??ga});n=new bs({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:ud,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:ks,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function EE(t){let e=t??vE(IE(),".lmctl","cli-tokens.json");try{let r=ya(e,"utf8");return JSON.parse(r)}catch{return{}}}function KD(t,e){if(e===void 0||e==="")return;let r={};try{let s=ya(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};TE(Id(t),{recursive:!0,mode:448}),kE(t,JSON.stringify(n,null,2));try{SE(t,384)}catch{}}function YD(t){let e={};try{let n=ya(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,TE(Id(t),{recursive:!0,mode:448}),kE(t,JSON.stringify(r,null,2));try{SE(t,384)}catch{}}async function bE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new DD({region:t.region}).send(new PD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{KD(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function zD(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var xE,ga,Ea,BD,qD,HD,ks,yE,xd=b(()=>{"use strict";zi();nd();id();qy();Jy();Xy();Gy();Vy();md();Vi();pd();wd();_E();xE=3e3,ga=1e3,Ea="79u5jhkk46qofog661c9i0bdcs",BD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",qD="us-east-1_4iUdFggDn",HD="lmctl-next-preview-mailbox-254332045686";ks="local",yE="local"});import{spawn as Ad}from"node:child_process";import{createInterface as NE}from"node:readline";var $d,jd,Nd,AE,RE=b(()=>{"use strict";uo();je();$d=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=Ad(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=NE({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1645
1645
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1646
- `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},xd=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=jd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
1646
+ `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},jd=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Ad(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
1647
1647
  `);this.buffer=i.pop()??"";for(let a of i)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),n}async sendTurn(e){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(n+`
1648
- `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let o=r.message?.content;if(Array.isArray(o))for(let i of o)i.type==="text"&&typeof i.text=="string"&&i.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:i.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let o of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(o);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},$d=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,r){this.ctx=r;let n=e.cwd??process.cwd();if(e.provider==="opencode")try{lo(n)}catch(a){Y({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=jd(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=NE({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let i=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof i?.sessionId=="string"?i.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:i}}),s}async sendTurn(e){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:e}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1648
+ `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let o=r.message?.content;if(Array.isArray(o))for(let i of o)i.type==="text"&&typeof i.text=="string"&&i.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:i.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let o of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(o);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Nd=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,r){this.ctx=r;let n=e.cwd??process.cwd();if(e.provider==="opencode")try{co(n)}catch(a){Z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Ad(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=NE({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let i=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof i?.sessionId=="string"?i.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:i}}),s}async sendTurn(e){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:e}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1649
1649
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1650
1650
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let o=r.error,i=typeof o?.message=="string"&&o.message!==""?o.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${i}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
1651
- `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},AE=t=>{switch(t){case"codex":return new Id;case"claude":case"qwen":return new xd;case"gemini":case"copilot":case"opencode":return new $d;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as ZD}from"node:crypto";import{existsSync as x8,mkdirSync as QD,readFileSync as eP,writeFileSync as tP}from"node:fs";import{homedir as rP}from"node:os";import{dirname as nP,join as sP}from"node:path";function Ea(){return process.env.LMCTL_DEVICE_FILE??sP(rP(),".lmctl","device.json")}function Or(t=Ea()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(eP(t,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function Nd(t=Ea()){let e=Or(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:ZD(),created_at:new Date().toISOString()};return QD(nP(t),{recursive:!0}),tP(t,`${JSON.stringify(r,null,2)}
1652
- `,{encoding:"utf8",mode:384}),r}var Ad=b(()=>{"use strict"});import*as OE from"node:child_process";function iP(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function Rd(t,e={}){let r=e.spawnSync===void 0&&process.env[aP]==="1",n=e.spawnSync??OE.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=ba[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=iP(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function LE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(ba).join(", ")})`;let e=oP[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var ba,oP,aP,CE=b(()=>{"use strict";ba={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},oP={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",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};aP="LMCTL_SKIP_BINARY_CHECK"});var JE={};le(JE,{ProviderBinaryPreflightError:()=>Sa,__setProviderBinaryCheckForTest:()=>_P,bootstrapAgentRestMailbox:()=>PE,publishRegisteredWorkflowsOnStart:()=>DE,resolveLocalMailboxDir:()=>qE,resolveLocalWebuiDir:()=>BE,resolveServeConfig:()=>FE,runProviderBinaryPreflight:()=>WE,runServe:()=>fP,validateServeArgs:()=>HE});import{randomBytes as lP}from"node:crypto";import{existsSync as cP}from"node:fs";import{homedir as uP}from"node:os";import{isAbsolute as ME,resolve as Od}from"node:path";async function fP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(dP),0;let r=HE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1653
- `),2;try{WE(e)}catch(E){return 1}let n=pe({path:ce()}),s={portCli:gP(t)},o;try{o=FE({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(E){return n.close(),e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
1654
- `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Ry(n);let i;if(r.localWebui!==void 0){let E=BE(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let v=qE(process.env),{s3:x,commands:k}=ca(v);i={webuiDir:E,rootDir:v,s3:x,commands:k},e.stdout.write(`local webui: serving SPA from ${E}; mailbox store ${v}
1651
+ `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},AE=t=>{switch(t){case"codex":return new $d;case"claude":case"qwen":return new jd;case"gemini":case"copilot":case"opencode":return new Nd;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as ZD}from"node:crypto";import{existsSync as $8,mkdirSync as QD,readFileSync as eP,writeFileSync as tP}from"node:fs";import{homedir as rP}from"node:os";import{dirname as nP,join as sP}from"node:path";function ba(){return process.env.LMCTL_DEVICE_FILE??sP(rP(),".lmctl","device.json")}function Or(t=ba()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(eP(t,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function Rd(t=ba()){let e=Or(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:ZD(),created_at:new Date().toISOString()};return QD(nP(t),{recursive:!0}),tP(t,`${JSON.stringify(r,null,2)}
1652
+ `,{encoding:"utf8",mode:384}),r}var Od=b(()=>{"use strict"});import*as OE from"node:child_process";function iP(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function Ld(t,e={}){let r=e.spawnSync===void 0&&process.env[aP]==="1",n=e.spawnSync??OE.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Sa[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=iP(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function LE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Sa).join(", ")})`;let e=oP[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var Sa,oP,aP,CE=b(()=>{"use strict";Sa={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},oP={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",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};aP="LMCTL_SKIP_BINARY_CHECK"});var JE={};ce(JE,{ProviderBinaryPreflightError:()=>Ta,__setProviderBinaryCheckForTest:()=>_P,bootstrapAgentRestMailbox:()=>PE,publishRegisteredWorkflowsOnStart:()=>DE,resolveLocalMailboxDir:()=>qE,resolveLocalWebuiDir:()=>BE,resolveServeConfig:()=>FE,runProviderBinaryPreflight:()=>WE,runServe:()=>fP,validateServeArgs:()=>HE});import{randomBytes as lP}from"node:crypto";import{existsSync as cP}from"node:fs";import{homedir as uP}from"node:os";import{isAbsolute as ME,resolve as Cd}from"node:path";async function fP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(dP),0;let r=HE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1653
+ `),2;try{WE(e)}catch(E){return 1}let n=pe({path:ue()}),s={portCli:gP(t)},o;try{o=FE({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(E){return n.close(),e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
1654
+ `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Ry(n);let i;if(r.localWebui!==void 0){let E=BE(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let v=qE(process.env),{s3:I,commands:k}=ua(v);i={webuiDir:E,rootDir:v,s3:I,commands:k},e.stdout.write(`local webui: serving SPA from ${E}; mailbox store ${v}
1655
1655
  `)}let a=r.noDaemon?void 0:Ny({dal:n,intervalMs:Es()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:vs({env:process.env});l.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${l.missing.join(", ")}; running without cloud sync`+(l.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${l.tfstateCandidatesChecked.length} candidate path${l.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${l.tfstatePathUsed} did not supply the missing fields)`)+`
1656
1656
  `);let c=await hP({log:E=>e.stderr.write(`${E}
1657
- `)}),u=new ta({adapterFactory:AE,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:E=>e.stderr.write(`${E}
1657
+ `)}),u=new ra({adapterFactory:AE,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:E=>e.stderr.write(`${E}
1658
1658
  `)}),d=Or()?.device_id,f=by({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:mP(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await PE({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await DE({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),T=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1659
1659
  `),await new Promise(E=>{let v=()=>{(async()=>(a!==void 0&&await a.stop(),T.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),E()))()};process.once("SIGTERM",v),process.once("SIGINT",v)}),0}function mP(t,e){return{identityPoolId:t.identityPoolId,cognitoUserPoolId:t.cognitoUserPoolId,cognitoRegion:t.region,mailboxBucket:t.mailboxBucket,workspaceFetchMode:"mailbox",...e!==void 0?{deviceId:e}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},mailboxPolling:{...t.readIntervalMs!==void 0?{readIntervalSeconds:t.readIntervalMs/1e3}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:t.heartbeatIdleMs/1e3}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:t.backoffReadIntervalMs/1e3}:{}}}}async function DE(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
1660
1660
  `)}}async function PE(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await jE({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
@@ -1663,10 +1663,10 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1663
1663
  `)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
1664
1664
  `)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
1665
1665
  `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function FE(t){let{dal:e,cli:r,env:n,parsed:s,io:o}=t,i=[],a,l=e.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,i.push("api.port")}else a=s.port;let c,u=e.getConfig("api.token");u!==null?c=u:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,i.push("api.token")):(c=lP(32).toString("hex"),e.setConfig("api.token",c),o.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let d,f=e.getConfig("api.url");f!==null?d=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(d=n.LMCTL_API_URL,i.push("api.url")):(d=`http://127.0.0.1:${a}`,e.setConfig("api.url",d));for(let m of i)o.stderr.write(`note: ${pP(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
1666
- `);return{port:a,apiUrl:d,apiToken:c}}function pP(t){switch(t){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${t.replaceAll(".","_").toUpperCase()}`}}async function hP(t){let e;try{e=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new ea({pty:{spawn:e.spawn.bind(e)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:t.log})}function _P(t){UE=t??Rd}function WE(t){let e=Object.keys(ba),r=UE(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${LE(o)}
1666
+ `);return{port:a,apiUrl:d,apiToken:c}}function pP(t){switch(t){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${t.replaceAll(".","_").toUpperCase()}`}}async function hP(t){let e;try{e=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new ta({pty:{spawn:e.spawn.bind(e)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:t.log})}function _P(t){UE=t??Ld}function WE(t){let e=Object.keys(Sa),r=UE(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${LE(o)}
1667
1667
  `);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
1668
- `),new Sa(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
1669
- `)}function BE(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=ME(r)?r:Od(process.cwd(),r);return cP(`${n}/index.html`)?n:null}function qE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?ME(e)?e:Od(process.cwd(),e):Od(uP(),".lmctl","local-mailbox")}function gP(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function HE(t,e=process.env){let r=wP(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function wP(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var dP,Sa,UE,XE=b(()=>{"use strict";Pe();ky();zu();Oy();ru();vd();td();Wu();Bu();RE();Ad();CE();Ve();dP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1668
+ `),new Ta(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
1669
+ `)}function BE(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=ME(r)?r:Cd(process.cwd(),r);return cP(`${n}/index.html`)?n:null}function qE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?ME(e)?e:Cd(process.cwd(),e):Cd(uP(),".lmctl","local-mailbox")}function gP(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function HE(t,e=process.env){let r=wP(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function wP(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var dP,Ta,UE,XE=b(()=>{"use strict";Pe();ky();Qu();Oy();su();xd();nd();qu();Hu();RE();Od();CE();Ve();dP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1670
1670
 
1671
1671
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
1672
1672
  services. Help exits before any port binding or daemon startup.
@@ -1676,23 +1676,23 @@ services. Help exits before any port binding or daemon startup.
1676
1676
  against the local filesystem (no S3, no Cognito) with a fixed
1677
1677
  local identity. Mailbox store defaults to
1678
1678
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
1679
- `;Sa=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},UE=Rd});var GE={};le(GE,{runIntake:()=>EP});async function EP(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(yP),0):r==="scan"?bP(n,e):r==="config"?SP(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1680
- `),1)}async function bP(t,e){let r=P(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=N(r,"--project");return X(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await eu({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await un(s)),0})}async function SP(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=P(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=N(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=N(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=N(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return X(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return W(e,d),0})}var yP,VE=b(()=>{"use strict";Ti();$e();yP=`usage: lmctl intake <scan|config> ...
1679
+ `;Ta=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},UE=Ld});var GE={};ce(GE,{runIntake:()=>EP});async function EP(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(yP),0):r==="scan"?bP(n,e):r==="config"?SP(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1680
+ `),1)}async function bP(t,e){let r=D(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=j(r,"--project");return X(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await ru({dal:s,project:o});return B(e,{project_id:o.id,project_name:o.name,...i}),0}return B(e,await un(s)),0})}async function SP(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=D(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=j(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=j(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=j(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return X(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return B(e,d),0})}var yP,VE=b(()=>{"use strict";ki();$e();yP=`usage: lmctl intake <scan|config> ...
1681
1681
 
1682
1682
  Scan configured project GitHub issues into lmctl, or update per-project
1683
1683
  intake settings such as enabled state, labels, and issue state filters.
1684
- `});import{createHash as TP}from"node:crypto";import{existsSync as Is,mkdirSync as kP,readFileSync as YE,realpathSync as vP,writeFileSync as IP}from"node:fs";import{dirname as zE,resolve as ZE}from"node:path";function Lr(t){let e=ZE(t);return Is(e)?vP(e):e}function KE(t,e){let r=zE(e),n=Ed(t,yd(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=ZE(r,s.sessiondir));return n}function xs(t,e){let r=Lr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Is(r)&&"upsertRootTeam"in e&&(kP(zE(r),{recursive:!0}),IP(r,n.raw_text,"utf8")),KE(n.raw_text,r);if(Is(r)){let s=YE(r,"utf8"),o=KE(s,r);return"upsertRootTeam"in e&&$P(o)&&jP(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Is(r))throw new Error(`teamfile not found: ${t}`);return Re(r)}function QE(t,e,r){let n=Lr(t),s=e.getRootTeam(n);s===null||!Is(n)||YE(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 $P(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=xP)}function jP(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:TP("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var xP,Ta=b(()=>{"use strict";Ft();xP=5});import{existsSync as NP}from"node:fs";import{dirname as eb}from"node:path";function OP(t){return AP.test(t)||RP.test(t)}function tb(t){return ka.test(t)}function $s(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!ka.test(n)?null:{teamfile:r,alias:n}}function Ut(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!tb(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${ka.source}).`);let n=Lr(t);if(r===void 0&&!NP(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=xs(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=pa(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1685
- Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=Sd(o,eb(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
1686
- Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??eb(n),isLead:bt(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function cr(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=$s(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?tb(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${ka.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1684
+ `});import{createHash as TP}from"node:crypto";import{existsSync as Is,mkdirSync as kP,readFileSync as YE,realpathSync as vP,writeFileSync as IP}from"node:fs";import{dirname as zE,resolve as ZE}from"node:path";function Lr(t){let e=ZE(t);return Is(e)?vP(e):e}function KE(t,e){let r=zE(e),n=Sd(t,bd(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=ZE(r,s.sessiondir));return n}function xs(t,e){let r=Lr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Is(r)&&"upsertRootTeam"in e&&(kP(zE(r),{recursive:!0}),IP(r,n.raw_text,"utf8")),KE(n.raw_text,r);if(Is(r)){let s=YE(r,"utf8"),o=KE(s,r);return"upsertRootTeam"in e&&$P(o)&&jP(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Is(r))throw new Error(`teamfile not found: ${t}`);return Re(r)}function QE(t,e,r){let n=Lr(t),s=e.getRootTeam(n);s===null||!Is(n)||YE(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 $P(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=xP)}function jP(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:TP("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var xP,ka=b(()=>{"use strict";Ft();xP=5});import{existsSync as NP}from"node:fs";import{dirname as eb}from"node:path";function OP(t){return AP.test(t)||RP.test(t)}function tb(t){return va.test(t)}function $s(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!va.test(n)?null:{teamfile:r,alias:n}}function Ut(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!tb(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${va.source}).`);let n=Lr(t);if(r===void 0&&!NP(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=xs(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=ha(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1685
+ Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=kd(o,eb(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
1686
+ Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??eb(n),isLead:bt(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function cr(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=$s(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?tb(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${va.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1687
1687
  Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(OP(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: "${r}" is a bare sessionid, but ${t.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:r};return s.provider!==void 0&&(a.provider=s.provider),a}return n!==void 0?{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
1688
1688
  Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${t.name}: can't infer target type from "${r}".
1689
1689
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
1690
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,AP,RP,ka,Tn=b(()=>{"use strict";Ft();Ta();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},AP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,RP=/^ses_[A-Za-z0-9_-]+$/,ka=/^[A-Za-z][A-Za-z0-9_-]*$/});function sb(t){let e=rb(t.registry,t.fromTeamfile);if(e===void 0)return kn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!nb(e,t.fromAlias))return kn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=rb(t.registry,t.toTeamfile);return r===void 0?kn(`target team is not registered in policy graph: ${t.toTeamfile}`):nb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?kn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?kn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:kn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function rb(t,e){return t.teams.find(r=>r.teamfile===e)}function nb(t,e){return t.aliases.some(r=>r===e)}function kn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var ob=b(()=>{"use strict"});import{basename as LP}from"node:path";function ab(t,e){let r=new Date(e.now.getTime()-Ia()).toISOString(),n=ub(t,r).filter(p=>!p.sender.teamfile.startsWith("prompt:")),s=PP(e.sender,n),o=FP(e.sender,n);o!==null&&o.teamfile===e.root&&!va(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(p=>va(p,i)),c=n.filter(p=>va(p.receiver,i)&&s.some(h=>va(h,p.receiver))).reduce((p,h)=>p+Math.max(0,h.activeCount-1),0),u=l.length+c+1,d=l.map(p=>p.at).filter(p=>p!==null).sort((p,h)=>h-p)[0]??null,f=d!==null&&e.now.getTime()-d<CP;return{stop:l.length>=1&&(f||u>MP),chain:UP(a)}}function lb(t,e){let r=new Date(e.now.getTime()-Ia()).toISOString(),n=ub(t,r),s=db(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function Ia(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return ib;let r=Number(e);return!Number.isFinite(r)||r<=0?ib:r}function cb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function DP(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at),activeCount:t.active_count}}function ub(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(DP).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function PP(t,e,r={}){let n=new Map;for(let a of e)n.set(Cr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Cr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Cr(o));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let u=Cr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function db(t,e){let r=Cr(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Cr(l.sender),u=Cr(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function FP(t,e){let r=db(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function va(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Cr(t){return`${t.teamfile}\0${t.alias}`}function UP(t){return t.map(e=>`${LP(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var CP,MP,ib,fb=b(()=>{"use strict";CP=6e4,MP=2,ib=30*60*1e3});var gb={};le(gb,{parseIdleTimeoutMs:()=>_b,runChat:()=>BP});async function BP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${pb}
1690
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,AP,RP,va,Tn=b(()=>{"use strict";Ft();ka();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},AP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,RP=/^ses_[A-Za-z0-9_-]+$/,va=/^[A-Za-z][A-Za-z0-9_-]*$/});function sb(t){let e=rb(t.registry,t.fromTeamfile);if(e===void 0)return kn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!nb(e,t.fromAlias))return kn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=rb(t.registry,t.toTeamfile);return r===void 0?kn(`target team is not registered in policy graph: ${t.toTeamfile}`):nb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?kn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?kn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:kn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function rb(t,e){return t.teams.find(r=>r.teamfile===e)}function nb(t,e){return t.aliases.some(r=>r===e)}function kn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var ob=b(()=>{"use strict"});import{basename as LP}from"node:path";function ab(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=ub(t,r).filter(p=>!p.sender.teamfile.startsWith("prompt:")),s=PP(e.sender,n),o=FP(e.sender,n);o!==null&&o.teamfile===e.root&&!Ia(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(p=>Ia(p,i)),c=n.filter(p=>Ia(p.receiver,i)&&s.some(h=>Ia(h,p.receiver))).reduce((p,h)=>p+Math.max(0,h.activeCount-1),0),u=l.length+c+1,d=l.map(p=>p.at).filter(p=>p!==null).sort((p,h)=>h-p)[0]??null,f=d!==null&&e.now.getTime()-d<CP;return{stop:l.length>=1&&(f||u>MP),chain:UP(a)}}function lb(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=ub(t,r),s=db(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function xa(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return ib;let r=Number(e);return!Number.isFinite(r)||r<=0?ib:r}function cb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function DP(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at),activeCount:t.active_count}}function ub(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(DP).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function PP(t,e,r={}){let n=new Map;for(let a of e)n.set(Cr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Cr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Cr(o));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let u=Cr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function db(t,e){let r=Cr(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Cr(l.sender),u=Cr(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function FP(t,e){let r=db(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function Ia(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Cr(t){return`${t.teamfile}\0${t.alias}`}function UP(t){return t.map(e=>`${LP(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var CP,MP,ib,fb=b(()=>{"use strict";CP=6e4,MP=2,ib=30*60*1e3});var gb={};ce(gb,{parseIdleTimeoutMs:()=>_b,runChat:()=>BP});async function BP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${pb}
1691
1691
  `),t.length===0?2:0;let r=HP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1692
1692
  ${pb}
1693
1693
  `),2;if(r.runFlag!==void 0){let f=Number.parseInt(r.runFlag,10);return!Number.isFinite(f)||f<=0||String(f)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
1694
1694
  `),2):await X(e,async m=>{let p=m.getRun(f);if(p===null)return e.stderr.write(`error: run ${f}: not found
1695
- `),1;if(p.terminal_state!==null&&p.terminal_state.length>0)return w(e,`run ${f}: already terminal (${p.terminal_state}); chat --run cannot resume a terminated run`);let h=ra(m,f);if(h===null)return e.stderr.write(`error: run ${f}: no pending operator-answerable attention (chat --run only resumes paused runs)
1695
+ `),1;if(p.terminal_state!==null&&p.terminal_state.length>0)return w(e,`run ${f}: already terminal (${p.terminal_state}); chat --run cannot resume a terminated run`);let h=na(m,f);if(h===null)return e.stderr.write(`error: run ${f}: no pending operator-answerable attention (chat --run only resumes paused runs)
1696
1696
  `),1;if(h.kind==="workflow_escalation"){if(r.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
1697
1697
  `),2;let g=m.resumeEscalation(h.attention_id,r.prompt);return g.resumed===!0?(e.stdout.write(`run ${f}: escalation resumed (decision: ${r.prompt})
1698
1698
  `),0):(e.stderr.write(`error: run ${f}: resumeEscalation failed (${g.reason})
@@ -1704,22 +1704,22 @@ ${pb}
1704
1704
  `),2;if(n.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
1705
1705
  `),2;let s,o=null,i=null;if(n.mode==="ai-team"){if(n.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
1706
1706
  `),2;let f=n.alias;try{let m=await X(e,E=>Ut(n.teamfile,f,E)),p=m.teamfile,h=await X(e,E=>JP(r.fromFlag,p,E)),g=await XP(e,{explicitRoot:r.rootFlag,sender:h,receiverTeamfile:p,operatorOrigin:r.fromFlag===void 0}),_=r.fromFlag===void 0?null:await GP(e,{rootTeamfile:g,sender:h,receiverTeamfile:p,receiverAlias:m.alias});_!==null&&!_.allowed&&e.stderr.write(`warning: out-of-policy chat send: ${_.reason}
1707
- `),s={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir,alias:m.alias,...m.model!==void 0?{model:m.model}:{},...m.effort!==void 0?{effort:m.effort}:{}},ni(e,m.isLead,m.alias,m.provider,m.sessiondir);try{si(e,Re(n.teamfile),n.teamfile)}catch{}if(o={root_teamfile:g,sender_teamfile:h.teamfile,sender_alias:h.alias,receiver_teamfile:p,receiver_alias:m.alias,policy:_},r.fromFlag!==void 0&&h.teamfile!==p){let E=await X(e,v=>ab(v,{root:g,sender:h,receiverTeamfile:p,receiverAlias:m.alias,now:new Date}));if(E.stop){let v=cb(E.chain);return await xa(e,{...o,message:r.prompt,response:null,status:"error",error_detail:v}),e.stderr.write(`${v}
1708
- `),1}}let T=await YP(e,{receiver_teamfile:p,receiver_alias:m.alias,sender_teamfile:h.teamfile,sender_alias:h.alias,force:r.force===!0});if(!T.acquired){let E=ZP(m.alias,T.current);return await xa(e,{...o,message:r.prompt,response:null,status:"error",error_detail:E}),e.stderr.write(`error: ${E}
1707
+ `),s={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir,alias:m.alias,isLead:m.isLead,...m.model!==void 0?{model:m.model}:{},...m.effort!==void 0?{effort:m.effort}:{}},si(e,m.isLead,m.alias,m.provider,m.sessiondir);try{oi(e,Re(n.teamfile),n.teamfile)}catch{}if(o={root_teamfile:g,sender_teamfile:h.teamfile,sender_alias:h.alias,receiver_teamfile:p,receiver_alias:m.alias,policy:_},r.fromFlag!==void 0&&h.teamfile!==p){let E=await X(e,v=>ab(v,{root:g,sender:h,receiverTeamfile:p,receiverAlias:m.alias,now:new Date}));if(E.stop){let v=cb(E.chain);return await $a(e,{...o,message:r.prompt,response:null,status:"error",error_detail:v}),e.stderr.write(`${v}
1708
+ `),1}}let T=await YP(e,{receiver_teamfile:p,receiver_alias:m.alias,sender_teamfile:h.teamfile,sender_alias:h.alias,force:r.force===!0});if(!T.acquired){let E=ZP(m.alias,T.current);return await $a(e,{...o,message:r.prompt,response:null,status:"error",error_detail:E}),e.stderr.write(`error: ${E}
1709
1709
  `),1}i=T.lease}catch(m){let p=m instanceof Error?m.message:String(m);return e.stderr.write(`error: ${p}
1710
1710
  `),m instanceof ge,1}}else{if(r.force===!0)return e.stderr.write(`error: --force is only valid for AI-team chat
1711
1711
  `),2;if(n.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
1712
- `),2;s={provider:n.provider,sessionId:n.sessionid,cwd:process.cwd()}}let a=!1,l=Se(),c=0,u=0,d=0;try{let f={provider:s.provider,sessionId:s.sessionId,cwd:s.cwd,prompt:r.prompt,permissionMode:r.permissionMode,env:process.env,onDelta:h=>{a=!0,l&&(c+=1,d=Buffer.byteLength(h,"utf8"),u+=d),e.stdout.write(h)},onProgress:h=>QP(e,s.alias??"(raw)",h)};s.model!==void 0&&(f.model=s.model),s.effort!==void 0&&(f.effort=s.effort),s.alias!==void 0&&(f.alias=s.alias),r.idleTimeoutMs!==void 0&&(f.timeoutMs=r.idleTimeoutMs);let m=await Sr(f);l&&Vs(JSON.stringify({event:"chat_return",alias:s.alias??"(raw)",provider:s.provider,streamed:a,blockCount:c,streamedBytes:u,resultTextBytes:Buffer.byteLength(m.text,"utf8"),lastChunkBytes:d,tailPreview:qP(m.text,200)}));let p=m.status==="stalled";return o!==null&&await xa(e,{...o,message:r.prompt,response:p?null:m.text,status:o.policy?.outOfPolicy===!0?"out_of_policy":p?"error":"ok",error_detail:o.policy?.outOfPolicy===!0?o.policy.reason:p?`provider stalled${m.stalledAfterMs!==void 0?` after ${m.stalledAfterMs}ms`:""}`:null}),a?m.text.endsWith(`
1712
+ `),2;s={provider:n.provider,sessionId:n.sessionid,cwd:process.cwd()}}let a=!1,l=Se(),c=0,u=0,d=0;try{let f={provider:s.provider,sessionId:s.sessionId,cwd:s.cwd,prompt:r.prompt,permissionMode:r.permissionMode,env:process.env,onDelta:h=>{a=!0,l&&(c+=1,d=Buffer.byteLength(h,"utf8"),u+=d),e.stdout.write(h)},onProgress:h=>QP(e,s.alias??"(raw)",h)};s.model!==void 0&&(f.model=s.model),s.effort!==void 0&&(f.effort=s.effort),s.alias!==void 0&&(f.alias=s.alias),s.isLead!==void 0&&(f.isLead=s.isLead),r.idleTimeoutMs!==void 0&&(f.timeoutMs=r.idleTimeoutMs);let m=await Sr(f);l&&Vs(JSON.stringify({event:"chat_return",alias:s.alias??"(raw)",provider:s.provider,streamed:a,blockCount:c,streamedBytes:u,resultTextBytes:Buffer.byteLength(m.text,"utf8"),lastChunkBytes:d,tailPreview:qP(m.text,200)}));let p=m.status==="stalled";return o!==null&&await $a(e,{...o,message:r.prompt,response:p?null:m.text,status:o.policy?.outOfPolicy===!0?"out_of_policy":p?"error":"ok",error_detail:o.policy?.outOfPolicy===!0?o.policy.reason:p?`provider stalled${m.stalledAfterMs!==void 0?` after ${m.stalledAfterMs}ms`:""}`:null}),a?m.text.endsWith(`
1713
1713
  `)||e.stdout.write(`
1714
1714
  `):e.stdout.write(`${m.text}${m.text.endsWith(`
1715
1715
  `)?"":`
1716
- `}`),m.status==="stalled"?1:0}catch(f){let m=f instanceof Error?f.message:String(f);return o!==null&&await xa(e,{...o,message:r.prompt,response:null,status:o.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:o.policy?.outOfPolicy===!0?`${o.policy.reason}; provider error: ${m}`:m}),e.stderr.write(`error: ${m}
1717
- `),1}finally{i!==null&&await zP(e,i)}}function qP(t,e){return t.slice(-e)}function HP(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=_b(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function JP(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=$s(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Lr(n.teamfile),o=xs(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=pa(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function XP(t,e){return e.explicitRoot!==void 0?Lr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await X(t,r=>lb(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function GP(t,e){return await X(t,r=>sb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:VP(r,e.sender.teamfile,e.receiverTeamfile)}))}function VP(t,e,r){return{teams:[e,r].map(s=>KP(s,t))}}function KP(t,e){let r=xs(t,e),n=bt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function YP(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-Ia()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await X(t,o=>{let i=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});return i.acquired?{acquired:!0,lease:i.current??s}:{acquired:!1,current:i.current}})}async function zP(t,e){try{await X(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1718
- `)}}function ZP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function xa(t,e){let r=hb(e.message),n=e.response===null?null:hb(e.response);try{await X(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1716
+ `}`),m.status==="stalled"?1:0}catch(f){let m=f instanceof Error?f.message:String(f);return o!==null&&await $a(e,{...o,message:r.prompt,response:null,status:o.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:o.policy?.outOfPolicy===!0?`${o.policy.reason}; provider error: ${m}`:m}),e.stderr.write(`error: ${m}
1717
+ `),1}finally{i!==null&&await zP(e,i)}}function qP(t,e){return t.slice(-e)}function HP(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=_b(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function JP(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=$s(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Lr(n.teamfile),o=xs(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=ha(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function XP(t,e){return e.explicitRoot!==void 0?Lr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await X(t,r=>lb(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function GP(t,e){return await X(t,r=>sb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:VP(r,e.sender.teamfile,e.receiverTeamfile)}))}function VP(t,e,r){return{teams:[e,r].map(s=>KP(s,t))}}function KP(t,e){let r=xs(t,e),n=bt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function YP(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-xa()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await X(t,o=>{let i=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});return i.acquired?{acquired:!0,lease:i.current??s}:{acquired:!1,current:i.current}})}async function zP(t,e){try{await X(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1718
+ `)}}function ZP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function $a(t,e){let r=hb(e.message),n=e.response===null?null:hb(e.response);try{await X(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1719
1719
  `)}}function hb(t){return t.length<=mb?{text:t,truncated:!1}:{text:t.slice(0,mb),truncated:!0}}function _b(t){if(t==="0")return 0;let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d) or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function QP(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1720
1720
  `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
1721
1721
  `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
1722
- `)}var WP,mb,pb,wb=b(()=>{"use strict";At();$e();Tn();Ft();rs();ob();Ta();fb();je();na();Rt();WP={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},mb=256*1024,pb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1722
+ `)}var WP,mb,pb,wb=b(()=>{"use strict";At();$e();Tn();Ft();rs();ob();ka();fb();je();sa();Rt();WP={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},mb=256*1024,pb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1723
1723
  lmctl chat <teamfile> <alias> "<prompt>"
1724
1724
  lmctl chat <sessionid> "<prompt>" --provider <name>
1725
1725
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -1727,13 +1727,13 @@ ${pb}
1727
1727
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
1728
1728
  [--from <teamfile>:<alias>] [--root <teamfile>] [--force]
1729
1729
 
1730
- Send a prompt to a team member or raw provider session, or answer a paused run.`});var js,bY,Ld=b(()=>{"use strict";js=[{name:"lmctl_chat",description:'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. For batch or long-running background jobs, call the CLI directly instead: `lmctl chat <team.lmctl> <alias> "<prompt>"`.',inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"],additionalProperties:!1},local:!0}],bY=js.length});import{spawn as e1}from"node:child_process";async function Eb(t,e,r){let n=r1.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};if(n.inputSchema.additionalProperties===!1){let o=new Set(Object.keys(n.inputSchema.properties));for(let i of Object.keys(s))if(!o.has(i))return{status:"error",code:400,message:`unknown parameter: ${i}`}}return n1(n.name,s)}function n1(t,e){return t==="lmctl_chat"?s1(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function s1(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=["chat",r,n,e];return s!==void 0&&o.push("--from",s),o1(o,process.cwd())}function o1(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=e1("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=i1(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){Se()&&Vs(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
1731
- `).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function i1(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return yb;let r=Number(e);return!Number.isFinite(r)||r<=0?yb:r}function Cd(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:t1),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var t1,yb,r1,Md=b(()=>{"use strict";Ld();je();t1="http://127.0.0.1:8787",yb=30*60*1e3,r1=new Map(js.map(t=>[t.name,t]))});async function u1(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Dd({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:a1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:l1,version:c1}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:js.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await Eb(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function Dd(t){return`${JSON.stringify(t)}
1732
- `}async function bb(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Dd({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await u1(l,t);c.kind==="response"?t.io.write(Dd(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1730
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});var js,SY,Md=b(()=>{"use strict";js=[{name:"lmctl_chat",description:'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. For batch or long-running background jobs, call the CLI directly instead: `lmctl chat <team.lmctl> <alias> "<prompt>"`.',inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"],additionalProperties:!1},local:!0}],SY=js.length});import{spawn as e1}from"node:child_process";async function Eb(t,e,r){let n=r1.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};if(n.inputSchema.additionalProperties===!1){let o=new Set(Object.keys(n.inputSchema.properties));for(let i of Object.keys(s))if(!o.has(i))return{status:"error",code:400,message:`unknown parameter: ${i}`}}return n1(n.name,s)}function n1(t,e){return t==="lmctl_chat"?s1(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function s1(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=["chat",r,n,e];return s!==void 0&&o.push("--from",s),o1(o,process.cwd())}function o1(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=e1("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=i1(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){Se()&&Vs(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
1731
+ `).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function i1(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return yb;let r=Number(e);return!Number.isFinite(r)||r<=0?yb:r}function Dd(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:t1),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var t1,yb,r1,Pd=b(()=>{"use strict";Md();je();t1="http://127.0.0.1:8787",yb=30*60*1e3,r1=new Map(js.map(t=>[t.name,t]))});async function u1(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Fd({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:a1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:l1,version:c1}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:js.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await Eb(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function Fd(t){return`${JSON.stringify(t)}
1732
+ `}async function bb(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Fd({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await u1(l,t);c.kind==="response"?t.io.write(Fd(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1733
1733
  `);for(;d!==-1;){let f=n.slice(0,d);n=n.slice(d+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),d=n.indexOf(`
1734
1734
  `)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
1735
- `),a.finally(()=>c(1))})})}var a1,l1,c1,Sb=b(()=>{"use strict";Ld();Md();a1="2025-06-18",l1="lmctl",c1="0.0.1"});var kb={};le(kb,{runMcp:()=>f1});async function f1(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(d1),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1736
- `),2;Y({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??m1(),o=1;try{let i=s===void 0?Cd({getConfig:()=>null},process.env):Cd(s,process.env);return o=await bb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{Y({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function m1(){let t=ce(),e=3;for(let r=1;r<=e;r+=1)try{return pe({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(Y({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&Tb(s))p1(50*r);else if(!Tb(s))break}}function Tb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function p1(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var d1,vb=b(()=>{"use strict";Pe();Md();Sb();je();Ve();d1=`usage: lmctl mcp
1735
+ `),a.finally(()=>c(1))})})}var a1,l1,c1,Sb=b(()=>{"use strict";Md();Pd();a1="2025-06-18",l1="lmctl",c1="0.0.1"});var kb={};ce(kb,{runMcp:()=>f1});async function f1(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(d1),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1736
+ `),2;Z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??m1(),o=1;try{let i=s===void 0?Dd({getConfig:()=>null},process.env):Dd(s,process.env);return o=await bb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{Z({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function m1(){let t=ue(),e=3;for(let r=1;r<=e;r+=1)try{return pe({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(Z({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&Tb(s))p1(50*r);else if(!Tb(s))break}}function Tb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function p1(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var d1,vb=b(()=>{"use strict";Pe();Pd();Sb();je();Ve();d1=`usage: lmctl mcp
1737
1737
 
1738
1738
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
1739
1739
  local config, then uses stdin/stdout for JSON-RPC frames.
@@ -1748,12 +1748,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1748
1748
  WHERE r.terminal_state IS NULL
1749
1749
  AND r.paused_at IS NULL
1750
1750
  AND r.started_at <= ?
1751
- `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=Ns(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push($a(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function g1(t,e,r){let n=$b(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
1751
+ `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=Ns(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(ja(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function g1(t,e,r){let n=$b(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
1752
1752
  SELECT id, project_id, source, source_ref, status, enqueued_at
1753
1753
  FROM job
1754
1754
  WHERE status NOT IN ('done', 'failed')
1755
1755
  AND enqueued_at <= ?
1756
- `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=Ns(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push($a(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function w1(t,e,r){let n=jb(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
1756
+ `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=Ns(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(ja(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function w1(t,e,r){let n=jb(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
1757
1757
  SELECT project_id,
1758
1758
  COUNT(*) AS count,
1759
1759
  (SELECT kind FROM attention a2
@@ -1768,7 +1768,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1768
1768
  AND kind NOT IN ('attentions_overdue', 'issues_overdue')
1769
1769
  AND created_at <= ?
1770
1770
  GROUP BY project_id
1771
- `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=Ns(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push($a(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function y1(t,e,r){let n=jb(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
1771
+ `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=Ns(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(ja(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function y1(t,e,r){let n=jb(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
1772
1772
  SELECT project_id,
1773
1773
  COUNT(*) AS count,
1774
1774
  (SELECT title FROM project_issue i2
@@ -1781,34 +1781,34 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1781
1781
  WHERE status IN ('open', 'reopened')
1782
1782
  AND created_at <= ?
1783
1783
  GROUP BY project_id
1784
- `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=Ns(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${S1(i.oldest_title,40)})`;o.push($a(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function $a(t,e){let r=E1(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function E1(t,e,r,n){let s=b1(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
1784
+ `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=Ns(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${S1(i.oldest_title,40)})`;o.push(ja(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function ja(t,e){let r=E1(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function E1(t,e,r,n){let s=b1(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
1785
1785
  SELECT * FROM attention
1786
1786
  WHERE acknowledged_at IS NULL
1787
1787
  AND created_at >= ?
1788
1788
  AND payload LIKE ?
1789
1789
  ORDER BY id DESC
1790
1790
  LIMIT 1
1791
- `).get(s,o)??null}function $b(t,e){return new Date(t.getTime()-e*60*1e3)}function b1(t,e){return new Date(t.getTime()-e*60*60*1e3)}function jb(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function S1(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var As,Nb=b(()=>{"use strict";Ib();As={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var Rb={};le(Rb,{renderSummary:()=>Ab,runMonitor:()=>k1});async function k1(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(T1),0;let r=P(t,[],["--json","--quiet"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--json"),s=M(r,"--quiet");try{return await X(e,o=>{let i=xb(o);return n?W(e,i):s||e.stdout.write(`${Ab(i.findings)}
1792
- `),0})}catch(o){return fe(e,o)}}function Ab(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${v1(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function v1(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var T1,Ob=b(()=>{"use strict";$e();Nb();T1=`usage: lmctl monitor [--json] [--quiet]
1791
+ `).get(s,o)??null}function $b(t,e){return new Date(t.getTime()-e*60*1e3)}function b1(t,e){return new Date(t.getTime()-e*60*60*1e3)}function jb(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function S1(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var As,Nb=b(()=>{"use strict";Ib();As={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var Rb={};ce(Rb,{renderSummary:()=>Ab,runMonitor:()=>k1});async function k1(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(T1),0;let r=D(t,[],["--json","--quiet"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=C(r,"--json"),s=C(r,"--quiet");try{return await X(e,o=>{let i=xb(o);return n?B(e,i):s||e.stdout.write(`${Ab(i.findings)}
1792
+ `),0})}catch(o){return me(e,o)}}function Ab(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${v1(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function v1(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var T1,Ob=b(()=>{"use strict";$e();Nb();T1=`usage: lmctl monitor [--json] [--quiet]
1793
1793
 
1794
1794
  Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
1795
1795
  issues; emit findings as attentions for the operator/master to handle.
1796
- `});var Lb={};le(Lb,{runDevice:()=>M1});import{readFileSync as I1}from"node:fs";import{homedir as x1}from"node:os";import{join as $1}from"node:path";import{CognitoIdentityClient as j1,GetIdCommand as N1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as A1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as R1,ListObjectsV2Command as O1,PutObjectCommand as L1,S3Client as C1}from"@aws-sdk/client-s3";async function M1(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write(Pd),0;if(r==="init"){let n=Nd();return e.stdout.write(`${n.device_id}
1797
- `),0}if(r==="id"){let n=Or();return n===null?(e.stderr.write(`error: no device id initialized at ${Ea()}; run 'lmctl device init'
1796
+ `});var Lb={};ce(Lb,{runDevice:()=>M1});import{readFileSync as I1}from"node:fs";import{homedir as x1}from"node:os";import{join as $1}from"node:path";import{CognitoIdentityClient as j1,GetIdCommand as N1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as A1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as R1,ListObjectsV2Command as O1,PutObjectCommand as L1,S3Client as C1}from"@aws-sdk/client-s3";async function M1(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write(Ud),0;if(r==="init"){let n=Rd();return e.stdout.write(`${n.device_id}
1797
+ `),0}if(r==="id"){let n=Or();return n===null?(e.stderr.write(`error: no device id initialized at ${ba()}; run 'lmctl device init'
1798
1798
  `),1):(e.stdout.write(`${n.device_id}
1799
1799
  `),0)}return r==="login"?await D1(t.slice(1),e):r==="prompt"?await F1(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
1800
1800
  `),1)}async function D1(t,e){let r=P1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1801
- ${Pd}`),2;let n=vs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1802
- `),1;aE({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await fa({region:n.config.region,clientId:n.config.cognitoClientId??ya,refreshToken:r.accessKey});s=c.idToken,o=c.accessToken,i=c.expiresAt}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${u}
1801
+ ${Ud}`),2;let n=vs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1802
+ `),1;aE({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await ma({region:n.config.region,clientId:n.config.cognitoClientId??Ea,refreshToken:r.accessKey});s=c.idToken,o=c.accessToken,i=c.expiresAt}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${u}
1803
1803
  `),1}let a=Ss(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
1804
- `),1;hd({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Or()??Nd();return e.stdout.write(`logged in as ${r.userId}
1804
+ `),1;gd({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Or()??Rd();return e.stdout.write(`logged in as ${r.userId}
1805
1805
  device id: ${l.device_id}
1806
1806
  mailbox prefix: ${r.userId}/${l.device_id}/
1807
1807
  access key stored at ${Ts()}
1808
1808
  `),0}function P1(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --user-id";e=o;continue}if(s==="--access-key"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --access-key";r=o;continue}return`unknown argument: ${s}`}return e===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:e,accessKey:r}}async function F1(t,e){let r=U1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1809
- ${Pd}`),2;let n=vs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1809
+ ${Ud}`),2;let n=vs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1810
1810
  `),1;let s=B1();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await W1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=A1({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Or()?.device_id,u=Ss(o)??void 0,d=new Rr({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new C1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:O1,GetObjectCommand:R1,PutObjectCommand:L1},selfRole:"browser",onMessage:async()=>{}}),f=Yy({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:Ky,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
1811
- `),0}function U1(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function W1(t){let r=await new j1({region:t.region}).send(new N1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function B1(t=process.env.LMCTL_TOKEN_PATH??$1(x1(),".lmctl","cli-tokens.json")){try{return JSON.parse(I1(t,"utf8"))}catch{return null}}var Pd,Cb=b(()=>{"use strict";Ad();vd();Yi();dd();fd();_d();md();Pd=`usage: lmctl device <id|init>
1811
+ `),0}function U1(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function W1(t){let r=await new j1({region:t.region}).send(new N1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function B1(t=process.env.LMCTL_TOKEN_PATH??$1(x1(),".lmctl","cli-tokens.json")){try{return JSON.parse(I1(t,"utf8"))}catch{return null}}var Ud,Cb=b(()=>{"use strict";Od();xd();zi();md();pd();wd();hd();Ud=`usage: lmctl device <id|init>
1812
1812
  lmctl device login --user-id <sub> --access-key <refreshToken>
1813
1813
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
1814
1814
 
@@ -1818,58 +1818,58 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
1818
1818
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
1819
1819
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
1820
1820
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
1821
- `});var Db={};le(Db,{runTeam:()=>J1});import{join as q1}from"node:path";async function J1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(H1),0;try{return await X(e,async s=>{switch(r){case"create":return G1(n,e,s);case"list":return V1(n,e,s);case"show":return K1(n,e,s);case"add-member":return Y1(n,e,s);case"seed":return Mb(n,e,s,!1);case"refresh":return Mb(n,e,s,!0);case"companion":return Z1(n,e,s);case"list-roots":return X1(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return fe(e,s)}}function X1(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);if(n.positionals.length>0)return w(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?W(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
1821
+ `});var Db={};ce(Db,{runTeam:()=>J1});import{join as q1}from"node:path";async function J1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(H1),0;try{return await X(e,async s=>{switch(r){case"create":return G1(n,e,s);case"list":return V1(n,e,s);case"show":return K1(n,e,s);case"add-member":return Y1(n,e,s);case"seed":return Mb(n,e,s,!1);case"refresh":return Mb(n,e,s,!0);case"companion":return Z1(n,e,s);case"list-roots":return X1(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return me(e,s)}}function X1(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);if(n.positionals.length>0)return w(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return C(n,"--json")?B(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
1822
1822
  `)+(s.length>0?`
1823
1823
  `:"")),0}function G1(t,e,r){let[n]=t;if(n===void 0)return w(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
1824
- `),0}function V1(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
1824
+ `),0}function V1(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return C(n,"--json")?B(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
1825
1825
  `)}${s.length>0?`
1826
- `:""}`),0}function K1(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(M(n,"--json"))W(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
1826
+ `:""}`),0}function K1(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(C(n,"--json"))B(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
1827
1827
  `);for(let a of i)e.stdout.write(`- ${a.alias} ${ve(a)} ${a.sessionid??"(unseeded)"}
1828
- `)}return 0}function Y1(t,e,r){let n=P(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=N(n,"--alias"),a=N(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:N(n,"--model")??null,role:N(n,"--role")??"agent",sessiondir:N(n,"--sessiondir")??q1(mr(),"sessions",o.name,i)});return M(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1829
- `),0}async function Mb(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=N(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=z1(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return w(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=Yg(f.workflow_name,m.definition);if(p.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))Jo(f,r),Go(f);let u=[],d=!1;for(let f of l){let m=await Gr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1828
+ `)}return 0}function Y1(t,e,r){let n=D(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=j(n,"--alias"),a=j(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:j(n,"--model")??null,role:j(n,"--role")??"agent",sessiondir:j(n,"--sessiondir")??q1(mr(),"sessions",o.name,i)});return C(n,"--json")?B(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1829
+ `),0}async function Mb(t,e,r,n){let s=D(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=j(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=z1(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return w(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=Yg(f.workflow_name,m.definition);if(p.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))Xo(f,r),Vo(f);let u=[],d=!1;for(let f of l){let m=await Gr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1830
1830
 
1831
1831
  ${zr}`:zr;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=Zr(ve(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
1832
1832
  ${_}
1833
- `);try{await li({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
1834
- `)}}}return M(s,"--json")?W(e,u):e.stdout.write(`seeded ${u.length} member(s)
1835
- `),d?1:0}function z1(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function Z1(t,e,r){let n=P(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=N(n,"--interpreter"),a=N(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
1836
- `),0}var H1,Pb=b(()=>{"use strict";Ve();xo();zn();gc();Pe();Qr();Cc();Ui();$e();wc();H1=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1833
+ `);try{await ci({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
1834
+ `)}}}return C(s,"--json")?B(e,u):e.stdout.write(`seeded ${u.length} member(s)
1835
+ `),d?1:0}function z1(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function Z1(t,e,r){let n=D(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=j(n,"--interpreter"),a=j(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
1836
+ `),0}var H1,Pb=b(()=>{"use strict";Ve();$o();zn();yc();Pe();Qr();Dc();Wi();$e();Ec();H1=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1837
1837
 
1838
1838
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
1839
1839
  refresh to create/update native provider sessions for team members.
1840
1840
 
1841
1841
  Root team registry:
1842
1842
  list-roots [--json] List .lmctl root teams registered by lmctl seed.
1843
- `});var Jb={};le(Jb,{applyMaxBytes:()=>ja,renderMessage:()=>qb,runTail:()=>sF});async function sF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${nF}
1844
- `),0;let r=P(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=N(r,"--lines"),s=n===void 0?eF:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=N(r,"--max-bytes"),i=o===void 0?tF:Number.parseInt(o,10);if(!Number.isFinite(i)||i<0||o!==void 0&&String(i)!==o)return w(e,`invalid --max-bytes "${o}" (expected a non-negative integer)`);let a=M(r,"--watch"),l=N(r,"--watch-interval"),c=l===void 0?rF:Number.parseInt(l.replace(/s$/,""),10);if(!Number.isFinite(c)||c<1)return w(e,`invalid --watch-interval "${l}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let u=N(r,"--run");if(u!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(N(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(N(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let p=Number.parseInt(u,10);if(!Number.isFinite(p)||p<=0||String(p)!==u)return w(e,`invalid --run "${u}" (expected a positive integer run id)`);try{return await X(e,async h=>oF(e,h,p,s,i,a,c))}catch(h){return fe(e,h)}}let d=cr(Q1,{target:r.positionals[0],alias:r.positionals[1],flags:{session:N(r,"--session"),provider:N(r,"--provider")}});if(d.mode==="error")return w(e,d.message);if(d.mode==="managed")return w(e,"tail managed mode requires --run <id>");let f;if(d.mode==="ai-team")if(d.alias===void 0){let p;try{p=Re(d.teamfile)}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=bt(p);if(h===void 0)return w(e,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=Ut(d.teamfile,h.alias);f={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ge?w(e,g.message):fe(e,g)}}else try{let p=Ut(d.teamfile,d.alias);f={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ge?w(e,p.message):fe(e,p)}else{let p=d.sessionid,h=d.provider;if(h===void 0){let g=await Ko(p);if(g.length===0)return w(e,`tail: session "${p}" not found in any provider store`);if(g.length>1)return w(e,`tail: session "${p}" matches multiple providers (${g.join(", ")}); pass --provider`);h=g[0]}f={provider:h,sessionId:p}}let m=await Fb(e,f.provider,f.sessionId,s,i,-1);return m<0?1:a?await new Promise(p=>{let h=async()=>{try{let T=await Fb(e,f.provider,f.sessionId,s,i,m);T>=0&&(m=T)}catch(T){e.stderr.write(`tail: ${T instanceof Error?T.message:String(T)}
1843
+ `});var Jb={};ce(Jb,{applyMaxBytes:()=>Na,renderMessage:()=>qb,runTail:()=>sF});async function sF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${nF}
1844
+ `),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--lines"),s=n===void 0?eF:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=j(r,"--max-bytes"),i=o===void 0?tF:Number.parseInt(o,10);if(!Number.isFinite(i)||i<0||o!==void 0&&String(i)!==o)return w(e,`invalid --max-bytes "${o}" (expected a non-negative integer)`);let a=C(r,"--watch"),l=j(r,"--watch-interval"),c=l===void 0?rF:Number.parseInt(l.replace(/s$/,""),10);if(!Number.isFinite(c)||c<1)return w(e,`invalid --watch-interval "${l}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let u=j(r,"--run");if(u!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let p=Number.parseInt(u,10);if(!Number.isFinite(p)||p<=0||String(p)!==u)return w(e,`invalid --run "${u}" (expected a positive integer run id)`);try{return await X(e,async h=>oF(e,h,p,s,i,a,c))}catch(h){return me(e,h)}}let d=cr(Q1,{target:r.positionals[0],alias:r.positionals[1],flags:{session:j(r,"--session"),provider:j(r,"--provider")}});if(d.mode==="error")return w(e,d.message);if(d.mode==="managed")return w(e,"tail managed mode requires --run <id>");let f;if(d.mode==="ai-team")if(d.alias===void 0){let p;try{p=Re(d.teamfile)}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=bt(p);if(h===void 0)return w(e,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=Ut(d.teamfile,h.alias);f={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ge?w(e,g.message):me(e,g)}}else try{let p=Ut(d.teamfile,d.alias);f={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ge?w(e,p.message):me(e,p)}else{let p=d.sessionid,h=d.provider;if(h===void 0){let g=await Yo(p);if(g.length===0)return w(e,`tail: session "${p}" not found in any provider store`);if(g.length>1)return w(e,`tail: session "${p}" matches multiple providers (${g.join(", ")}); pass --provider`);h=g[0]}f={provider:h,sessionId:p}}let m=await Fb(e,f.provider,f.sessionId,s,i,-1);return m<0?1:a?await new Promise(p=>{let h=async()=>{try{let T=await Fb(e,f.provider,f.sessionId,s,i,m);T>=0&&(m=T)}catch(T){e.stderr.write(`tail: ${T instanceof Error?T.message:String(T)}
1845
1845
  `)}},g=setInterval(()=>{h()},c*1e3),_=()=>{clearInterval(g),p(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}async function Fb(t,e,r,n,s,o){let i;try{i=await xr(r,e)}catch(u){return t.stderr.write(`tail: failed to load session: ${u instanceof Error?u.message:String(u)}
1846
1846
  `),-1}if(i===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
1847
1847
  `),-1;let a=i.messages??[],l=o<0?Math.max(0,a.length-n):o+1;if(l>=a.length)return a.length-1;let c="";for(let u=l;u<a.length;u+=1)c+=`${qb(a[u])}
1848
- `;return t.stdout.write(ja(c,s)),a.length-1}function qb(t){let e=Hb(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
1848
+ `;return t.stdout.write(Na(c,s)),a.length-1}function qb(t){let e=Hb(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
1849
1849
  `).replace(/\r/g,`
1850
1850
  `).split(`
1851
1851
  `),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
1852
1852
  ${i.map(a=>` ${a}`).join(`
1853
- `)}`}async function oF(t,e,r,n,s,o,i){if(e.getRun(r)===null)return w(t,`tail: run ${r}: not found`);let l=e.listSessionEvents(r),c=l.slice(Math.max(0,l.length-n));t.stdout.write(ja(c.map(d=>`${Bb(d)}
1853
+ `)}`}async function oF(t,e,r,n,s,o,i){if(e.getRun(r)===null)return w(t,`tail: run ${r}: not found`);let l=e.listSessionEvents(r),c=l.slice(Math.max(0,l.length-n));t.stdout.write(Na(c.map(d=>`${Bb(d)}
1854
1854
  `).join(""),s));let u=l.length>0?l[l.length-1].id:0;return o?await new Promise(d=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,u),g="";for(let _ of h)g+=`${Bb(_)}
1855
- `,u=_.id;g.length>0&&t.stdout.write(ja(g,s))}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
1856
- `)}},i*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function ja(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(Ub,"utf8");if(n>=e)return Wb(t,e);let s=e-n,o=Wb(t,s);return`${Ub}${o}`}function Wb(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function Bb(t){let e=Hb(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function Hb(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var Q1,eF,tF,rF,nF,Ub,Xb=b(()=>{"use strict";Qr();$e();Tn();Ft();Q1={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},eF=20,tF=4096,rF=2,nF=`usage: lmctl tail [target] [alias]
1855
+ `,u=_.id;g.length>0&&t.stdout.write(Na(g,s))}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
1856
+ `)}},i*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Na(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(Ub,"utf8");if(n>=e)return Wb(t,e);let s=e-n,o=Wb(t,s);return`${Ub}${o}`}function Wb(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function Bb(t){let e=Hb(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function Hb(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var Q1,eF,tF,rF,nF,Ub,Xb=b(()=>{"use strict";Qr();$e();Tn();Ft();Q1={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},eF=20,tF=4096,rF=2,nF=`usage: lmctl tail [target] [alias]
1857
1857
  lmctl tail --session <id> [--provider <name>]
1858
1858
  lmctl tail --run <id> [--watch] [--watch-interval Ns]
1859
1859
  [--lines N] [--max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
1860
1860
 
1861
1861
  Print or watch provider session messages, or follow a managed run timeline.`;Ub=`\u2026 [truncated older output \u2014 raise with --max-bytes]
1862
- `});var Gb={};le(Gb,{runInfo:()=>cF});function lF(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function cF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${aF}
1863
- `),0;let r=P(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=N(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(N(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await X(e,async u=>dF(e,u,c,n))}catch(u){return fe(e,u)}}let o=cr(iF,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:N(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return fF(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Ut(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):fe(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await Ko(a);if(c.length===0)return w(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return uF(e,i,a,l,n)}async function uF(t,e,r,n,s){let o;try{o=await xr(r,e)}catch(a){return w(t,`health: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`health: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(W(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
1862
+ `});var Gb={};ce(Gb,{runInfo:()=>cF});function lF(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function cF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${aF}
1863
+ `),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=C(r,"--json"),s=j(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await X(e,async u=>dF(e,u,c,n))}catch(u){return me(e,u)}}let o=cr(iF,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:j(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return fF(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Ut(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):me(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await Yo(a);if(c.length===0)return w(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return uF(e,i,a,l,n)}async function uF(t,e,r,n,s){let o;try{o=await xr(r,e)}catch(a){return w(t,`health: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`health: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(B(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
1864
1864
  `),t.stdout.write(` Provider: ${o.provider}
1865
1865
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
1866
1866
  `),t.stdout.write(` CWD: ${o.cwd}
1867
- `),t.stdout.write(` Messages: ${Fd(o.messageCount)}
1867
+ `),t.stdout.write(` Messages: ${Wd(o.messageCount)}
1868
1868
  `),t.stdout.write(` Model: ${o.model??"(unknown)"}
1869
1869
  `),o.totalInputTokens===void 0||o.totalOutputTokens===void 0?t.stdout.write(" Tokens: unknown"):t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out`),i.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${i.totalCachedInputTokens})`),t.stdout.write(`
1870
1870
  `),t.stdout.write(` Created: ${i.createdAt}
1871
1871
  `),t.stdout.write(` Modified: ${i.modifiedAt}
1872
- `),0)}async function dF(t,e,r,n){let s=kr(e,r);if(s===null)return w(t,`health: run ${r}: not found`);let o=Kr(e,r),i=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(W(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:o?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:i.totalInputTokens,totalOutputTokens:i.totalOutputTokens,agent_call_count:i.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
1872
+ `),0)}async function dF(t,e,r,n){let s=kr(e,r);if(s===null)return w(t,`health: run ${r}: not found`);let o=Kr(e,r),i=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(B(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:o?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:i.totalInputTokens,totalOutputTokens:i.totalOutputTokens,agent_call_count:i.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
1873
1873
  `),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
1874
1874
  `),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
1875
1875
  `),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
@@ -1880,58 +1880,58 @@ Print or watch provider session messages, or follow a managed run timeline.`;Ub=
1880
1880
  `),t.stdout.write(` AgentCalls: ${i.agentCallCount}
1881
1881
  `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
1882
1882
  `),0)}async function fF(t,e,r){let n;try{n=Re(e)}catch(u){return w(t,`health: ${u instanceof Error?u.message:String(u)}`)}let s=[],o=0;for(let u of n.members){if(u.teamfile!==void 0||u.session===void 0||u.session.length===0)continue;let d=null;try{d=await xr(u.session,u.provider)}catch(m){t.stderr.write(`warning: failed to load session "${u.session}" for ${u.alias} (${u.provider}): ${m instanceof Error?m.message:String(m)}
1883
- `)}let f=d?.messageCount;s.push({alias:u.alias,provider:u.provider,sessionid:u.session,messageCount:f??null,model:d?.model??"(unknown)",lastContext:d?.lastInputTokens}),f===void 0?o=void 0:o!==void 0&&(o+=f)}if(r)return W(t,{team:n.name,members:s,total:{messageCount:o??null}}),0;let i=Math.max(7,...s.map(u=>u.sessionid.length)),a=Math.max(5,...s.map(u=>u.alias.length))+1,l=Math.max(8,...s.map(u=>u.provider.length))+1,c=Math.max(5,...s.map(u=>u.model.length))+1;t.stdout.write(`TEAM: ${n.name}
1883
+ `)}let f=d?.messageCount;s.push({alias:u.alias,provider:u.provider,sessionid:u.session,messageCount:f??null,model:d?.model??"(unknown)",lastContext:d?.lastInputTokens}),f===void 0?o=void 0:o!==void 0&&(o+=f)}if(r)return B(t,{team:n.name,members:s,total:{messageCount:o??null}}),0;let i=Math.max(7,...s.map(u=>u.sessionid.length)),a=Math.max(5,...s.map(u=>u.alias.length))+1,l=Math.max(8,...s.map(u=>u.provider.length))+1,c=Math.max(5,...s.map(u=>u.model.length))+1;t.stdout.write(`TEAM: ${n.name}
1884
1884
  `),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
1885
- `);for(let u of s){let d=u.lastContext!==void 0?lF(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${Fd(u.messageCount).padStart(6)} ${d.padStart(12)}
1886
- `)}return t.stdout.write(` ${"TOTAL".padEnd(i)} ${"".padEnd(a)}${"".padEnd(l)}${"".padEnd(c)}${Fd(o).padStart(6)}
1887
- `),0}function Fd(t){return t==null?"unknown":String(t)}var iF,aF,Vb=b(()=>{"use strict";Qr();$e();Tn();Ft();Rt();iF={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},aF=`usage: lmctl health [target] [alias]
1885
+ `);for(let u of s){let d=u.lastContext!==void 0?lF(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${Wd(u.messageCount).padStart(6)} ${d.padStart(12)}
1886
+ `)}return t.stdout.write(` ${"TOTAL".padEnd(i)} ${"".padEnd(a)}${"".padEnd(l)}${"".padEnd(c)}${Wd(o).padStart(6)}
1887
+ `),0}function Wd(t){return t==null?"unknown":String(t)}var iF,aF,Vb=b(()=>{"use strict";Qr();$e();Tn();Ft();Rt();iF={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},aF=`usage: lmctl health [target] [alias]
1888
1888
  lmctl health <teamfile> # team rollup
1889
1889
  lmctl health <sessionid> [--provider <name>]
1890
1890
  [--json]
1891
1891
 
1892
- Show provider session details, team rollups, or managed run state/token totals.`});var Yb={};le(Yb,{runLs:()=>_F});import{resolve as Ud}from"node:path";function hF(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function _F(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${mF}
1893
- `),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=N(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(N(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=N(r,"--limit"),h=pF;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>Kb)return w(e,`--limit ${_} exceeds maximum (${Kb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await X(e,async _=>gF(e,_,h,g))}catch(_){return fe(e,_)}}let i=wF(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=N(r,"--provider"),c=N(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await zl(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?Ud(c):Ud(process.cwd());f=f.filter(h=>{let g=Ud(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=hF(f),a==="json")return W(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1892
+ Show provider session details, team rollups, or managed run state/token totals.`});var Yb={};ce(Yb,{runLs:()=>_F});import{resolve as Bd}from"node:path";function hF(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function _F(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${mF}
1893
+ `),0;let r=D(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=j(r,"--format"),s=C(r,"--json");if(C(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(j(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(C(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=j(r,"--limit"),h=pF;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>Kb)return w(e,`--limit ${_} exceeds maximum (${Kb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await X(e,async _=>gF(e,_,h,g))}catch(_){return me(e,_)}}let i=wF(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=j(r,"--provider"),c=j(r,"--sessiondir"),u=C(r,"--recursive"),d=C(r,"--all"),f;try{f=await Ql(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?Bd(c):Bd(process.cwd());f=f.filter(h=>{let g=Bd(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=hF(f),a==="json")return B(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1894
1894
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
1895
1895
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
1896
1896
  `);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
1897
- `)}return 0}async function gF(t,e,r,n){let s=Vr(e,{limit:r});if(n==="json")return W(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
1897
+ `)}return 0}async function gF(t,e,r,n){let s=Vr(e,{limit:r});if(n==="json")return B(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
1898
1898
  `),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
1899
1899
  `);for(let o of s){let i=(o.current_state??"").padEnd(20),a=(o.terminal_state??"").padEnd(20);t.stdout.write(`${String(o.id).padEnd(8)} ${String(o.workflow_id).padEnd(8)} ${String(o.team_id).padEnd(8)} ${i} ${a} ${o.started_at}
1900
1900
  `)}return 0}function wF(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var mF,pF,Kb,zb=b(()=>{"use strict";At();$e();Rt();mF=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
1901
1901
  [--recursive] [--all] [--format table|teamfile|json] [--json]
1902
1902
  lmctl ls --runs [--limit N] [--format table|json] [--json]
1903
1903
 
1904
- List native provider sessions in scope, or list recent managed runs with --runs.`,pF=50,Kb=500});import{existsSync as Qb,readFileSync as eS}from"node:fs";import{homedir as yF}from"node:os";import{dirname as EF,resolve as tS}from"node:path";import{fileURLToPath as bF}from"node:url";function qd(t,e={}){let r=[],n=kF(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="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=$F(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${Zb(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Aa??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${Zb(i)}`)}return r}function kF(t){if(!t&&Os)return Os;let e=new Map,r,n=t??vF();if(!Qb(n))return r=`${n} not found`,t||Wd(e),t||(Os=e),t||(Aa=r),e;let s;try{s=eS(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Wd(e),t||(Os=e),t||(Aa=r),e}for(let[o,i]of Object.entries(SF)){let a=IF(s,i),l=xF(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Wd(e),t||(Os=e),t||(Aa=r),e}function vF(){let t=EF(bF(import.meta.url));return tS(t,"..","..","..","durable-memory","model_selection.md")}function Wd(t){for(let[e,r]of Object.entries(TF))t.set(e,r)}function IF(t,e){let n=new RegExp(`^## ${NF(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function xF(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function $F(t){let e=t??tS(yF(),".config","opencode","opencode.json"),r=vm();if(!Qb(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(eS(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...jF(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function jF(t){if(!Bd(t))return[];let e=Na(t.provider)??Na(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Bd(s))continue;let o=Na(s.models)??Na(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Na(t){return Bd(t)?t:null}function Bd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Zb(t){return t.length>0?t.join(", "):"(none)"}function NF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var SF,TF,Os,Aa,rS=b(()=>{"use strict";yl();SF={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},TF={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","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"]},Os=null});var Ps={};le(Ps,{DEPRECATED_CONNECT_WARNING:()=>lS,GEMINI_PROVIDER_NOTICE:()=>aS,_setLintSessiondirFsOpsForTests:()=>JF,_setSkillFileOpsForTests:()=>HF,_setTeamfileSeedForTests:()=>qF,buildRootTeamRegistrationRow:()=>fS,registerRootTeam:()=>mS,runHire:()=>zF,runLint:()=>YF,runRefresh:()=>ZF,runSeed:()=>uS,sha256Text:()=>dS,skillNameFromSource:()=>Zd,skillNameFromUrl:()=>dU});import{createHash as AF,randomUUID as RF}from"node:crypto";import{accessSync as OF,constants as nS,existsSync as LF,mkdirSync as CF,readFileSync as La,realpathSync as Xd,renameSync as MF,statSync as DF,unlinkSync as PF,writeFileSync as Ms}from"node:fs";import{basename as FF,dirname as In,isAbsolute as sS,join as Gd,resolve as ur}from"node:path";function qF(t){cS=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(At(),Ql)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function HF(t){Cs=t===null?Vd:{...Vd,...t}}function JF(t){Mr=t===null?Kd:{...Kd,...t}}function XF(t,e){let r=In(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=ur(i);if(n.has(a))continue;let l=GF(a);l!==void 0&&(n.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function GF(t){try{if(Mr.existsSync(t)){if(!Mr.statSync(t).isDirectory())return"ENOTDIR";Mr.accessSync(t,nS.W_OK);return}let e=VF(t);if(e===void 0)return;if(!Mr.statSync(e).isDirectory())return"ENOTDIR";Mr.accessSync(e,nS.W_OK);return}catch(e){return KF(e)??"permission check failed"}}function VF(t){let e=t;for(;;){try{if(Mr.existsSync(e))return e}catch{return}let r=In(e);if(r===e)return;e=r}}function KF(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function YF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(WF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1905
- `),2;let r=t[0],n;try{n=Re(r)}catch(i){return Be(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=bd(n,In(ur(r))),o=qd(n.members);o.push(...El(n.members,In(ur(r)))),o.push(...XF(n.members,ur(r))),n.deprecatedConnectLines.length>0&&o.push(lS.replace("%s",n.deprecatedConnectLines.join(", ")));for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1906
- `);for(let i of n.members)zd([i],e),i.session!==void 0&&i.session.length>0&&i.sessiondir===void 0&&o.push(`${i.alias}: has a sessionid but no sessiondir \u2014 seed will fail; remove the sessionid to re-seed, or set the correct sessiondir.`),i.session!==void 0&&i.session.length<Ls&&o.push(`${i.alias}: sessionid is shorter than ${Ls} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1904
+ List native provider sessions in scope, or list recent managed runs with --runs.`,pF=50,Kb=500});import{existsSync as Qb,readFileSync as eS}from"node:fs";import{homedir as yF}from"node:os";import{dirname as EF,resolve as tS}from"node:path";import{fileURLToPath as bF}from"node:url";function Jd(t,e={}){let r=[],n=kF(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="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=$F(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${Zb(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Ra??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${Zb(i)}`)}return r}function kF(t){if(!t&&Os)return Os;let e=new Map,r,n=t??vF();if(!Qb(n))return r=`${n} not found`,t||qd(e),t||(Os=e),t||(Ra=r),e;let s;try{s=eS(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||qd(e),t||(Os=e),t||(Ra=r),e}for(let[o,i]of Object.entries(SF)){let a=IF(s,i),l=xF(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&qd(e),t||(Os=e),t||(Ra=r),e}function vF(){let t=EF(bF(import.meta.url));return tS(t,"..","..","..","durable-memory","model_selection.md")}function qd(t){for(let[e,r]of Object.entries(TF))t.set(e,r)}function IF(t,e){let n=new RegExp(`^## ${NF(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function xF(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function $F(t){let e=t??tS(yF(),".config","opencode","opencode.json"),r=vm();if(!Qb(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(eS(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...jF(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function jF(t){if(!Hd(t))return[];let e=Aa(t.provider)??Aa(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Hd(s))continue;let o=Aa(s.models)??Aa(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Aa(t){return Hd(t)?t:null}function Hd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Zb(t){return t.length>0?t.join(", "):"(none)"}function NF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var SF,TF,Os,Ra,rS=b(()=>{"use strict";bl();SF={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},TF={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","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"]},Os=null});var Ps={};ce(Ps,{DEPRECATED_CONNECT_WARNING:()=>lS,GEMINI_PROVIDER_NOTICE:()=>aS,_setLintSessiondirFsOpsForTests:()=>JF,_setSkillFileOpsForTests:()=>HF,_setTeamfileSeedForTests:()=>qF,buildRootTeamRegistrationRow:()=>fS,registerRootTeam:()=>mS,runHire:()=>zF,runLint:()=>YF,runRefresh:()=>ZF,runSeed:()=>uS,sha256Text:()=>dS,skillNameFromSource:()=>ef,skillNameFromUrl:()=>dU});import{createHash as AF,randomUUID as RF}from"node:crypto";import{accessSync as OF,constants as nS,existsSync as LF,mkdirSync as CF,readFileSync as Ca,realpathSync as Vd,renameSync as MF,statSync as DF,unlinkSync as PF,writeFileSync as Ms}from"node:fs";import{basename as FF,dirname as In,isAbsolute as sS,join as Kd,resolve as ur}from"node:path";function qF(t){cS=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(At(),tc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function HF(t){Cs=t===null?Yd:{...Yd,...t}}function JF(t){Mr=t===null?zd:{...zd,...t}}function XF(t,e){let r=In(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=ur(i);if(n.has(a))continue;let l=GF(a);l!==void 0&&(n.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function GF(t){try{if(Mr.existsSync(t)){if(!Mr.statSync(t).isDirectory())return"ENOTDIR";Mr.accessSync(t,nS.W_OK);return}let e=VF(t);if(e===void 0)return;if(!Mr.statSync(e).isDirectory())return"ENOTDIR";Mr.accessSync(e,nS.W_OK);return}catch(e){return KF(e)??"permission check failed"}}function VF(t){let e=t;for(;;){try{if(Mr.existsSync(e))return e}catch{return}let r=In(e);if(r===e)return;e=r}}function KF(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function YF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(WF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1905
+ `),2;let r=t[0],n;try{n=Re(r)}catch(i){return Be(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=Td(n,In(ur(r))),o=Jd(n.members);o.push(...Sl(n.members,In(ur(r)))),o.push(...XF(n.members,ur(r))),n.deprecatedConnectLines.length>0&&o.push(lS.replace("%s",n.deprecatedConnectLines.join(", ")));for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1906
+ `);for(let i of n.members)Qd([i],e),i.session!==void 0&&i.session.length>0&&i.sessiondir===void 0&&o.push(`${i.alias}: has a sessionid but no sessiondir \u2014 seed will fail; remove the sessionid to re-seed, or set the correct sessiondir.`),i.session!==void 0&&i.session.length<Ls&&o.push(`${i.alias}: sessionid is shorter than ${Ls} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1907
1907
  `);return await X(e,i=>{QE(r,i,a=>e.stderr.write(`${a}
1908
1908
  `))}),s.length>0?1:(e.stdout.write(`ok
1909
1909
  `),0)}async function uS(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(BF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
1910
- `),2;let r=t[0],n=ur(r),s;try{s=Xd(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let o=In(n),i;try{i=Re(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let a=bd(i,o);if(a.length>0){zd(i.members,e);for(let E of a)e.stderr.write(`error: ${E.field}: ${E.message}
1911
- `);return 1}zd(i.members,e);for(let E of qd(i.members))e.stderr.write(`warning: ${E}
1912
- `);for(let E of El(i.members,o))e.stderr.write(`warning: ${E}
1910
+ `),2;let r=t[0],n=ur(r),s;try{s=Vd(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let o=In(n),i;try{i=Re(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let a=Td(i,o);if(a.length>0){Qd(i.members,e);for(let E of a)e.stderr.write(`error: ${E.field}: ${E.message}
1911
+ `);return 1}Qd(i.members,e);for(let E of Jd(i.members))e.stderr.write(`warning: ${E}
1912
+ `);for(let E of Sl(i.members,o))e.stderr.write(`warning: ${E}
1913
1913
  `);let l=i.members.find(E=>E.teamfile===void 0&&E.session!==void 0&&E.session.length>0&&E.sessiondir===void 0);if(l!==void 0)return e.stderr.write(`error: ${l.alias}: has a sessionid but no sessiondir \u2014 the session's location is unknown. Remove the sessionid to re-seed fresh, or set the correct sessiondir.
1914
- `),1;let c=await aU(i.skillUrls,o,e);if(c!==0)return c;let u=La(n,"utf8"),d=u.split(`
1914
+ `),1;let c=await aU(i.skillUrls,o,e);if(c!==0)return c;let u=Ca(n,"utf8"),d=u.split(`
1915
1915
  `),f=eU(d),m=0,p=i.members.filter(E=>E.teamfile!==void 0?!1:E.session===void 0||E.session.length<Ls);for(let E of p)if(!hS(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
1916
- `),1;let h=i.members.find(E=>E.alias.toLowerCase()==="lead");if(h!==void 0){Br("lmctl","lmctl_chat",{warn:x=>e.stderr.write(`${x}
1917
- `)});let E=h.sessiondir??o,v=jc(h.provider,E);v.error!==void 0?e.stderr.write(`warning: MCP bridge install failed: ${v.error}
1916
+ `),1;let h=i.members.find(E=>E.alias.toLowerCase()==="lead");if(h!==void 0){Br("lmctl","lmctl_chat",{warn:I=>e.stderr.write(`${I}
1917
+ `)});let E=h.sessiondir??o,v=Ac(h.provider,E);v.error!==void 0?e.stderr.write(`warning: MCP bridge install failed: ${v.error}
1918
1918
  `):v.changed&&e.stdout.write(v.scope==="copilot-user"?`copilot MCP bridge installed in ${v.path}
1919
1919
  `:`.mcp.json installed in ${E}
1920
1920
  `)}for(let E of i.members){if(E.teamfile!==void 0)continue;if(E.session!==void 0&&E.session.length>=Ls){e.stderr.write(`warning: ${E.alias}: existing sessionid preserved; skipping
1921
- `);continue}let v=E.sessiondir??o,x=await cS({provider:E.provider,cwd:v,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:QF(n,u,i.members)}:{}});if(x.error!==void 0||x.sessionId===void 0||x.sessionId.length<Ls)return e.stderr.write(`error: ${E.alias}: seed failed${x.error!==void 0?`: ${x.error}`:"; provider did not report a sessionid"}
1921
+ `);continue}let v=E.sessiondir??o,I=await cS({provider:E.provider,cwd:v,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:QF(n,u,i.members)}:{}});if(I.error!==void 0||I.sessionId===void 0||I.sessionId.length<Ls)return e.stderr.write(`error: ${E.alias}: seed failed${I.error!==void 0?`: ${I.error}`:"; provider did not report a sessionid"}
1922
1922
  `),1;let k=f.get(E.alias.toLowerCase());if(k===void 0)return e.stderr.write(`error: ${E.alias}: could not find matching _MEMBER_ line to update
1923
- `),1;let R=oS(d[k],"sessionid",x.sessionId);E.sessiondir===void 0&&(R=oS(R,"sessiondir",o)),d[k]=R,m+=1,Ms(n,d.join(`
1924
- `),"utf8"),e.stdout.write(`${E.alias}: seeded ${x.sessionId}
1923
+ `),1;let P=oS(d[k],"sessionid",I.sessionId);E.sessiondir===void 0&&(P=oS(P,"sessiondir",o)),d[k]=P,m+=1,Ms(n,d.join(`
1924
+ `),"utf8"),e.stdout.write(`${E.alias}: seeded ${I.sessionId}
1925
1925
  `)}let g=d.join(`
1926
- `),_=iU(g,Xd(n));_!==g&&Ms(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
1927
- `);let T=new Date().toISOString();return await X(e,E=>{mS(E,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function zF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Oa),0;let r=P(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Jd(e,r.error,Oa);if(r.positionals.length!==2)return Jd(e,"expected <teamfile.lmctl> and <alias>",Oa);let[n,s]=r.positionals;if(!nU(s))return Be(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Be(e,"hire only applies to non-Lead members");let o=N(r,"--provider");if(o===void 0)return Jd(e,"missing value for --provider",Oa);if(!hS(o))return Be(e,`invalid provider "${o}"`);let i=ur(n),a;try{a=La(i,"utf8")}catch(d){return Be(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(rU(a,s))return Be(e,`${s}: alias already exists in ${i}`);let l=N(r,"--sessiondir"),c=[`_MEMBER_ alias=${Yd(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Yd(l)}`]].join(" "),u=oU(a,c);return Ms(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
1926
+ `),_=iU(g,Vd(n));_!==g&&Ms(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
1927
+ `);let T=new Date().toISOString();return await X(e,E=>{mS(E,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function zF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(La),0;let r=D(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Gd(e,r.error,La);if(r.positionals.length!==2)return Gd(e,"expected <teamfile.lmctl> and <alias>",La);let[n,s]=r.positionals;if(!nU(s))return Be(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Be(e,"hire only applies to non-Lead members");let o=j(r,"--provider");if(o===void 0)return Gd(e,"missing value for --provider",La);if(!hS(o))return Be(e,`invalid provider "${o}"`);let i=ur(n),a;try{a=Ca(i,"utf8")}catch(d){return Be(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(rU(a,s))return Be(e,`${s}: alias already exists in ${i}`);let l=j(r,"--sessiondir"),c=[`_MEMBER_ alias=${Zd(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Zd(l)}`]].join(" "),u=oU(a,c);return Ms(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
1928
1928
  `),e.stdout.write(`Run: lmctl seed ${i}
1929
- `),0}async function ZF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Hd),0;let r,n;if(t.length===1){let d=$s(t[0]);if(d===null)return e.stderr.write(Hd),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Hd),2;let s=ur(r),o;try{o=La(s,"utf8")}catch(d){return Be(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
1930
- `),a=tU(i,n);if(a===void 0)return Be(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(Ds(l,"teamfile")!==void 0)return Be(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[pl],u=Ds(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Be(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=sU(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),Ms(s,i.join(`
1929
+ `),0}async function ZF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Xd),0;let r,n;if(t.length===1){let d=$s(t[0]);if(d===null)return e.stderr.write(Xd),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Xd),2;let s=ur(r),o;try{o=Ca(s,"utf8")}catch(d){return Be(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
1930
+ `),a=tU(i,n);if(a===void 0)return Be(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(Ds(l,"teamfile")!==void 0)return Be(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[hl],u=Ds(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Be(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=sU(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),Ms(s,i.join(`
1931
1931
  `),"utf8"),uS([s],e))}function dS(t){return AF("sha256").update(t).digest("hex")}function fS(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:dS(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function mS(t,e){let r=fS(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function QF(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
1932
1932
  `):"- (no non-Lead members)";return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Use only the lmctl_chat MCP tool for member pings and delegation.","","Team members:",s,"","Example MCP calls:",...r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>`lmctl_chat(team="${t}", alias="${o.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${t}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${t}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These are shell commands. Delegation still uses the lmctl_chat MCP tool.)","","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
1933
1933
  `)}function eU(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=Ds(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function tU(t,e){let r=e.toLowerCase();for(let n=0;n<t.length;n+=1){let s=t[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&Ds(s,"alias")?.toLowerCase()===r)return n}}function rU(t,e){for(let r of t.split(`
1934
- `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Ds(r,"alias")===e)return!0;return!1}function nU(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function Ds(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function oS(t,e,r){let n=`${e}=${Yd(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function sU(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Yd(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function oU(t,e){let r=t.split(`
1934
+ `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Ds(r,"alias")===e)return!0;return!1}function nU(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function Ds(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function oS(t,e,r){let n=`${e}=${Zd(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function sU(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Zd(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function oU(t,e){let r=t.split(`
1935
1935
  `),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*(?:_MEMBER_|_CONNECT_|_SKILL_)(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,e),r.join(`
1936
1936
  `);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
1937
1937
  `),i=r.slice(s).join(`
@@ -1944,27 +1944,27 @@ ${i}`:`
1944
1944
  ${o}`:`${r}
1945
1945
  `:t.length>0?`${r}
1946
1946
  ${t}`:`${r}
1947
- `}async function aU(t,e,r){if(t.length===0)return 0;let n=Gd(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await pS(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return Be(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
1947
+ `}async function aU(t,e,r){if(t.length===0)return 0;let n=Kd(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await pS(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return Be(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
1948
1948
  `);for(let i of o){let a=`<!-- lmctl _SKILL_ source: ${i.source} -->
1949
1949
  ${i.body}${i.body.endsWith(`
1950
1950
  `)?"":`
1951
1951
  `}`;try{Cs.mkdirSync(n,{recursive:!0}),uU(n,i.name,a)}catch(l){return Be(r,`skill ${i.source}: ${l instanceof Error?l.message:String(l)}`)}r.stdout.write(`skill ${i.name}: wrote durable-memory/skills/${i.name}.md
1952
- `)}return 0}async function pS(t,e,r,n,s){if(s>Ra)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${Ra}`);let o=await lU(t,e),i=cU(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:Zd(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=Ra)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${Ra}`);for(let a of i)await pS(a,o.base,r,n,s+1)}async function lU(t,e){if(e.kind==="https"){if(qt(t)||!sS(t)){let o=iS(t,e),i;try{i=await gr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:vn(o),source:vn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(qt(t)){let o=iS(t,e),i;try{i=await gr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:vn(o),source:vn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=sS(t)?t:ur(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Xd(r),s=La(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:In(n)},text:s}}function iS(t,e){if(qt(t)){if(!pt(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return vn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!pt(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return vn(r)}function cU(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(qt(l)&&!pt(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function vn(t){return new URL(t).href}function uU(t,e,r){let n=Gd(t,`${e}.md`),s=Gd(t,`${e}.${process.pid}.${RF().slice(0,8)}.tmp`);try{Cs.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Cs.renameSync(s,n)}catch(o){try{Cs.unlinkSync(s)}catch{}throw o}}function dU(t){return Zd(t)}function Zd(t){let e=pt(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(FF(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,UF).replace(/-+$/gu,"")||"skill"}function hS(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Be(t,e){return t.stderr.write(`error: ${e}
1953
- `),1}function Jd(t,e,r){return t.stderr.write(`error: ${e}
1954
- ${r}`),2}function zd(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
1952
+ `)}return 0}async function pS(t,e,r,n,s){if(s>Oa)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${Oa}`);let o=await lU(t,e),i=cU(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:ef(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=Oa)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${Oa}`);for(let a of i)await pS(a,o.base,r,n,s+1)}async function lU(t,e){if(e.kind==="https"){if(qt(t)||!sS(t)){let o=iS(t,e),i;try{i=await gr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:vn(o),source:vn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(qt(t)){let o=iS(t,e),i;try{i=await gr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:vn(o),source:vn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=sS(t)?t:ur(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Vd(r),s=Ca(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:In(n)},text:s}}function iS(t,e){if(qt(t)){if(!pt(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return vn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!pt(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return vn(r)}function cU(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(qt(l)&&!pt(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function vn(t){return new URL(t).href}function uU(t,e,r){let n=Kd(t,`${e}.md`),s=Kd(t,`${e}.${process.pid}.${RF().slice(0,8)}.tmp`);try{Cs.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Cs.renameSync(s,n)}catch(o){try{Cs.unlinkSync(s)}catch{}throw o}}function dU(t){return ef(t)}function ef(t){let e=pt(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(FF(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,UF).replace(/-+$/gu,"")||"skill"}function hS(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Be(t,e){return t.stderr.write(`error: ${e}
1953
+ `),1}function Gd(t,e,r){return t.stderr.write(`error: ${e}
1954
+ ${r}`),2}function Qd(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
1955
1955
  `),r.provider==="gemini"&&e.stderr.write(`${aS.replace("%s",r.alias)}
1956
- `)}var Ls,UF,Ra,WF,BF,Oa,Hd,aS,lS,Vd,Kd,cS,Cs,Mr,Fs=b(()=>{"use strict";Ft();rS();co();Jt();io();$e();Ta();Ks();rs();Tn();Ls=5,UF=80,Ra=16,WF=`usage: lmctl lint <teamfile.lmctl>
1956
+ `)}var Ls,UF,Oa,WF,BF,La,Xd,aS,lS,Yd,zd,cS,Cs,Mr,Fs=b(()=>{"use strict";Ft();rS();uo();Jt();io();$e();ka();Ks();rs();Tn();Ls=5,UF=80,Oa=16,WF=`usage: lmctl lint <teamfile.lmctl>
1957
1957
 
1958
1958
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
1959
1959
  `,BF=`usage: lmctl seed <teamfile.lmctl>
1960
1960
 
1961
1961
  Seed missing or placeholder session ids in an lmctl teamfile by calling each
1962
1962
  member's configured native provider.
1963
- `,Oa=`usage: lmctl hire <teamfile.lmctl> <alias> --provider <name> [--sessiondir <dir>]
1963
+ `,La=`usage: lmctl hire <teamfile.lmctl> <alias> --provider <name> [--sessiondir <dir>]
1964
1964
 
1965
1965
  Append an unseeded non-Lead _MEMBER_ line to an lmctl teamfile. Run lmctl seed
1966
1966
  after editing to create the provider session.
1967
- `,Hd=`usage: lmctl refresh <teamfile.lmctl> <alias>
1967
+ `,Xd=`usage: lmctl refresh <teamfile.lmctl> <alias>
1968
1968
  lmctl refresh <teamfile.lmctl>:<alias>
1969
1969
 
1970
1970
  Replace a member's provider session (including the Lead) by clearing its
@@ -1973,14 +1973,14 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
1973
1973
  re-seed.
1974
1974
  A member cannot refresh its own running session; run the refresh from a
1975
1975
  meta-Lead or operator shell outside that sessiondir.
1976
- `,aS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',lS="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",Vd={mkdirSync:CF,writeFileSync:Ms,renameSync:MF,unlinkSync:PF},Kd={existsSync:LF,statSync:DF,accessSync:OF},cS=async t=>{let{seed:e}=await Promise.resolve().then(()=>(At(),Ql)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Cs=Vd,Mr=Kd});var ES={};le(ES,{runClone:()=>yU});import{existsSync as Qd,mkdirSync as fU,readFileSync as mU,readdirSync as pU,statSync as wS,writeFileSync as hU}from"node:fs";import{basename as _S,dirname as _U,extname as gU,join as yS,resolve as gS}from"node:path";async function yU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(wU),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
1977
- `),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=gS(r);if(!Qd(c))throw new Error(`source not found: ${r}`);let d=wS(c).isDirectory()?EU(c):c;s=mU(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
1978
- `),1}let i=gS(n),a=bU(i,o,n);if(Qd(a))return e.stderr.write(`error: ${a} already exists.
1976
+ `,aS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',lS="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",Yd={mkdirSync:CF,writeFileSync:Ms,renameSync:MF,unlinkSync:PF},zd={existsSync:LF,statSync:DF,accessSync:OF},cS=async t=>{let{seed:e}=await Promise.resolve().then(()=>(At(),tc)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Cs=Yd,Mr=zd});var ES={};ce(ES,{runClone:()=>yU});import{existsSync as tf,mkdirSync as fU,readFileSync as mU,readdirSync as pU,statSync as wS,writeFileSync as hU}from"node:fs";import{basename as _S,dirname as _U,extname as gU,join as yS,resolve as gS}from"node:path";async function yU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(wU),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
1977
+ `),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=gS(r);if(!tf(c))throw new Error(`source not found: ${r}`);let d=wS(c).isDirectory()?EU(c):c;s=mU(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
1978
+ `),1}let i=gS(n),a=bU(i,o,n);if(tf(a))return e.stderr.write(`error: ${a} already exists.
1979
1979
  `),1;let l=TU(SU(s));return fU(_U(a),{recursive:!0}),hU(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
1980
1980
  `),e.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
1981
1981
  `),e.stdout.write(`After editing, run: lmctl lint ${a}
1982
1982
  `),e.stdout.write(`Then run: lmctl seed ${a}
1983
- `),0}function EU(t){let e=pU(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return yS(t,e[0])}function bU(t,e,r){if(r.endsWith("/")||Qd(t)&&wS(t).isDirectory()){let n=_S(e).endsWith(".lmctl")?_S(e):"team.lmctl";return yS(t,n)}return gU(t)?t:`${t}.lmctl`}function SU(t){return t.split(`
1983
+ `),0}function EU(t){let e=pU(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return yS(t,e[0])}function bU(t,e,r){if(r.endsWith("/")||tf(t)&&wS(t).isDirectory()){let n=_S(e).endsWith(".lmctl")?_S(e):"team.lmctl";return yS(t,n)}return gU(t)?t:`${t}.lmctl`}function SU(t){return t.split(`
1984
1984
  `).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
1985
1985
  `)}function TU(t){return t.split(`
1986
1986
  `).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
@@ -1990,10 +1990,10 @@ Copy a teamfile and strip its session ids, producing a static editable template.
1990
1990
 
1991
1991
  Examples:
1992
1992
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
1993
- `});var kS={};le(kS,{runPlan:()=>NU});import{existsSync as kU,mkdirSync as vU,writeFileSync as IU}from"node:fs";import{basename as SS,extname as TS,join as xU,resolve as $U}from"node:path";async function NU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(jU),0;let r=P(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
1993
+ `});var kS={};ce(kS,{runPlan:()=>NU});import{existsSync as kU,mkdirSync as vU,writeFileSync as IU}from"node:fs";import{basename as SS,extname as TS,join as xU,resolve as $U}from"node:path";async function NU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(jU),0;let r=D(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
1994
1994
  `),e.stderr.write(`usage: lmctl plan [options] <directory>
1995
1995
  `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
1996
- `),2;let n=$U(r.positionals[0]);vU(n,{recursive:!0});let s=N(r,"--team")??SS(n),o=N(r,"--provider")??"claude",i=xU(n,AU(s));return kU(i)?(e.stderr.write(`error: ${i} already exists.
1996
+ `),2;let n=$U(r.positionals[0]);vU(n,{recursive:!0});let s=j(r,"--team")??SS(n),o=j(r,"--provider")??"claude",i=xU(n,AU(s));return kU(i)?(e.stderr.write(`error: ${i} already exists.
1997
1997
  `),1):(IU(i,OU({teamName:RU(s),workdir:n,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
1998
1998
  `),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
1999
1999
  `),e.stdout.write(`After editing, run: lmctl lint ${i}
@@ -2045,7 +2045,7 @@ Examples:
2045
2045
 
2046
2046
  # Same shape, codex for the Lead and Reviewer2
2047
2047
  lmctl plan ./backend --provider codex
2048
- `});var $S={};le($S,{SIZE_WARN_EST_TOKENS:()=>Us,estimateTokens:()=>xS,runTerminal:()=>DU});import{spawn as LU}from"node:child_process";import{statSync as CU}from"node:fs";async function DU(t,e){if(t.includes("--help")||t.includes("-h"))return BU(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=N(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):N(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await X(e,async i=>{let a=N(r,"--alias"),l=Yw(i,s,a);return"err"in l?w(e,l.err):ef(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return fe(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):N(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=cr(MU,{target:o,alias:i,flags:{}});return a.mode==="error"?w(e,a.message):a.mode!=="ai-team"?w(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?w(e,"terminal: alias required for the teamfile target"):await X(e,l=>PU(e,a.teamfile,a.alias,l))}try{return await X(e,async s=>{let o=FU(e,s,r);if(typeof o=="number")return o;let i=N(r,"--alias");return M(r,"--size")?WU(e,s,o,i,M(r,"--json")):UU(e,s,o,i)})}catch(s){return fe(e,s)}}async function PU(t,e,r,n){let s;try{s=Ut(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):fe(t,o)}ni(t,s.isLead,s.alias,s.provider,s.sessiondir);try{si(t,Re(e),e)}catch{}return ef(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir})}async function ef(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Vo(r))return w(t,`no resume incantation for provider "${r}"`);if(!ch.test(n))return w(t,"refusing to resume: malformed sessionid");let o=bc(r,n);if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=LU(i,a,{stdio:"inherit",cwd:s,env:Ke(process.env,n)});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function FU(t,e,r){let n=N(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=ci(t,e,N(r,"--project"));return typeof s=="number"?s:ui(t,e,s,void 0)}async function UU(t,e,r,n){let s=di(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?w(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):ef(t,{provider:ve(s),sessionid:o,sessiondir:s.sessiondir})}function xS(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=CU(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function WU(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return w(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=ve(a),u=null;Vo(c)&&(u=await xr(l,c));let d=xS(u),f=d.est>Us;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?Zr(c,l):null})}if(s)return W(t,{estimate:!0,legend:IS,guide_tokens:Us,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2048
+ `});var $S={};ce($S,{SIZE_WARN_EST_TOKENS:()=>Us,estimateTokens:()=>xS,runTerminal:()=>DU});import{spawn as LU}from"node:child_process";import{statSync as CU}from"node:fs";async function DU(t,e){if(t.includes("--help")||t.includes("-h"))return BU(e);let r=D(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?C(r,i):j(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await X(e,async i=>{let a=j(r,"--alias"),l=Yw(i,s,a);return"err"in l?w(e,l.err):rf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return me(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?C(r,l):j(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=cr(MU,{target:o,alias:i,flags:{}});return a.mode==="error"?w(e,a.message):a.mode!=="ai-team"?w(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?w(e,"terminal: alias required for the teamfile target"):await X(e,l=>PU(e,a.teamfile,a.alias,l))}try{return await X(e,async s=>{let o=FU(e,s,r);if(typeof o=="number")return o;let i=j(r,"--alias");return C(r,"--size")?WU(e,s,o,i,C(r,"--json")):UU(e,s,o,i)})}catch(s){return me(e,s)}}async function PU(t,e,r,n){let s;try{s=Ut(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):me(t,o)}si(t,s.isLead,s.alias,s.provider,s.sessiondir);try{oi(t,Re(e),e)}catch{}return rf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}async function rf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Ko(r))return w(t,`no resume incantation for provider "${r}"`);if(!ch.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Tc(r,n,{isLead:e.isLead});if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=LU(i,a,{stdio:"inherit",cwd:s,env:Ke(process.env,n)});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function FU(t,e,r){let n=j(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=ui(t,e,j(r,"--project"));return typeof s=="number"?s:di(t,e,s,void 0)}async function UU(t,e,r,n){let s=fi(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?w(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):rf(t,{provider:ve(s),sessionid:o,sessiondir:s.sessiondir})}function xS(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=CU(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function WU(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return w(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=ve(a),u=null;Ko(c)&&(u=await xr(l,c));let d=xS(u),f=d.est>Us;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?Zr(c,l):null})}if(s)return B(t,{estimate:!0,legend:IS,guide_tokens:Us,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2049
2049
  `),t.stdout.write(`${IS}
2050
2050
  `);for(let a of i){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
2051
2051
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2083,85 +2083,85 @@ Examples:
2083
2083
  tokens it surfaces the resume incantation so YOU can
2084
2084
  open & self-compact. Nothing is ever changed
2085
2085
  automatically; ${Us} is a guide, not a gate.
2086
- `),0}var MU,Us,IS,jS=b(()=>{"use strict";Pe();Qr();$e();Pc();Tn();Ft();Jt();rs();na();MU={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Us=2e5,IS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as tf,dirname as OS}from"node:path";function rf(t,e){let r=tf(t);for(;;){let n=qU(e,r);if(n!==null)return n;let s=OS(r);if(s===r)return null;r=s}}function qU(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Ca(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Ma(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function nf(t){if(t.io.dal!==void 0){let o=NS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new rt(AS(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(Ca()||Ma()){let o=ce(),i=pe({path:o}),a=NS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new rt(AS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Ma()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Ca()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?CS(t.cwd):HU(t.projectName),r=MS(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new rt(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function LS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Ca()||Ma()){let n=ce();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Ma()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Ca()?"explicit-db":"explicit-workspace"}}let e;try{e=CS(t.cwd)}catch{throw new rt("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=MS(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function NS(t,e,r){return r!==void 0?t.findProjectByName(r):rf(e,t)}function AS(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function HU(t){let e=[];for(let r of Ha())for(let n of DS(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new rt(`project not found in any workspace DB: ${t}`);return e}function CS(t){let e=JU(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Ha())for(let o of DS(s)){let i=tf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new rt("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function MS(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new rt(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2086
+ `),0}var MU,Us,IS,jS=b(()=>{"use strict";Pe();Qr();$e();Uc();Tn();Ft();Jt();rs();sa();MU={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Us=2e5,IS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as nf,dirname as OS}from"node:path";function sf(t,e){let r=nf(t);for(;;){let n=qU(e,r);if(n!==null)return n;let s=OS(r);if(s===r)return null;r=s}}function qU(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Ma(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Da(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function of(t){if(t.io.dal!==void 0){let o=NS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new rt(AS(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(Ma()||Da()){let o=ue(),i=pe({path:o}),a=NS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new rt(AS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Da()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Ma()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?CS(t.cwd):HU(t.projectName),r=MS(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new rt(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function LS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Ma()||Da()){let n=ue();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Da()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Ma()?"explicit-db":"explicit-workspace"}}let e;try{e=CS(t.cwd)}catch{throw new rt("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=MS(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function NS(t,e,r){return r!==void 0?t.findProjectByName(r):sf(e,t)}function AS(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function HU(t){let e=[];for(let r of Ja())for(let n of DS(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new rt(`project not found in any workspace DB: ${t}`);return e}function CS(t){let e=JU(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Ja())for(let o of DS(s)){let i=nf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new rt("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function MS(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new rt(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2087
2087
  ${RS(n)}`):new rt(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2088
2088
  ${RS(n)}`)}function RS(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2089
- `)}function JU(t){let e=[],r=tf(t);for(;;){e.push(r);let n=OS(r);if(n===r)return e;r=n}}function DS(t){let e=null;try{e=new Ys(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>ol)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var rt,sf=b(()=>{"use strict";sl();al();Pe();Ve();rt=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var df={};le(df,{assertNoCrossWorkflowSubflowCycle:()=>HS,firstUnregisteredArchetype:()=>uf,runWorkflow:()=>oW});import{createHash as lf,randomUUID as XU}from"node:crypto";import{existsSync as GU,readFileSync as Fa,readdirSync as VU,writeFileSync as KU}from"node:fs";import{basename as YU,join as zU,resolve as ZU}from"node:path";import{pathToFileURL as QU}from"node:url";function cf(t,e){return{source_uri:QU(ZU(t)).href,source_sha256:lf("sha256").update(e).digest("hex")}}function US(t){return lf("sha256").update(t).digest("hex")}async function nW(t){let e=await gr(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:US(e),remote:!0}}async function Pa(t){if(er(t)){let n=await Qn(t),s=Fa(n,"utf8");return{definition:s,source_uri:t,source_sha256:US(s),remote:!1}}let e=Ln(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(pt(t))return nW(t);let r=Fa(t,"utf8");return{definition:r,...cf(t,r),remote:!1}}function WS(t){return Ce(t.definition)}function BS(t){if(t.definition_schema_version!==3)return null;let e=uf(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function sW(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function oW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(rW),0;try{return r==="run"?await iW(n,e):await X(e,s=>{switch(r){case"load":return uW(n,e,s);case"author":return dW(n,e,s);case"list":return fW(n,e,s);case"sync":return mW(n,e,s);case"export":return pW(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof rt?w(e,s.message):fe(e,s)}}async function iW(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${Da}
2090
- `),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return dr(e,r.error);if(r.positionals.length>1)return dr(e,Da);let n=M(r,"--json"),s=N(r,"--workflow"),o=N(r,"--project"),i=N(r,"--job"),a=N(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return dr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!qt(c))return dr(e,Da);if(er(c))return PS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Ln(c,"remote workflow URLs");return m!==null?w(e,m):PS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return dr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return dr(e,Da);if(i!==void 0&&(o!==void 0||a!==void 0))return dr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=aW(i);if(m===null)return dr(e,`invalid --job: ${i}`);let p=LS({cwd:process.cwd(),io:e});try{let h=await gs({dal:p.dal,job_id:m,worker_id:of()});return af(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=qS(a,e);if(d===Ua)return 2;let f=nf({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await gs({dal:f.dal,job_id:p.id,worker_id:of()});return af(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function PS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=qS(o,r);if(l===Ua)return 2;let c,u;try{c=await Pa(t),u=WS(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=BS(u);if(d!==null)return w(r,d);if(c.remote&&!await lW(r,c,u,a))return 1;let f=nf({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await gs({dal:f.dal,job_id:p.id,worker_id:of()});return af(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function dr(t,e){return t.stderr.write(`error: ${e}
2089
+ `)}function JU(t){let e=[],r=nf(t);for(;;){e.push(r);let n=OS(r);if(n===r)return e;r=n}}function DS(t){let e=null;try{e=new Ys(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>il)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var rt,af=b(()=>{"use strict";ol();ll();Pe();Ve();rt=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var mf={};ce(mf,{assertNoCrossWorkflowSubflowCycle:()=>HS,firstUnregisteredArchetype:()=>ff,runWorkflow:()=>oW});import{createHash as uf,randomUUID as XU}from"node:crypto";import{existsSync as GU,readFileSync as Ua,readdirSync as VU,writeFileSync as KU}from"node:fs";import{basename as YU,join as zU,resolve as ZU}from"node:path";import{pathToFileURL as QU}from"node:url";function df(t,e){return{source_uri:QU(ZU(t)).href,source_sha256:uf("sha256").update(e).digest("hex")}}function US(t){return uf("sha256").update(t).digest("hex")}async function nW(t){let e=await gr(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:US(e),remote:!0}}async function Fa(t){if(er(t)){let n=await Qn(t),s=Ua(n,"utf8");return{definition:s,source_uri:t,source_sha256:US(s),remote:!1}}let e=Ln(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(pt(t))return nW(t);let r=Ua(t,"utf8");return{definition:r,...df(t,r),remote:!1}}function WS(t){return Ce(t.definition)}function BS(t){if(t.definition_schema_version!==3)return null;let e=ff(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function sW(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function oW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(rW),0;try{return r==="run"?await iW(n,e):await X(e,s=>{switch(r){case"load":return uW(n,e,s);case"author":return dW(n,e,s);case"list":return fW(n,e,s);case"sync":return mW(n,e,s);case"export":return pW(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof rt?w(e,s.message):me(e,s)}}async function iW(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${Pa}
2090
+ `),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return dr(e,r.error);if(r.positionals.length>1)return dr(e,Pa);let n=C(r,"--json"),s=j(r,"--workflow"),o=j(r,"--project"),i=j(r,"--job"),a=j(r,"--inputs"),l=C(r,"--verbose"),c=r.positionals[0],u=C(r,"--yes")||C(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return dr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!qt(c))return dr(e,Pa);if(er(c))return PS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Ln(c,"remote workflow URLs");return m!==null?w(e,m):PS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return dr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return dr(e,Pa);if(i!==void 0&&(o!==void 0||a!==void 0))return dr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=aW(i);if(m===null)return dr(e,`invalid --job: ${i}`);let p=LS({cwd:process.cwd(),io:e});try{let h=await gs({dal:p.dal,job_id:m,worker_id:lf()});return cf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=qS(a,e);if(d===Wa)return 2;let f=of({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await gs({dal:f.dal,job_id:p.id,worker_id:lf()});return cf(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function PS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=qS(o,r);if(l===Wa)return 2;let c,u;try{c=await Fa(t),u=WS(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=BS(u);if(d!==null)return w(r,d);if(c.remote&&!await lW(r,c,u,a))return 1;let f=of({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await gs({dal:f.dal,job_id:p.id,worker_id:lf()});return cf(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function dr(t,e){return t.stderr.write(`error: ${e}
2091
2091
  `),2}function qS(t,e){if(t===void 0)return{};let r;try{r=JSON.parse(t)}catch(n){return e.stderr.write(`error: invalid --inputs JSON: ${n instanceof Error?n.message:String(n)}
2092
- `),Ua}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2093
- `),Ua):r}function aW(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function of(){return`cli-${process.pid}-${XU().slice(0,8)}`}function af(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?W(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2094
- `),1}let n={ok:e.status!=="failed",job_id:e.job_id,run_id:e.run_id,status:e.status,terminal_state:e.terminal_state,workflow:r.workflowName,project:r.projectName,workspace:r.workspaceName,ms:e.ms,...r.verbose?{db_path:r.dbPath}:{}};return r.json?W(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
2092
+ `),Wa}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2093
+ `),Wa):r}function aW(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function lf(){return`cli-${process.pid}-${XU().slice(0,8)}`}function cf(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?B(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2094
+ `),1}let n={ok:e.status!=="failed",job_id:e.job_id,run_id:e.run_id,status:e.status,terminal_state:e.terminal_state,workflow:r.workflowName,project:r.projectName,workspace:r.workspaceName,ms:e.ms,...r.verbose?{db_path:r.dbPath}:{}};return r.json?B(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
2095
2095
  `):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
2096
2096
  `):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
2097
2097
  `),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
2098
2098
  `)),e.status==="failed"?1:0}async function lW(t,e,r,n){let s=sW(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
2099
2099
  `)+`
2100
2100
  `),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await cW(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
2101
- `),a}function cW(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function uW(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(er(s))try{o=await Pa(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(pt(s))try{o=await Pa(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=Ln(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await Pa(s)}let i;try{i=WS(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?BS(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2101
+ `),a}function cW(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function uW(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(er(s))try{o=await Fa(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(pt(s))try{o=await Fa(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=Ln(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await Fa(s)}let i;try{i=WS(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?BS(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2102
2102
  `),o.remote&&e.stdout.write(`source: ${o.source_uri}
2103
2103
  sha256: ${o.source_sha256}
2104
- `),0}function uf(t){let e=Di();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function FS(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function HS(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function dW(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return w(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return w(e,"usage: lmctl workflow author <file.dsl> [name]");let i=Fa(s,"utf8"),a;try{a=Ce(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return fe(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=uf(l);if(c!==null)return w(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{HS(u,FS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return FS(JSON.parse(p.definition))}catch{return null}})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...cf(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:lf("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2105
- `),0}function fW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2104
+ `),0}function ff(t){let e=Pi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function FS(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function HS(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function dW(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return w(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return w(e,"usage: lmctl workflow author <file.dsl> [name]");let i=Ua(s,"utf8"),a;try{a=Ce(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return me(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=ff(l);if(c!==null)return w(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{HS(u,FS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return FS(JSON.parse(p.definition))}catch{return null}})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...df(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:uf("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2105
+ `),0}function fW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return C(n,"--json")?B(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2106
2106
  `)}${s.length>0?`
2107
- `:""}`),0}function mW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);Qo({swallow:!0});let s=ph(),o=[];try{o=GU(s)?VU(s).filter(c=>eW.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=zU(s,c),d=Fa(u,"utf8"),f;try{f=Ce(d)}catch(x){return w(e,`compile failed for ${c}: ${x instanceof Error?x.message:String(x)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:YU(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=cf(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===T.source_sha256){l+=1;continue}let v=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),v?i+=1:a+=1}return M(n,"--json")?W(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2108
- `),0}function pW(t,e,r){let n=P(t,["--out"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return w(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:tW,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
2109
- `,c=N(n,"--out");return c!==void 0?(KU(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2110
- `)):e.stdout.write(l),0}var eW,tW,rW,Da,Ua,ff=b(()=>{"use strict";Tu();cn();ti();Ic();$e();sf();Ks();ws();eW=[".compound.json",".lmctl"],tW="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",rW=`usage: lmctl workflow <load|author|list|sync|export|run>
2107
+ `:""}`),0}function mW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);ei({swallow:!0});let s=ph(),o=[];try{o=GU(s)?VU(s).filter(c=>eW.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=zU(s,c),d=Ua(u,"utf8"),f;try{f=Ce(d)}catch(I){return w(e,`compile failed for ${c}: ${I instanceof Error?I.message:String(I)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:YU(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=df(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===T.source_sha256){l+=1;continue}let v=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),v?i+=1:a+=1}return C(n,"--json")?B(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2108
+ `),0}function pW(t,e,r){let n=D(t,["--out"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return w(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:tW,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
2109
+ `,c=j(n,"--out");return c!==void 0?(KU(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2110
+ `)):e.stdout.write(l),0}var eW,tW,rW,Pa,Wa,pf=b(()=>{"use strict";vu();cn();ri();$c();$e();af();Ks();ws();eW=[".compound.json",".lmctl"],tW="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",rW=`usage: lmctl workflow <load|author|list|sync|export|run>
2111
2111
 
2112
2112
  Load, author, list, synchronize, inspect, or run workflow definitions. The
2113
2113
  load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
2114
2114
  URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
2115
2115
  remote https:// workflow after a trust prompt.
2116
- `,Da="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";Ua=Symbol("inputs-error")});function mf(t,e){let r=hW[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var hW,JS=b(()=>{"use strict";hW={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"},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 ZS={};le(ZS,{initWorkspace:()=>YS,runWorkspace:()=>SW,setWorkspaceProvider:()=>zS});import{copyFileSync as _W,cpSync as gW,existsSync as De,mkdirSync as fr,readdirSync as hf,renameSync as wW,rmSync as Wa,statSync as Ba,writeFileSync as yW}from"node:fs";import{spawnSync as EW}from"node:child_process";import{homedir as XS}from"node:os";import{dirname as _f,join as Ws}from"node:path";async function SW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(bW),0;switch(r){case"list":return TW(n,e);case"create":return kW(n,e);case"use":return vW(n,e);case"show":return IW(n,e);case"delete":return xW(n,e);case"migrate":return $W(n,e);case"init":return YS(n,e);case"set-provider":return zS(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function VS(){let t=qs(),e=[],r=new Set,n=hr.default,s=De(jn()),o=De(kt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Wt(n):jn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),De(pr())){let i;try{i=hf(pr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!qe(a))continue;let l=!1;try{l=Ba(kt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Wt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function TW(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==0)return w(e,"usage: lmctl workspace list");let n=VS();if(M(r,"--json"))return W(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2117
- `)}return 0}function kW(t,e){let r=P(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!qe(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=kt(n);if(De(s))return w(e,`workspace already exists: ${n} (${s})`);let o=N(r,"--docroot")??Ja(n);fr(s,{recursive:!0}),fr(o,{recursive:!0});let i=Wt(n);fr(_f(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2118
- `),0}function vW(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!qe(n))return w(e,`invalid workspace name: ${n}`);if(n!==hr.default&&!De(kt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Bs();return fr(_f(s),{recursive:!0}),yW(s,`${n}
2119
- `),M(r,"--json")?W(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2120
- `),0}function IW(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace show <name>");if(!qe(n))return w(e,`invalid workspace name: ${n}`);let s=VS().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=De(s.db_path)?Ba(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(De(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return M(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2121
- `),0}function xW(t,e){let r=P(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!qe(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===hr.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(qs()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=kt(n);return De(o)?(Wa(o,{recursive:!0,force:!0}),M(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2122
- `),0):w(e,`workspace not found: ${n}`)}function pf(t,e,r){try{wW(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
2123
- `),Ba(t).isDirectory()?gW(t,e,{recursive:!0}):_W(t,e),!De(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);Wa(t,{recursive:!0,force:!0})}function $W(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=Xa(),o=pr(),i=[],a=(f,m)=>{if(n)W(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2116
+ `,Pa="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";Wa=Symbol("inputs-error")});function hf(t,e){let r=hW[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var hW,JS=b(()=>{"use strict";hW={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"},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 ZS={};ce(ZS,{initWorkspace:()=>YS,runWorkspace:()=>SW,setWorkspaceProvider:()=>zS});import{copyFileSync as _W,cpSync as gW,existsSync as De,mkdirSync as fr,readdirSync as gf,renameSync as wW,rmSync as Ba,statSync as qa,writeFileSync as yW}from"node:fs";import{spawnSync as EW}from"node:child_process";import{homedir as XS}from"node:os";import{dirname as wf,join as Ws}from"node:path";async function SW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(bW),0;switch(r){case"list":return TW(n,e);case"create":return kW(n,e);case"use":return vW(n,e);case"show":return IW(n,e);case"delete":return xW(n,e);case"migrate":return $W(n,e);case"init":return YS(n,e);case"set-provider":return zS(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function VS(){let t=qs(),e=[],r=new Set,n=hr.default,s=De(jn()),o=De(kt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Wt(n):jn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),De(pr())){let i;try{i=gf(pr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!qe(a))continue;let l=!1;try{l=qa(kt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Wt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function TW(t,e){let r=D(t,[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==0)return w(e,"usage: lmctl workspace list");let n=VS();if(C(r,"--json"))return B(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2117
+ `)}return 0}function kW(t,e){let r=D(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!qe(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=kt(n);if(De(s))return w(e,`workspace already exists: ${n} (${s})`);let o=j(r,"--docroot")??Xa(n);fr(s,{recursive:!0}),fr(o,{recursive:!0});let i=Wt(n);fr(wf(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return C(r,"--json")?B(e,l):e.stdout.write(`created workspace ${n} at ${s}
2118
+ `),0}function vW(t,e){let r=D(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!qe(n))return w(e,`invalid workspace name: ${n}`);if(n!==hr.default&&!De(kt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Bs();return fr(wf(s),{recursive:!0}),yW(s,`${n}
2119
+ `),C(r,"--json")?B(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2120
+ `),0}function IW(t,e){let r=D(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace show <name>");if(!qe(n))return w(e,`invalid workspace name: ${n}`);let s=VS().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=De(s.db_path)?qa(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(De(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return C(r,"--json")?B(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2121
+ `),0}function xW(t,e){let r=D(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!qe(n))return w(e,`invalid workspace name: ${n}`);if(!C(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===hr.default&&!C(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(qs()===n&&!C(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=kt(n);return De(o)?(Ba(o,{recursive:!0,force:!0}),C(r,"--json")?B(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2122
+ `),0):w(e,`workspace not found: ${n}`)}function _f(t,e,r){try{wW(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
2123
+ `),qa(t).isDirectory()?gW(t,e,{recursive:!0}):_W(t,e),!De(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);Ba(t,{recursive:!0,force:!0})}function $W(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=C(r,"--json"),s=Ga(),o=pr(),i=[],a=(f,m)=>{if(n)B(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2124
2124
  `);e.stdout.write(f?`migration complete
2125
2125
  `:`${m??"nothing to migrate"}
2126
- `)}return 0};if(!De(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=hf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ba(Ws(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Wa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!De(o))pf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>De(Ws(o,m)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);fr(o,{recursive:!0});for(let m of c)pf(Ws(s,m),Ws(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{hf(s).length===0&&(Wa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Nf(),d=Bs();return De(u)&&(De(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(pf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function KS(t,e){return EW(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function AW(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function GS(t){return t==="~"?XS():t.startsWith("~/")?Ws(XS(),t.slice(2)):t}async function YS(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${xn.join(", ")}.`].join(`
2126
+ `)}return 0};if(!De(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=gf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return qa(Ws(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Ba(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!De(o))_f(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>De(Ws(o,m)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);fr(o,{recursive:!0});for(let m of c)_f(Ws(s,m),Ws(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{gf(s).length===0&&(Ba(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Rf(),d=Bs();return De(u)&&(De(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(_f(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function KS(t,e){return EW(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function AW(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function GS(t){return t==="~"?XS():t.startsWith("~/")?Ws(XS(),t.slice(2)):t}async function YS(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${xn.join(", ")}.`].join(`
2127
2127
  `)+`
2128
- `),0;let s=P(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return w(e,s.error);if(s.positionals.length!==0)return w(e,n);let o=r.spawn??KS,a=xn.map(k=>mf(k,o)).filter(k=>k.status==="ok"||k.status==="unverified").map(k=>k.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${xn.join("|")} first
2128
+ `),0;let s=D(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return w(e,s.error);if(s.positionals.length!==0)return w(e,n);let o=r.spawn??KS,a=xn.map(k=>hf(k,o)).filter(k=>k.status==="ok"||k.status==="unverified").map(k=>k.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${xn.join("|")} first
2129
2129
  `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??AW,u=r.promptLine!==void 0||l,d=k=>(e.stderr.write(`error: ${k} is required in non-interactive mode (no TTY); pass it explicitly
2130
- `),2),f,m=N(s,"--name");if(m!==void 0){if(!qe(m))return e.stderr.write(`error: invalid workspace name: ${m}
2131
- `),2;f=m}else{if(!u)return d("--name");for(;;){let k=(await c("Workspace name [default]: ")).trim(),R=k.length===0?"default":k;if(qe(R)){f=R;break}e.stderr.write(`invalid workspace name: ${R} (letters/digits/.-_, start alnum, \u226464)
2130
+ `),2),f,m=j(s,"--name");if(m!==void 0){if(!qe(m))return e.stderr.write(`error: invalid workspace name: ${m}
2131
+ `),2;f=m}else{if(!u)return d("--name");for(;;){let k=(await c("Workspace name [default]: ")).trim(),P=k.length===0?"default":k;if(qe(P)){f=P;break}e.stderr.write(`invalid workspace name: ${P} (letters/digits/.-_, start alnum, \u226464)
2132
2132
  `)}}let p=kt(f);if(De(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2133
- `),2;let h,g=N(s,"--basedir"),_=Ja(f);if(g!==void 0)h=GS(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:GS(k)}let T={};for(let k of["provider1","provider2","provider3"]){let R=N(s,`--${k}`),C=jW[k],q=a.includes(C)?C:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${k} ${R} is not an available provider (available: ${a.join(", ")})
2134
- `),2;T[k]=R;continue}if(!u)return d(`--${k}`);for(;;){let te=(await c(`${k} (${NW[k]}) [${q}]: `)).trim(),j=te.length===0?q:te;if(a.includes(j)){T[k]=j;break}e.stderr.write(`not an available provider: ${j} (available: ${a.join(", ")})
2135
- `)}}fr(p,{recursive:!0}),fr(h,{recursive:!0});let E=Wt(f);fr(_f(E),{recursive:!0});let v=pe({path:E});try{v.setConfig("project.docroot",h),v.setConfig("workspace.provider1",T.provider1),v.setConfig("workspace.provider2",T.provider2),v.setConfig("workspace.provider3",T.provider3)}finally{v.close()}let x={name:f,dir:p,db_path:E,basedir:h,providers:{...T}};return M(s,"--json")?W(e,x):(e.stdout.write(`created workspace ${f} at ${p}
2133
+ `),2;let h,g=j(s,"--basedir"),_=Xa(f);if(g!==void 0)h=GS(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:GS(k)}let T={};for(let k of["provider1","provider2","provider3"]){let P=j(s,`--${k}`),q=jW[k],O=a.includes(q)?q:a[0];if(P!==void 0){if(!a.includes(P))return e.stderr.write(`error: --${k} ${P} is not an available provider (available: ${a.join(", ")})
2134
+ `),2;T[k]=P;continue}if(!u)return d(`--${k}`);for(;;){let G=(await c(`${k} (${NW[k]}) [${O}]: `)).trim(),A=G.length===0?O:G;if(a.includes(A)){T[k]=A;break}e.stderr.write(`not an available provider: ${A} (available: ${a.join(", ")})
2135
+ `)}}fr(p,{recursive:!0}),fr(h,{recursive:!0});let E=Wt(f);fr(wf(E),{recursive:!0});let v=pe({path:E});try{v.setConfig("project.docroot",h),v.setConfig("workspace.provider1",T.provider1),v.setConfig("workspace.provider2",T.provider2),v.setConfig("workspace.provider3",T.provider3)}finally{v.close()}let I={name:f,dir:p,db_path:E,basedir:h,providers:{...T}};return C(s,"--json")?B(e,I):(e.stdout.write(`created workspace ${f} at ${p}
2136
2136
  `),e.stdout.write(` basedir: ${h}
2137
2137
  `),e.stdout.write(` provider1=${T.provider1} provider2=${T.provider2} provider3=${T.provider3}
2138
2138
  `),e.stdout.write(`activate it with: lmctl workspace use ${f}
2139
2139
  `)),0}async function zS(t,e,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${xn.join(", ")}.`].join(`
2140
2140
  `)+`
2141
- `),0;let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let[o,i,...a]=s.positionals;if(o===void 0||i===void 0||a.length!==0)return w(e,n);let l=/^provider[123]$/.test(o)?o:/^[123]$/.test(o)?`provider${o}`:null;if(l===null)return e.stderr.write(`error: invalid slot: ${o} (expected provider1, provider2, or provider3)
2142
- `),2;let c=r.spawn??KS,u=xn.map(p=>mf(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${xn.join("|")} first
2141
+ `),0;let s=D(t,[]);if(s.error!==void 0)return w(e,s.error);let[o,i,...a]=s.positionals;if(o===void 0||i===void 0||a.length!==0)return w(e,n);let l=/^provider[123]$/.test(o)?o:/^[123]$/.test(o)?`provider${o}`:null;if(l===null)return e.stderr.write(`error: invalid slot: ${o} (expected provider1, provider2, or provider3)
2142
+ `),2;let c=r.spawn??KS,u=xn.map(p=>hf(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${xn.join("|")} first
2143
2143
  `),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
2144
- `),2;let d=e.dal===void 0,f=e.dal??pe({path:ce()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Nn()??hr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2144
+ `),2;let d=e.dal===void 0,f=e.dal??pe({path:ue()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Nn()??hr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2145
2145
  `),0}var bW,xn,jW,NW,QS=b(()=>{"use strict";Pe();JS();$e();Ve();bW=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2146
2146
 
2147
2147
  Manage isolated workspace state directories, active workspace selection,
2148
2148
  legacy profile migration, and configured provider slots.
2149
- `;xn=["claude","codex","gemini","qwen"],jW={provider1:"claude",provider2:"codex",provider3:"gemini"},NW={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var rT={};le(rT,{runProject:()=>CW});import{existsSync as RW,statSync as OW}from"node:fs";import{join as tT}from"node:path";async function CW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(LW),0;try{return await X(e,s=>{switch(r){case"create":return HW(n,e,s);case"list":return JW(n,e,s);case"show":return BW(n,e,s);case"status":return qW(n,e,s);case"workflow":return MW(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return fe(e,s)}}function MW(t,e,r){let[n,...s]=t;switch(n){case"add":return DW(s,e,r);case"list":return PW(s,e,r);case"show":return FW(s,e,r);case"remove":return UW(s,e,r);case"enable":return eT(s,e,r,!0);case"disable":return eT(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function DW(t,e,r){let n=P(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=N(n,"--condition")??null;if(l!==null)try{nr(l)}catch{return w(e,"invalid --condition JEXL")}let c=WW(N(n,"--params"));if(typeof c=="string")return w(e,c);let u=N(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
2150
- `),0}function PW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?W(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2149
+ `;xn=["claude","codex","gemini","qwen"],jW={provider1:"claude",provider2:"codex",provider3:"gemini"},NW={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var rT={};ce(rT,{runProject:()=>CW});import{existsSync as RW,statSync as OW}from"node:fs";import{join as tT}from"node:path";async function CW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(LW),0;try{return await X(e,s=>{switch(r){case"create":return HW(n,e,s);case"list":return JW(n,e,s);case"show":return BW(n,e,s);case"status":return qW(n,e,s);case"workflow":return MW(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function MW(t,e,r){let[n,...s]=t;switch(n){case"add":return DW(s,e,r);case"list":return PW(s,e,r);case"show":return FW(s,e,r);case"remove":return UW(s,e,r);case"enable":return eT(s,e,r,!0);case"disable":return eT(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function DW(t,e,r){let n=D(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=j(n,"--condition")??null;if(l!==null)try{nr(l)}catch{return w(e,"invalid --condition JEXL")}let c=WW(j(n,"--params"));if(typeof c=="string")return w(e,c);let u=j(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return C(n,"--json")?B(e,f):e.stdout.write(`added project workflow ${f.id}
2150
+ `),0}function PW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return C(n,"--json")?B(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2151
2151
  `)}${i.length>0?`
2152
- `:""}`),0}function FW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=gf(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(M(n,"--json")?W(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2153
- `),0)}function UW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=gf(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?w(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2154
- `),0):w(e,`project workflow not found: ${s}`)}function eT(t,e,r,n){let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let o=gf(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return w(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?w(e,`project workflow not found: ${o}`):(M(s,"--json")?W(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2155
- `),0)}function WW(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function gf(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function BW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return M(n,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2156
- `),0}function qW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return M(n,"--json")?W(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2157
- `),0}function HW(t,e,r){let n=P(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=N(n,"--owner"),i=N(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=N(n,"--local-path")??(l!==null?tT(l,u):void 0),f=N(n,"--workflow"),m=N(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=N(n,"--test-argv"),g=null;if(h!==void 0)try{let v=JSON.parse(h);if(!Array.isArray(v)||!v.every(x=>typeof x=="string")||v.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(v)}catch{return w(e,"--test-argv must be valid JSON")}let _=N(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let T=_!==void 0?_:XW(d)||Yn(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:N(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return M(n,"--json")?W(e,E):e.stdout.write(`created project ${E.name}
2158
- `),0}function JW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2152
+ `:""}`),0}function FW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=yf(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(C(n,"--json")?B(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2153
+ `),0)}function UW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=yf(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?w(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2154
+ `),0):w(e,`project workflow not found: ${s}`)}function eT(t,e,r,n){let s=D(t,[]);if(s.error!==void 0)return w(e,s.error);let o=yf(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return w(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?w(e,`project workflow not found: ${o}`):(C(s,"--json")?B(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2155
+ `),0)}function WW(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function yf(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function BW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return C(n,"--json")?B(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2156
+ `),0}function qW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return C(n,"--json")?B(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2157
+ `),0}function HW(t,e,r){let n=D(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=j(n,"--owner"),i=j(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=j(n,"--local-path")??(l!==null?tT(l,u):void 0),f=j(n,"--workflow"),m=j(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=j(n,"--test-argv"),g=null;if(h!==void 0)try{let v=JSON.parse(h);if(!Array.isArray(v)||!v.every(I=>typeof I=="string")||v.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(v)}catch{return w(e,"--test-argv must be valid JSON")}let _=j(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let T=_!==void 0?_:XW(d)||Yn(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:j(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return C(n,"--json")?B(e,E):e.stdout.write(`created project ${E.name}
2158
+ `),0}function JW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return C(n,"--json")?B(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2159
2159
  `)}${s.length>0?`
2160
2160
  `:""}`),0}function XW(t){try{let e=tT(t,"durable-memory");return RW(e)&&OW(e).isDirectory()}catch{return!1}}var LW,nT=b(()=>{"use strict";$e();sn();zn();LW=`usage: lmctl project <create|list|show|status|workflow>
2161
2161
 
2162
2162
  Create, list, inspect, and check projects. The workflow subcommand manages
2163
2163
  per-project workflow bindings and routing conditions.
2164
- `});import{createHash as GW,randomBytes as VW}from"node:crypto";import{readFile as KW}from"node:fs/promises";function sT(t=new Date,e=VW(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function YW(t){return GW("sha256").update(t).digest("hex")}async function oT(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await KW(n);return{path:r,sha256:YW(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function iT(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var wf=b(()=>{"use strict"});import{spawnSync as aT}from"node:child_process";import{mkdir as yf,writeFile as lT,readFile as zW,rm as cT}from"node:fs/promises";import{tmpdir as ZW}from"node:os";import{dirname as uT,join as Ef}from"node:path";async function dT(t){let e=t.stagingDir??Ef(ZW(),`lmctl-diag-${t.ticketId}`),r=Ef(e,`diagnostic-${t.ticketId}`);await yf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Ef(r,d);if(await yf(uT(m),{recursive:!0}),typeof f=="string")await lT(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await lT(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2164
+ `});import{createHash as GW,randomBytes as VW}from"node:crypto";import{readFile as KW}from"node:fs/promises";function sT(t=new Date,e=VW(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function YW(t){return GW("sha256").update(t).digest("hex")}async function oT(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await KW(n);return{path:r,sha256:YW(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function iT(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var Ef=b(()=>{"use strict"});import{spawnSync as aT}from"node:child_process";import{mkdir as bf,writeFile as lT,readFile as zW,rm as cT}from"node:fs/promises";import{tmpdir as ZW}from"node:os";import{dirname as uT,join as Sf}from"node:path";async function dT(t){let e=t.stagingDir??Sf(ZW(),`lmctl-diag-${t.ticketId}`),r=Sf(e,`diagnostic-${t.ticketId}`);await bf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Sf(r,d);if(await bf(uT(m),{recursive:!0}),typeof f=="string")await lT(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await lT(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2165
2165
  `;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
2166
2166
  `:`${d.pid}
2167
2167
  # source=${d.pid_source} alive=${String(d.pid_alive)}
@@ -2179,29 +2179,29 @@ per-project workflow bindings and routing conditions.
2179
2179
  `:`# source=${f}
2180
2180
  # tail_lines=${d.tail_lines}
2181
2181
  `;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
2182
- `:""}`)}if(await s("README.md",QW(t)),t.sanitized)for(let d of n){let f=await zW(d.absPath);try{Cf(d.bundlePath,f.toString("utf8"))}catch(m){throw await cT(e,{recursive:!0,force:!0}),m instanceof _r,m}}let i=await oT(n),a=iT({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await yf(uT(t.outputPath),{recursive:!0});let l=aT("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=aT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await cT(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function QW(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2183
- `)}var fT=b(()=>{"use strict";wf();Hs()});import{spawnSync as eB}from"node:child_process";import{stat as tB}from"node:fs/promises";async function mT(t){try{if(!(await tB(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return rB(t);case"hq":return nB(t)}}function rB(t){let r=eB("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function nB(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var pT=b(()=>{"use strict"});var _T={};le(_T,{parseDiagnoseArgs:()=>hT,runDiagnose:()=>iB});import{tmpdir as sB}from"node:os";import{join as oB}from"node:path";async function iB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${cB()}
2182
+ `:""}`)}if(await s("README.md",QW(t)),t.sanitized)for(let d of n){let f=await zW(d.absPath);try{Df(d.bundlePath,f.toString("utf8"))}catch(m){throw await cT(e,{recursive:!0,force:!0}),m instanceof _r,m}}let i=await oT(n),a=iT({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await bf(uT(t.outputPath),{recursive:!0});let l=aT("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=aT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await cT(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function QW(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2183
+ `)}var fT=b(()=>{"use strict";Ef();Hs()});import{spawnSync as eB}from"node:child_process";import{stat as tB}from"node:fs/promises";async function mT(t){try{if(!(await tB(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return rB(t);case"hq":return nB(t)}}function rB(t){let r=eB("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function nB(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var pT=b(()=>{"use strict"});var _T={};ce(_T,{parseDiagnoseArgs:()=>hT,runDiagnose:()=>iB});import{tmpdir as sB}from"node:os";import{join as oB}from"node:path";async function iB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${cB()}
2184
2184
  `),0;let r=hT(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2185
2185
  `),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
2186
2186
  `),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2187
- `),2;let n=sT(),s=r.outputPath??lB(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await X(e,async i=>{let a=await Df({dal:i,include:r.include,dbPath:ce(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await dT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:st(),sanitized:!r.noSanitize})}catch(d){if(d instanceof _r)return e.stderr.write(`sanitization failed: ${d.message}
2187
+ `),2;let n=sT(),s=r.outputPath??lB(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await X(e,async i=>{let a=await Ff({dal:i,include:r.include,dbPath:ue(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await dT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:st(),sanitized:!r.noSanitize})}catch(d){if(d instanceof _r)return e.stderr.write(`sanitization failed: ${d.message}
2188
2188
  `),2;throw d}let c=await mT({mode:o,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),u={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(u,null,2)}
2189
2189
  `):(e.stdout.write(`ticket: ${n}
2190
2190
  `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2191
2191
  `),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2192
2192
  `)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
2193
2193
  `),1}}function hT(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!aB(o))return`unknown section: ${o} (expected one of ${Js.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function aB(t){return Js.includes(t)}function lB(t){return oB(sB(),`lmctl-diag-${t}.tar.gz`)}function cB(){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(`
2194
- `)}var gT=b(()=>{"use strict";On();fT();wf();Hs();pT();Ve();$e()});var kT={};le(kT,{ATTENTION_STATES:()=>Sf,DAEMON_INTERVAL_FAST_MS:()=>bf,REQUIRED_TEAM_ALIASES:()=>yT,chooseDiagnoses:()=>ST,collectEvidence:()=>bT,diagnose:()=>ET,renderReport:()=>TT,runDiagnosePrompt:()=>fB});function ET(t,e){let r=bT(t,e),n=ST(r);return TT(r,n)}function bT(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:Es(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=dB(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=yT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function ST(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>bf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${bf}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>Sf.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function TT(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${uB(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>Sf.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2194
+ `)}var gT=b(()=>{"use strict";On();fT();Ef();Hs();pT();Ve();$e()});var kT={};ce(kT,{ATTENTION_STATES:()=>kf,DAEMON_INTERVAL_FAST_MS:()=>Tf,REQUIRED_TEAM_ALIASES:()=>yT,chooseDiagnoses:()=>ST,collectEvidence:()=>bT,diagnose:()=>ET,renderReport:()=>TT,runDiagnosePrompt:()=>fB});function ET(t,e){let r=bT(t,e),n=ST(r);return TT(r,n)}function bT(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:Es(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=dB(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=yT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function ST(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>Tf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${Tf}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>kf.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function TT(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${uB(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>kf.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2195
2195
  `)+`
2196
2196
  `}function uB(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function dB(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function fB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${wT()}
2197
2197
  `),0;let r=t.filter(s=>!s.startsWith("--"));if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2198
2198
  `),e.stderr.write(`${wT()}
2199
2199
  `),2;let n=r[0];try{return await X(e,s=>(e.stdout.write(ET(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2200
2200
  `),1}}function wT(){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(`
2201
- `)}var yT,bf,Sf,vT=b(()=>{"use strict";zu();$e();yT=["Coder","Reviewer1","Polisher"],bf=3e4,Sf=new Set(["attention_needed","paused","escalation"])});var jT={};le(jT,{appendIntent:()=>$T,resolveIntentLogPath:()=>xT,runStatus:()=>bB});import{appendFileSync as mB,mkdirSync as pB}from"node:fs";import{homedir as hB}from"node:os";import{dirname as _B,join as gB}from"node:path";function xT(){return process.env.LMCTL_INTENT_LOG??gB(hB(),".lmctl","recent-intents.log")}function $T(t){try{let e=xT();pB(_B(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});mB(e,`${r}
2202
- `)}catch{}}async function bB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(EB),0;let r=P(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=N(r,"--project"),o=M(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):X(e,i=>{let a=SB(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2201
+ `)}var yT,Tf,kf,vT=b(()=>{"use strict";Qu();$e();yT=["Coder","Reviewer1","Polisher"],Tf=3e4,kf=new Set(["attention_needed","paused","escalation"])});var jT={};ce(jT,{appendIntent:()=>$T,resolveIntentLogPath:()=>xT,runStatus:()=>bB});import{appendFileSync as mB,mkdirSync as pB}from"node:fs";import{homedir as hB}from"node:os";import{dirname as _B,join as gB}from"node:path";function xT(){return process.env.LMCTL_INTENT_LOG??gB(hB(),".lmctl","recent-intents.log")}function $T(t){try{let e=xT();pB(_B(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});mB(e,`${r}
2202
+ `)}catch{}}async function bB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(EB),0;let r=D(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=C(r,"--web"),s=j(r,"--project"),o=C(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):X(e,i=>{let a=SB(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2203
2203
  `),1;if(a.kind==="no-web-focus")return e.stderr.write(`no active webui focus; run lmctl status --web after navigating webui to a project, or omit --web.
2204
- `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=TB(i,l,a.source);return o?W(e,c):e.stdout.write($B(c)),$T({verb:"status",args:t}),0})}function SB(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=rf(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function TB(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=kB(t,e.id,yB),a=vB(t,e.id),l=IB(t,e.id,wB);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:xB(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function kB(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function vB(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function IB(t,e,r){return t.db.prepare(`
2204
+ `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=TB(i,l,a.source);return o?B(e,c):e.stdout.write($B(c)),$T({verb:"status",args:t}),0})}function SB(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=sf(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function TB(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=kB(t,e.id,yB),a=vB(t,e.id),l=IB(t,e.id,wB);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:xB(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function kB(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function vB(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function IB(t,e,r){return t.db.prepare(`
2205
2205
  SELECT r.*, w.name AS workflow_name
2206
2206
  FROM run r
2207
2207
  JOIN job j ON j.id = r.job_id
@@ -2210,15 +2210,15 @@ per-project workflow bindings and routing conditions.
2210
2210
  ORDER BY r.id DESC
2211
2211
  LIMIT ?
2212
2212
  `).all(e,r)}function xB(t){if(t===null||t.length===0)return null;try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let r=e,n=["message","detail","reason","action","state"];for(let s of n){let o=r[s];if(typeof o=="string"&&o.length>0)return IT(o,100)}}}catch{}return IT(t,100)}function IT(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function $B(t){let e=[];if(e.push(`project: ${t.project.name}`),e.push(` local_path: ${t.project.local_path}`),e.push(` workflow: ${t.project.workflow_name}`),t.project.team_name!==null&&e.push(` team: ${t.project.team_name}`),e.push(""),t.active_run===null)e.push("active run: none");else{let r=t.active_run.paused_at!==null?`paused at ${t.active_run.current_state??"?"}`:t.active_run.current_state??"unknown";e.push(`active run: #${t.active_run.id} (${r}, started ${t.active_run.started_at})`)}if(e.push(""),t.attentions.unacked_count===0)e.push("attentions: none");else{e.push(`attentions: ${t.attentions.unacked_count} unread`);for(let r of t.attentions.recent){let n=r.payload_summary===null?"":` \u2014 ${r.payload_summary}`;e.push(` - ${r.kind}: #${r.id}${n} (${r.created_at})`)}}if(e.push(""),t.recent_runs.length===0)e.push("recent runs: none");else{e.push("recent runs:");for(let r of t.recent_runs){let n=r.terminal_state??r.current_state??"pending";e.push(` #${r.id} ${r.workflow_name} ${n} (${r.started_at})`)}}return e.push(""),e.join(`
2213
- `)}var wB,yB,EB,NT=b(()=>{"use strict";$e();sf();wB=5,yB=10,EB=`usage: lmctl status [--project NAME|--web] [--json]
2213
+ `)}var wB,yB,EB,NT=b(()=>{"use strict";$e();af();wB=5,yB=10,EB=`usage: lmctl status [--project NAME|--web] [--json]
2214
2214
 
2215
2215
  Show the current project context, active run, unacked attentions, and recent
2216
2216
  runs. Defaults to resolving the project from the current working directory;
2217
2217
  --project selects a project by name, and --web uses the web UI focus.
2218
- `});Ve();On();je();import{pathToFileURL as jB}from"node:url";Ks();On();import{mkdirSync as Tk,readFileSync as kk,renameSync as vk,writeFileSync as Ik}from"node:fs";import{homedir as xk}from"node:os";import{dirname as $k,join as jk}from"node:path";var Nk="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",Ak=60*60*1e3,Rk=1500;function Ok(){let t=process.env.HOME??xk();return jk(t,".lmctl",".update-check.json")}function Lk(t){return t.isTTY===!0}function Ck(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function Za(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!Lk(e.stderr)||t.includes("--json")||t.includes("--from")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function Mk(t,e){try{let r=JSON.parse(kk(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<Ak)return r.latest}catch{}return null}function Dk(t,e){Tk($k(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;Ik(r,`${JSON.stringify(e)}
2219
- `,"utf8"),vk(r,t)}async function Pk(){let t=await gr(Nk,{description:"lmctl npm metadata",timeoutMs:Rk}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function qf(t,e=[],r={}){try{if(Za(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??Ok();if(Mk(s,n)!==null)return;let i=await(r.fetchLatest??Pk)();try{Dk(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??st();Ck(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2220
- `)}catch{}}var vf=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2221
- `,Tf=`${vf}
2218
+ `});Ve();On();je();import{pathToFileURL as jB}from"node:url";Ks();On();import{mkdirSync as Tk,readFileSync as kk,renameSync as vk,writeFileSync as Ik}from"node:fs";import{homedir as xk}from"node:os";import{dirname as $k,join as jk}from"node:path";var Nk="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",Ak=60*60*1e3,Rk=1500;function Ok(){let t=process.env.HOME??xk();return jk(t,".lmctl",".update-check.json")}function Lk(t){return t.isTTY===!0}function Ck(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function Qa(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!Lk(e.stderr)||t.includes("--json")||t.includes("--from")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function Mk(t,e){try{let r=JSON.parse(kk(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<Ak)return r.latest}catch{}return null}function Dk(t,e){Tk($k(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;Ik(r,`${JSON.stringify(e)}
2219
+ `,"utf8"),vk(r,t)}async function Pk(){let t=await gr(Nk,{description:"lmctl npm metadata",timeoutMs:Rk}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function Jf(t,e=[],r={}){try{if(Qa(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??Ok();if(Mk(s,n)!==null)return;let i=await(r.fetchLatest??Pk)();try{Dk(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??st();Ck(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2220
+ `)}catch{}}var xf=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2221
+ `,vf=`${xf}
2222
2222
  Setup & status:
2223
2223
  status Show current project context, active run, attentions, and recent runs.
2224
2224
  diagnose Collect a sanitized troubleshooting bundle, with optional upload.
@@ -2263,14 +2263,14 @@ Global flags:
2263
2263
  chain and context.
2264
2264
 
2265
2265
  Run 'lmctl help <command>' for command-specific help.
2266
- `,AT=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","health","ls","lint","seed","hire","refresh","clone","plan","workflow","run","project","workspace","diagnose","diagnose-prompt","status","db"]);function kf(t,e){return t.stderr.write(`error: ${e}
2267
- ${vf}Run 'lmctl help' for usage.
2266
+ `,AT=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","health","ls","lint","seed","hire","refresh","clone","plan","workflow","run","project","workspace","diagnose","diagnose-prompt","status","db"]);function If(t,e){return t.stderr.write(`error: ${e}
2267
+ ${xf}Run 'lmctl help' for usage.
2268
2268
  `),2}function OT(t,e){return t.stderr.write(`error: unknown command: ${e}
2269
- ${vf}Run 'lmctl help' for usage.
2270
- `),1}async function NB(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return kf(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return kf(e,"missing value for --workspace");if(!qe(l))return kf(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){Wf();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${st()}
2271
- `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Tf),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(Tf),0):AT.has(i)?RT(i,[...a,"--help"],e):OT(e,i)}jf(ce(),e.stderr),Af(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(Tf),0;Se()&&e.stderr.write(`[debug] lmctl ${st()} | node ${process.version} | cmd ${s} ${o.join(" ")}
2272
- [debug] cwd ${process.cwd()} | db ${ce()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}
2273
- `);try{let i=await RT(s,o,e);return AT.has(s)&&!Za(r,e)&&await qf(e,r),i}catch(i){return AB(i,s,o,e)}}function AB(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Se())return n.stderr.write(`error: ${s.message}
2269
+ ${xf}Run 'lmctl help' for usage.
2270
+ `),1}async function NB(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return If(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return If(e,"missing value for --workspace");if(!qe(l))return If(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){qf();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${st()}
2271
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(vf),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(vf),0):AT.has(i)?RT(i,[...a,"--help"],e):OT(e,i)}Af(ue(),e.stderr),Of(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(vf),0;Se()&&e.stderr.write(`[debug] lmctl ${st()} | node ${process.version} | cmd ${s} ${o.join(" ")}
2272
+ [debug] cwd ${process.cwd()} | db ${ue()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}
2273
+ `);try{let i=await RT(s,o,e);return AT.has(s)&&!Qa(r,e)&&await Jf(e,r),i}catch(i){return AB(i,s,o,e)}}function AB(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Se())return n.stderr.write(`error: ${s.message}
2274
2274
  `),n.stderr.write(`(re-run with --debug for the full stack trace and context)
2275
2275
  `),1;n.stderr.write(`error: ${s.message}
2276
2276
  `),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}
@@ -2278,7 +2278,7 @@ ${vf}Run 'lmctl help' for usage.
2278
2278
  `),s.stack&&n.stderr.write(`${s.stack}
2279
2279
  `);let o=s.cause,i=0;for(;o!=null&&i<8;){let a=o instanceof Error?o:new Error(String(o));n.stderr.write(`caused by: ${a.message}
2280
2280
  `),a.stack&&n.stderr.write(`${a.stack}
2281
- `),o=a.cause,i+=1}return 1}async function RT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(hc(),nh));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Pc(),Ph));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(XE(),JE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(VE(),GE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(wb(),gb));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(vb(),kb));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(Ob(),Rb));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Cb(),Lb));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(Pb(),Db));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Xb(),Jb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(Vb(),Gb));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(zb(),Yb));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Fs(),Ps));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Fs(),Ps));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Fs(),Ps));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Fs(),Ps));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(bS(),ES));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(vS(),kS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(jS(),$S));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(ff(),df));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(ff(),df));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(QS(),ZS));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(nT(),rT));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(gT(),_T));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(vT(),kT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(NT(),jT));return n(e,r)}case"db":return RB(e,r);default:return OT(r,t)}}function RB(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2281
+ `),o=a.cause,i+=1}return 1}async function RT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(gc(),nh));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Uc(),Ph));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(XE(),JE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(VE(),GE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(wb(),gb));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(vb(),kb));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(Ob(),Rb));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Cb(),Lb));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(Pb(),Db));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Xb(),Jb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(Vb(),Gb));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(zb(),Yb));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Fs(),Ps));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Fs(),Ps));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Fs(),Ps));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Fs(),Ps));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(bS(),ES));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(vS(),kS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(jS(),$S));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(pf(),mf));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(pf(),mf));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(QS(),ZS));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(nT(),rT));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(gT(),_T));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(vT(),kT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(NT(),jT));return n(e,r)}case"db":return RB(e,r);default:return OT(r,t)}}function RB(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2282
2282
 
2283
2283
  Database utilities. The downgrade command is currently a documented stub;
2284
2284
  restore from backup for rollback and use normal migrations for forward changes.