@lmctl-ai/lmctl 0.1.99 → 0.1.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -1,20 +1,20 @@
1
- var Pk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ne=(t,e)=>{for(var r in e)Pk(t,r,{get:e[r],enumerable:!0})};import{existsSync as Zr,readdirSync as Fk,readFileSync as Uk}from"node:fs";import{homedir as Wk,platform as wm}from"node:os";import{join as Dt}from"node:path";function xr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Dt(Wk(),Bk)}function zn(){return Dt(xr(),Em)}function Ar(){return Dt(xr(),Hk)}function Pt(t){return Dt(Ar(),t)}function sr(t){return Dt(Pt(t),Em)}function vl(){let t=[],e=new Set,r=o=>{Zr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:zn(),kind:"legacy"});let n=Ar();if(!Zr(n))return t;let s;try{s=Fk(n)}catch{return t}for(let o of s.sort())Ge(o)&&r({workspace_name:o,db_path:sr(o),kind:"workspace"});return t}function kl(t){return Dt(Pt(t),"projects")}function _o(){return Dt(xr(),qk)}function Ge(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function go(){let t=_o();if(!Zr(t))return null;try{let e=Uk(t,"utf8").trim();return e.length===0||!Ge(e)?null:e}catch{return null}}function Zn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Ge(t)?t:go()}function le(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Zn();if(e!==null)return sr(e);let r=zn();return Zr(r)||!Zr(Ar())?r:sr(Tm)}function Gk(t,e=wm()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function bm(t,e=process.stderr,r=wm()){Gk(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 Il(){return Dt(xr(),Jk)}function Sm(){return Dt(xr(),Xk)}function Kk(){try{return Zr(Il())}catch{return!1}}function vm(t=process.stderr){Kk()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
1
+ var Pk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ne=(t,e)=>{for(var r in e)Pk(t,r,{get:e[r],enumerable:!0})};import{existsSync as Zr,readdirSync as Fk,readFileSync as Uk}from"node:fs";import{homedir as Wk,platform as wm}from"node:os";import{join as Dt}from"node:path";function xr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Dt(Wk(),Bk)}function zn(){return Dt(xr(),Em)}function Ar(){return Dt(xr(),Hk)}function Pt(t){return Dt(Ar(),t)}function sr(t){return Dt(Pt(t),Em)}function kl(){let t=[],e=new Set,r=o=>{Zr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:zn(),kind:"legacy"});let n=Ar();if(!Zr(n))return t;let s;try{s=Fk(n)}catch{return t}for(let o of s.sort())Ge(o)&&r({workspace_name:o,db_path:sr(o),kind:"workspace"});return t}function Il(t){return Dt(Pt(t),"projects")}function _o(){return Dt(xr(),qk)}function Ge(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function go(){let t=_o();if(!Zr(t))return null;try{let e=Uk(t,"utf8").trim();return e.length===0||!Ge(e)?null:e}catch{return null}}function Zn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Ge(t)?t:go()}function le(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Zn();if(e!==null)return sr(e);let r=zn();return Zr(r)||!Zr(Ar())?r:sr(Tm)}function Gk(t,e=wm()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function bm(t,e=process.stderr,r=wm()){Gk(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 Nl(){return Dt(xr(),Jk)}function Sm(){return Dt(xr(),Xk)}function Kk(){try{return Zr(Nl())}catch{return!1}}function vm(t=process.stderr){Kk()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
3
  `)}var Bk,Em,Hk,qk,Tm,Jk,Xk,Rr,Ke=E(()=>{"use strict";Bk=".lmctl",Em="state.db",Hk="workspaces",qk="active-workspace",Tm="default",Jk="profiles",Xk="active-profile";Rr={default:Tm}});function Zk(t){for(let e of zk)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 Qk(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function rI(t){let e=t.split(".");if(e.length!==4)return!1;for(let r of e){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function Qn(t){let e=t;for(let{re:r,replacement:n}of Yk)e=e.replace(r,n);return e=e.replace(eI,r=>!rI(r)||Zk(r)?r:km),e=e.replace(tI,r=>Qk(r)?r:km),e}function es(t){return t.split(`
4
4
  `).map(e=>Qn(e)).join(`
5
- `)}function Nm(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:at}:{key:t,value:Qn(e)}}function or(t){if(typeof t=="string")return Qn(t);if(Array.isArray(t))return t.map(e=>or(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?at:or(n):e[r]=or(n)}return e}return t}function xm(t,e){for(let{name:r,re:n}of nI){let s=e.match(n);if(s!==null&&!s[0].includes(at))throw new $r(t,r)}}var at,Vk,km,Im,Yk,zk,eI,tI,nI,$r,yo=E(()=>{"use strict";at="[REDACTED]",Vk="[REDACTED_EMAIL]",km="[REDACTED_IP]",Im="[USER]",Yk=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${at}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${at}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${at}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:at},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:at},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:at},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:at},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${at}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Im}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Im}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:Vk}],zk=["127.","10.","192.168.","0.0.0.0"];eI=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,tI=/\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;nI=[{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 Nl}from"node:child_process";import{readFileSync as sI}from"node:fs";import{readFile as Al,stat as Am}from"node:fs/promises";import{homedir as oI}from"node:os";import{join as iI}from"node:path";import{fileURLToPath as aI}from"node:url";function lt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(sI(aI(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Rm(t){let e=new Set(t.include??wo),r={};return e.has("serve")&&(r.serve=await cI(t)),e.has("db")&&(r.db=uI(t)),e.has("runs")&&(r.runs=dI(t)),e.has("jobs")&&(r.jobs=fI(t)),e.has("attentions")&&(r.attentions=mI(t)),e.has("env")&&(r.env=await pI(t)),e.has("intents")&&(r.intents=await _I(t)),r}async function cI(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await Al(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 Al(r,"utf8")).split(`
5
+ `)}function Nm(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:at}:{key:t,value:Qn(e)}}function or(t){if(typeof t=="string")return Qn(t);if(Array.isArray(t))return t.map(e=>or(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?at:or(n):e[r]=or(n)}return e}return t}function xm(t,e){for(let{name:r,re:n}of nI){let s=e.match(n);if(s!==null&&!s[0].includes(at))throw new $r(t,r)}}var at,Vk,km,Im,Yk,zk,eI,tI,nI,$r,yo=E(()=>{"use strict";at="[REDACTED]",Vk="[REDACTED_EMAIL]",km="[REDACTED_IP]",Im="[USER]",Yk=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${at}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${at}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${at}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:at},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:at},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:at},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:at},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${at}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Im}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Im}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:Vk}],zk=["127.","10.","192.168.","0.0.0.0"];eI=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,tI=/\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;nI=[{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 xl}from"node:child_process";import{readFileSync as sI}from"node:fs";import{readFile as Rl,stat as Am}from"node:fs/promises";import{homedir as oI}from"node:os";import{join as iI}from"node:path";import{fileURLToPath as aI}from"node:url";function lt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(sI(aI(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Rm(t){let e=new Set(t.include??wo),r={};return e.has("serve")&&(r.serve=await cI(t)),e.has("db")&&(r.db=uI(t)),e.has("runs")&&(r.runs=dI(t)),e.has("jobs")&&(r.jobs=fI(t)),e.has("attentions")&&(r.attentions=mI(t)),e.has("env")&&(r.env=await pI(t)),e.has("intents")&&(r.intents=await _I(t)),r}async function cI(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await Rl(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 Rl(r,"utf8")).split(`
6
6
  `),f=d.slice(Math.max(0,d.length-n));c=f.length,a=es(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 uI(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 dI(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),o=e.query(`SELECT ${xl} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${xl} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${xl} 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 dI(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),o=e.query(`SELECT ${Al} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${Al} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${Al} 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:or(o),stale:or(a),paused:or(i)}}function fI(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 mI(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:or(r)}}async function pI(t){let e=lt(),r=process.version,n=Nl("uname",["-a"],{encoding:"utf8"}),s=es((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Am(i);let u=Nl("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 Am(a);let u=Nl("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":es(o.join(`
13
- `)),c=[];for(let u of lI){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Nm(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function hI(){return process.env.LMCTL_INTENT_LOG??iI(oI(),".lmctl","recent-intents.log")}async function _I(t){let e=t.intentLog??hI(),r=t.intentLogTailLines??500;try{let s=(await Al(e,"utf8")).split(`
12
+ FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:or(r)}}async function pI(t){let e=lt(),r=process.version,n=xl("uname",["-a"],{encoding:"utf8"}),s=es((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Am(i);let u=xl("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 Am(a);let u=xl("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":es(o.join(`
13
+ `)),c=[];for(let u of lI){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Nm(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function hI(){return process.env.LMCTL_INTENT_LOG??iI(oI(),".lmctl","recent-intents.log")}async function _I(t){let e=t.intentLog??hI(),r=t.intentLogTailLines??500;try{let s=(await Rl(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:es(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 wo,lI,xl,ts=E(()=>{"use strict";yo();wo=["serve","db","runs","jobs","attentions","env","intents"];lI=["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"];xl=["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 jm,appendFileSync as gI,mkdirSync as yI,existsSync as QJ,readdirSync as eX,unlinkSync as tX}from"node:fs";import{join as To,dirname as wI}from"node:path";import{homedir as EI}from"node:os";function Rl(){return To(EI(),".lmctl")}function Om(){Qr=!0,process.env.LMCTL_DEBUG="1"}function Cm(){return{cliDebug:Qr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Mm(t){Qr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function fe(){if(Qr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-Lm>=TI&&($m=vI(),Lm=t),$m}function $l(){return Qr||process.env.LMCTL_DEBUG==="1"}function bI(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Oe(t,e){if(e?.verbose){if(!Qr)return}else if(!e?.always&&!fe())return;try{SI();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};gI(Eo,JSON.stringify(r)+`
16
- `)}catch{}}function SI(){if(!Eo){let e=bI().slice(0,13).replace("T","-");Eo=To(Rl(),`debug-${e}.log`)}yI(wI(Eo),{recursive:!0})}function Ce(...t){Oe({event:"legacy",msg:t.join(" ")})}function Tt(...t){Oe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function z(t){Oe(t,{always:!0})}function vI(){return kI()||II()}function kI(){try{let t=jm(To(Rl(),"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 II(){try{let t=jm(To(Rl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Qr,$m,Lm,TI,Eo,ve=E(()=>{"use strict";Qr=!1,$m=!1,Lm=0,TI=5e3;Eo=null});function rs(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Ll(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function ns(t,e){return!Ll(t)||rs(t)?null:`${e} must use https://: ${t}`}async function bo(t,e){let r=ns(t,e.description);if(r!==null||!rs(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 Dm(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 Dm(t,e.description,n,a)}}finally{clearTimeout(o)}}function Dm(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 jl=E(()=>{"use strict"});import{existsSync as HI}from"node:fs";import{createRequire as qI}from"node:module";function JI(){return Cl===null&&(Cl=qI(import.meta.url)("node:sqlite").DatabaseSync),Cl}function Ml(t){return t.length===1&&XI(t[0])?[t[0]]:t}function XI(t){if(!Fl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Fl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Cl,Dl,So,Pl,Ul=E(()=>{"use strict";Cl=null;Dl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!HI(e))throw new Error("unable to open database file");this.name=e,this.handle=new(JI())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Pl(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)}}},So=Dl,Pl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...Ml(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...Ml(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...Ml(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Fl(e)?Object.values(e):Fl(e)?{...e}:e}}});import{existsSync as GI,mkdirSync as KI,readFileSync as Um}from"node:fs";import{homedir as VI}from"node:os";import{dirname as Wm,join as YI,resolve as Bm}from"node:path";import{fileURLToPath as zI,pathToFileURL as ZI}from"node:url";function Hl(t){t.dbPath!==":memory:"&&KI(Wm(t.dbPath),{recursive:!0});let e=new So(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Jm(e);return r===0&&(e.exec(Um(qm,"utf8")),e.pragma(`user_version = ${Bl}`)),e0(e,r),e}function e0(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 wo,lI,Al,ts=E(()=>{"use strict";yo();wo=["serve","db","runs","jobs","attentions","env","intents"];lI=["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"];Al=["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 jm,appendFileSync as gI,mkdirSync as yI,existsSync as QJ,readdirSync as eX,unlinkSync as tX}from"node:fs";import{join as To,dirname as wI}from"node:path";import{homedir as EI}from"node:os";function $l(){return To(EI(),".lmctl")}function Om(){Qr=!0,process.env.LMCTL_DEBUG="1"}function Cm(){return{cliDebug:Qr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Mm(t){Qr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function fe(){if(Qr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-Lm>=TI&&($m=vI(),Lm=t),$m}function Ll(){return Qr||process.env.LMCTL_DEBUG==="1"}function bI(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Oe(t,e){if(e?.verbose){if(!Qr)return}else if(!e?.always&&!fe())return;try{SI();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};gI(Eo,JSON.stringify(r)+`
16
+ `)}catch{}}function SI(){if(!Eo){let e=bI().slice(0,13).replace("T","-");Eo=To($l(),`debug-${e}.log`)}yI(wI(Eo),{recursive:!0})}function Ce(...t){Oe({event:"legacy",msg:t.join(" ")})}function Tt(...t){Oe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function z(t){Oe(t,{always:!0})}function vI(){return kI()||II()}function kI(){try{let t=jm(To($l(),"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 II(){try{let t=jm(To($l(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Qr,$m,Lm,TI,Eo,ve=E(()=>{"use strict";Qr=!1,$m=!1,Lm=0,TI=5e3;Eo=null});function rs(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function jl(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function ns(t,e){return!jl(t)||rs(t)?null:`${e} must use https://: ${t}`}async function bo(t,e){let r=ns(t,e.description);if(r!==null||!rs(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 Dm(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 Dm(t,e.description,n,a)}}finally{clearTimeout(o)}}function Dm(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 Ol=E(()=>{"use strict"});import{existsSync as HI}from"node:fs";import{createRequire as qI}from"node:module";function JI(){return Ml===null&&(Ml=qI(import.meta.url)("node:sqlite").DatabaseSync),Ml}function Dl(t){return t.length===1&&XI(t[0])?[t[0]]:t}function XI(t){if(!Ul(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Ul(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ml,Pl,So,Fl,Wl=E(()=>{"use strict";Ml=null;Pl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!HI(e))throw new Error("unable to open database file");this.name=e,this.handle=new(JI())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Fl(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)}}},So=Pl,Fl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...Dl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...Dl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...Dl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Ul(e)?Object.values(e):Ul(e)?{...e}:e}}});import{existsSync as GI,mkdirSync as KI,readFileSync as Um}from"node:fs";import{homedir as VI}from"node:os";import{dirname as Wm,join as YI,resolve as Bm}from"node:path";import{fileURLToPath as zI,pathToFileURL as ZI}from"node:url";function Hl(t){t.dbPath!==":memory:"&&KI(Wm(t.dbPath),{recursive:!0});let e=new So(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Jm(e);return r===0&&(e.exec(Um(qm,"utf8")),e.pragma(`user_version = ${Bl}`)),e0(e,r),e}function e0(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,
@@ -572,12 +572,18 @@ var Pk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ne=(t,e)=>{f
572
572
  `),t.exec(`
573
573
  CREATE INDEX IF NOT EXISTS idx_team_chat_log_root_time
574
574
  ON team_chat_log(root_teamfile, created_at);
575
- `),t.pragma("user_version = 46"),r=46),r>=46&&ss(t,"team_chat_log")&&!ue(t,"team_chat_log").has("origin")&&Fm(t),r<47&&r!==0){Wl(t,"agent_mailbox"),Wl(t,"tracked_invocation");let n=ue(t,"agent_mailbox");n.has("delivered_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivered_at TEXT;"),n.has("receipt")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN receipt TEXT;");let s=ue(t,"tracked_invocation");s.has("notified_by")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_by TEXT;"),s.has("notified_at")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_at TEXT;"),t.pragma("user_version = 47"),r=47}if(r<48&&r!==0){Wl(t,"agent_mailbox");let n=ue(t,"agent_mailbox");n.has("delivering_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivering_at TEXT;"),n.has("delivery_holder_pid")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_pid INTEGER;"),n.has("delivery_holder_host")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_host TEXT;"),n.has("waited_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_at TEXT;"),n.has("waited_by")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_by TEXT;"),t.exec(`
575
+ `),t.pragma("user_version = 46"),r=46),r>=46&&ss(t,"team_chat_log")&&!ue(t,"team_chat_log").has("origin")&&Fm(t),r<47&&r!==0){vo(t,"agent_mailbox"),vo(t,"tracked_invocation");let n=ue(t,"agent_mailbox");n.has("delivered_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivered_at TEXT;"),n.has("receipt")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN receipt TEXT;");let s=ue(t,"tracked_invocation");s.has("notified_by")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_by TEXT;"),s.has("notified_at")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_at TEXT;"),t.pragma("user_version = 47"),r=47}if(r<48&&r!==0){vo(t,"agent_mailbox");let n=ue(t,"agent_mailbox");n.has("delivering_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivering_at TEXT;"),n.has("delivery_holder_pid")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_pid INTEGER;"),n.has("delivery_holder_host")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_host TEXT;"),n.has("waited_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_at TEXT;"),n.has("waited_by")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_by TEXT;"),t.exec(`
576
576
  CREATE INDEX IF NOT EXISTS idx_agent_mailbox_sender_delivery_wait
577
577
  ON agent_mailbox(sender_teamfile, sender_alias, delivered_at, waited_at, id);
578
578
  CREATE INDEX IF NOT EXISTS idx_agent_mailbox_lane_delivery
579
579
  ON agent_mailbox(sender_teamfile, sender_alias, receiver_teamfile, receiver_alias, delivered_at, delivering_at, id);
580
- `),t.pragma("user_version = 48"),r=48}GI(QI)}function ue(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function ss(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Wl(t,e){if(!ss(t,e)&&(t.exec(Um(qm,"utf8")),!ss(t,e)))throw new Error(`schema.sql did not create expected table: ${e}`)}function Fm(t){let e=ue(t,"team_chat_log");t.pragma("foreign_keys = OFF");try{t.exec(`
580
+ `),t.pragma("user_version = 48"),r=48}r<49&&r!==0&&(vo(t,"tracked_invocation"),t.exec(`
581
+ UPDATE tracked_invocation
582
+ SET notified_by = 'migration-baseline',
583
+ notified_at = COALESCE(ended_at, started_at)
584
+ WHERE status IN ('done', 'error', 'busy', 'cancelled')
585
+ AND notified_by IS NULL;
586
+ `),t.pragma("user_version = 49"),r=49),GI(QI)}function ue(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function ss(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function vo(t,e){if(!ss(t,e)&&(t.exec(Um(qm,"utf8")),!ss(t,e)))throw new Error(`schema.sql did not create expected table: ${e}`)}function Fm(t){let e=ue(t,"team_chat_log");t.pragma("foreign_keys = OFF");try{t.exec(`
581
587
  DROP TABLE IF EXISTS team_chat_log_v46;
582
588
  CREATE TABLE team_chat_log_v46 (
583
589
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -606,7 +612,7 @@ var Pk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ne=(t,e)=>{f
606
612
  FROM team_chat_log;
607
613
  DROP TABLE team_chat_log;
608
614
  ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
609
- `)}finally{t.pragma("foreign_keys = ON")}}function Jm(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function t0(){return process.env.LMCTL_DB??YI(VI(),".lmctl","state.db")}var Hm,qm,QI,Bl,ql=E(()=>{"use strict";Ul();Hm=Wm(zI(import.meta.url)),qm=Bm(Hm,"schema.sql"),QI=Bm(Hm,"migrations"),Bl=48;if(process.argv[1]&&import.meta.url===ZI(process.argv[1]).href){let t=Hl({dbPath:process.argv[2]??t0()});try{process.stdout.write(`migrated user_version=${Jm(t)}
615
+ `)}finally{t.pragma("foreign_keys = ON")}}function Jm(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function t0(){return process.env.LMCTL_DB??YI(VI(),".lmctl","state.db")}var Hm,qm,QI,Bl,ql=E(()=>{"use strict";Wl();Hm=Wm(zI(import.meta.url)),qm=Bm(Hm,"schema.sql"),QI=Bm(Hm,"migrations"),Bl=49;if(process.argv[1]&&import.meta.url===ZI(process.argv[1]).href){let t=Hl({dbPath:process.argv[2]??t0()});try{process.stdout.write(`migrated user_version=${Jm(t)}
610
616
  `)}finally{t.close()}}});function Xm(t){return{getAgentInflight:t.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:t.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:t.prepare(`
611
617
  INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
612
618
  VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
@@ -879,8 +885,8 @@ var Pk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ne=(t,e)=>{f
879
885
  AND delivered_at IS NULL
880
886
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
881
887
  `),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function Jl(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(zm,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),o=n;for(;o>0&&(s[o]&192)===128;)o-=1;return`${s.subarray(0,o).toString("utf8")}${zm}`}var zm,Qm=E(()=>{"use strict";zm=`
882
- ...[truncated]`});function as(t,e){return JSON.stringify([t,e])}function ep(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(r=>typeof r=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var os,is,tp=E(()=>{"use strict";os="terminal_lock",is="member"});function ir(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}var vo=E(()=>{"use strict"});function en(t){return typeof t=="string"&&r0.has(t)}function sp(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: ${ko[0]}`,` STANCE: ${ko[1]}`,` STANCE: ${ko[2]}`,` STANCE: ${rp}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
883
- `)}var rp,ko,r0,ls,np,Xl,Io,cs=E(()=>{"use strict";rp="other",ko=["not_enough_information","dont_know","other_work"],r0=new Set([rp,...ko]),ls="@abort",np="invalid_decision",Xl="escalation_aborted",Io="workflow_escalation"});import{randomUUID as op}from"node:crypto";import{hostname as us}from"node:os";function Ae(t){return t.provider_resolved??t.provider}function P(){return new Date().toISOString()}function ge(t){return new Gl(Hl({dbPath:t.path}))}function ip(t,e,r){let n=ap(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 ap(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 ap(t){let e=n0(t),r=e===null?null:s0(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))No(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function n0(t){try{let e=JSON.parse(t);return No(e)?e:null}catch{return null}}function s0(t,e){let r=t[e];return No(r)?r:null}function No(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function o0(t){try{let e=JSON.parse(t);return!No(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function i0(t,e){return t===null?!0:t.holder_host===us()?!ir(t.holder_pid):t.last_heartbeat<e}function a0(t,e){return t.delivering_at===null?!1:t.delivery_holder_host===us()&&l0(t.delivery_holder_pid)?!ir(t.delivery_holder_pid):t.delivering_at<e}function l0(t){return Number.isInteger(t)&&(t??0)>0}function c0(t){return{...Zm(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
888
+ ...[truncated]`});function as(t,e){return JSON.stringify([t,e])}function ep(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(r=>typeof r=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var os,is,tp=E(()=>{"use strict";os="terminal_lock",is="member"});function ir(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}var ko=E(()=>{"use strict"});function en(t){return typeof t=="string"&&r0.has(t)}function sp(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: ${Io[0]}`,` STANCE: ${Io[1]}`,` STANCE: ${Io[2]}`,` STANCE: ${rp}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
889
+ `)}var rp,Io,r0,ls,np,Xl,No,cs=E(()=>{"use strict";rp="other",Io=["not_enough_information","dont_know","other_work"],r0=new Set([rp,...Io]),ls="@abort",np="invalid_decision",Xl="escalation_aborted",No="workflow_escalation"});import{randomUUID as op}from"node:crypto";import{hostname as us}from"node:os";function Ae(t){return t.provider_resolved??t.provider}function P(){return new Date().toISOString()}function ge(t){return new Gl(Hl({dbPath:t.path}))}function ip(t,e,r){let n=ap(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 ap(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 ap(t){let e=n0(t),r=e===null?null:s0(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))xo(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function n0(t){try{let e=JSON.parse(t);return xo(e)?e:null}catch{return null}}function s0(t,e){let r=t[e];return xo(r)?r:null}function xo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function o0(t){try{let e=JSON.parse(t);return!xo(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function i0(t,e){return t===null?!0:t.holder_host===us()?!ir(t.holder_pid):t.last_heartbeat<e}function a0(t,e){return t.delivering_at===null?!1:t.delivery_holder_host===us()&&l0(t.delivery_holder_pid)?!ir(t.delivery_holder_pid):t.delivering_at<e}function l0(t){return Number.isInteger(t)&&(t??0)>0}function c0(t){return{...Zm(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
884
890
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
885
891
  VALUES (?, ?, ?, ?, ?)
886
892
  ON CONFLICT(scope, key, kind) DO UPDATE SET
@@ -1280,9 +1286,9 @@ var Pk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ne=(t,e)=>{f
1280
1286
  error_detail = ?,
1281
1287
  truncated = ?
1282
1288
  WHERE id = ?
1283
- `),...Vm(t),...Xm(t)}}function u0(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Gl,We=E(()=>{"use strict";ql();Gm();Ym();Qm();tp();vo();cs();Gl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=c0(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)=>u0("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!==Io)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!==ls&&!a.includes(n))return{resumed:!1,reason:np};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),i=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let o of s)this.stmts.deleteMailboxMessage.run(o.id);return s})}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){ip(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,P()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,P());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){ip(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,P());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,P())}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,P());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,P()),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,P(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(P(),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,P());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,P());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,P(),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,P());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",P());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,P());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=P(),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,P(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,P(),e)??null}closeIssue(e,r,n){let s=P(),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,P(),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,P(),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=P();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,P(),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,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=op(),s=P();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=P(),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,P())}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??P(),e.dedupe_key??null,e.concurrency_key??null,P());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=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=P(),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:P();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,P()),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,P()),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??P(),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,P());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=P(),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,P(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(P(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){let r=e.started_at??P(),n=e.holder_host??us(),s=e.last_heartbeat_at??r,o=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Ft(e.command),r,e.holder_pid??null,n,s,Ft(e.meta));return this.getTrackedInvocation(Number(o.lastInsertRowid))}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){let n=r.ended_at??P();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Ft(r.result_summary),Ft(r.error),r.team_chat_log_id??null,Ft(r.meta),n,e).changes!==1?null:this.getTrackedInvocation(e)}reclaimTrackedInvocationIfUnchanged(e,r,n){let s=n.ended_at??P();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Ft(n.result_summary),Ft(n.error),n.team_chat_log_id??null,Ft(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(e)}heartbeatTrackedInvocation(e,r=P()){return this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","ended_at >= ?","notified_by IS NULL"],n=[e.ended_at_gte];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(e,r,n=P()){return this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1?null:this.getTrackedInvocation(e)}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let o=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${o} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,o=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(o?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){let r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,Jl(e.payload),e.created_at??P(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedMailFromSender(e,r,n,s){return this.stmts.listEnqueuedMailFromSender.all(e,r,n,s)}markMailDelivered(e,r,n){let s=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(s.length===0)return 0;let o=Jl(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let a of s)i+=this.stmts.markMailboxMessageDelivered.run(n,o,a).changes;return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(e,r,n=process.pid,s=us()){let o=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(o.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let i=[];for(let a of o)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&i.push(c)}return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearMailDelivery(e){let r=[...new Set(e.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(e){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1?null:this.getMailboxMessage(e.id)}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!a0(s,e))continue;let o=this.reclaimMailboxDeliveryIfUnchanged(s);o!==null&&n.push(o)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}clearObservedTerminalAgentInflight(e,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(os,as(e,r),is);return n===void 0?null:ep(n.data)}setTerminalLock(e){this.stmts.upsertRuntimeState.run(os,as(e.teamfile,e.alias),is,JSON.stringify(e),e.last_heartbeat)}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getTerminalLock(e,r);if(o===null||o.lock_id!==n)return this.db.exec("COMMIT"),!1;let i={...o,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(os,as(e,r),is,JSON.stringify(i),s),this.db.exec("COMMIT"),!0}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(os,as(e,r),is);return this.db.exec("COMMIT"),o.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:o0(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,o=P()){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i!==null&&!i0(i,s))return this.db.exec("COMMIT"),{acquired:!1,current:i};let a={lock_id:op(),holder_pid:process.pid,holder_host:us(),started_at:o,last_heartbeat:o};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),o),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:i}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o===null||o.lock_id!==s)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),i.changes===1}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,P(),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,P())}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,P());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,P(),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??P(),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,P());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,P()).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,P()),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,P());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(P(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=P();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??P());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,P())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,P())}}});import{realpathSync as d0}from"node:fs";import{resolve as f0}from"node:path";function Kl(t){let e=f0(t);try{return d0(e)}catch{return e}}var lp=E(()=>{"use strict"});import{platform as cp}from"node:os";function bt(t){let e=new ds;for(let r of t)e.registerAdapter(r);return e}var ds,Vl=E(()=>{"use strict";lp();ds=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=Kl(e.workspace);o=o.filter(a=>Kl(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=cp()==="darwin"||cp()==="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 up}from"node:fs";import{createInterface as dp}from"node:readline";import{stat as m0}from"node:fs/promises";import{homedir as p0}from"node:os";async function*Be(t){let e=up(t,{encoding:"utf-8"}),r=dp({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 Me(t,e){let r=[],n=up(t,{encoding:"utf-8"}),s=dp({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Re(t){let e=await m0(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function me(t){return t.replace(/\\n/g,`
1284
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ke,ar=E(()=>{"use strict";ke=p0()});import{readdir as xo,stat as fp,unlink as h0}from"node:fs/promises";import{join as tn,basename as mp}from"node:path";function _0(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function g0(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return me(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function pp(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Be(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var Ao,hp=E(()=>{"use strict";ar();Ao=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||tn(ke,".claude"),this.projectsDir=tn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await xo(this.projectsDir)}catch{return e}for(let n of r){let s=tn(this.projectsDir,n);if(!(await fp(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await xo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=mp(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=tn(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Me(e,50),s=await Re(e),o="",i,a,l,c,u,d;for(let m of n)if(!_0(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 pp(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Re(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Be(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:g0(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=G(_.trim(),80)),d=G(_.trim(),80),s.push({role:"user",timestamp:g,content:me(_.trim())})}else if(Array.isArray(_)){for(let S of _)if(S.type==="tool_result"){let w=typeof S.content=="string"?me(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:w,toolCallId:S.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let S of _)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:me(S.text),model:h.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:h.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!o)return null;let p=await pp(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 h0(r),!0):!1}async resolveSessionFile(e){let r;try{r=await xo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=tn(this.projectsDir,i);if(!(await fp(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await xo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=mp(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:tn(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 Me(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function Ro(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function w0(t,e,r){if(!r)return"";let n=t.tools[e]??Yl[e],s=n?.profiles?.[r]?.flags??Yl[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 _p(t,e){return!!t.tools[e]}function gp(t,e,r,n,s){let o=t.tools[e]??Yl[e],i;if(o?.agent){let l=Ro(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=y0[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(Ro).join(" ");i=`printf '%s\\n' ${Ro(n)} | ${u}`}else i=c.map(Ro).join(" ")}let a=w0(t,e,s);return a&&(i+=" "+a),i}var Yl,y0,yp=E(()=>{"use strict";Yl={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:""}}}},y0={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 wp(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var Ep=E(()=>{"use strict"});var E0,Te,$o,St=E(()=>{"use strict";E0="ACK: waiting for explicit lmctl task.",Te=`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: ${E0}`,$o=`send this exact lmctl seed instruction: "${Te}"`});function Ut(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function T0(t,e){return e===void 0||e.length===0?t:{...t??process.env,[fs]:e}}function He(t,e,r){return T0(Ut(t,e),r)}var fs,ct=E(()=>{"use strict";fs="LMCTL_SELF_SESSIONID"});import{spawn as Tp}from"node:child_process";import{mkdirSync as b0}from"node:fs";var zl,$e,Wt=E(()=>{"use strict";yp();Ep();St();ct();zl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},$e=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===Te?r:n)}seed(e,r){return b0(e,{recursive:!0}),new Promise(n=>{let s;try{s=Tp(this.binary,this.seedArgsFor(r),{cwd:e,env:Ut(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1285
- `: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:$o,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&_p(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 zl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=gp(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=wp(r.env),c=Tp(s,{shell:!0,cwd:r.cwd,env:He(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function jo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Ht(t,r,e)}var Qe,Ie,Bt,Lo,Ht,rn=E(()=>{"use strict";Qe=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},Ie=class extends Qe{},Bt=class extends Qe{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},Lo=class extends Qe{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Ht=class extends Qe{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Ql from"node:child_process";function v0(t){if(typeof Ql.spawnSync=="function")try{Ql.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function bp(t){return t.exitCode!==null||t.signalCode!==null}function Zl(t,e){return bp(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 ut(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??v0;if(bp(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Zl(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 Zl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await Zl(t,S0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var S0,Oo=E(()=>{"use strict";S0=1e3});function Sp(t){fe()&&Oe({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function lr(t,e){let r=I0[t];if(r)return r[e]??r.yolo}function x0(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 dt(t,e,r="yolo"){if(N0.has(t)){Sp(`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"?lr(t,"plan"):k0[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 Ie(s)}if(!x0(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 Ie(o)}Sp(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var k0,I0,N0,nn=E(()=>{"use strict";rn();ve();k0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},I0={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};N0=new Set(["codex","opencode"])});import{spawn as A0}from"node:child_process";import{existsSync as R0}from"node:fs";function L0(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(`
1289
+ `),...Vm(t),...Xm(t)}}function u0(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Gl,We=E(()=>{"use strict";ql();Gm();Ym();Qm();tp();ko();cs();Gl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=c0(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)=>u0("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!==No)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!==ls&&!a.includes(n))return{resumed:!1,reason:np};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),i=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let o of s)this.stmts.deleteMailboxMessage.run(o.id);return s})}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){ip(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,P()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,P());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){ip(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,P());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,P())}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,P());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,P()),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,P(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(P(),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,P());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,P());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,P(),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,P());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",P());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,P());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=P(),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,P(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,P(),e)??null}closeIssue(e,r,n){let s=P(),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,P(),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,P(),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=P();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,P(),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,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=op(),s=P();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=P(),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,P())}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??P(),e.dedupe_key??null,e.concurrency_key??null,P());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=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=P(),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:P();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,P()),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,P()),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??P(),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,P());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=P(),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,P(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(P(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){let r=e.started_at??P(),n=e.holder_host??us(),s=e.last_heartbeat_at??r,o=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Ft(e.command),r,e.holder_pid??null,n,s,Ft(e.meta));return this.getTrackedInvocation(Number(o.lastInsertRowid))}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){let n=r.ended_at??P();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Ft(r.result_summary),Ft(r.error),r.team_chat_log_id??null,Ft(r.meta),n,e).changes!==1?null:this.getTrackedInvocation(e)}reclaimTrackedInvocationIfUnchanged(e,r,n){let s=n.ended_at??P();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Ft(n.result_summary),Ft(n.error),n.team_chat_log_id??null,Ft(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(e)}heartbeatTrackedInvocation(e,r=P()){return this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(e,r,n=P()){return this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1?null:this.getTrackedInvocation(e)}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let o=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${o} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,o=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(o?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){let r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,Jl(e.payload),e.created_at??P(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedMailFromSender(e,r,n,s){return this.stmts.listEnqueuedMailFromSender.all(e,r,n,s)}markMailDelivered(e,r,n){let s=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(s.length===0)return 0;let o=Jl(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let a of s)i+=this.stmts.markMailboxMessageDelivered.run(n,o,a).changes;return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(e,r,n=process.pid,s=us()){let o=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(o.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let i=[];for(let a of o)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&i.push(c)}return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearMailDelivery(e){let r=[...new Set(e.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(e){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1?null:this.getMailboxMessage(e.id)}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!a0(s,e))continue;let o=this.reclaimMailboxDeliveryIfUnchanged(s);o!==null&&n.push(o)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}clearObservedTerminalAgentInflight(e,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(os,as(e,r),is);return n===void 0?null:ep(n.data)}setTerminalLock(e){this.stmts.upsertRuntimeState.run(os,as(e.teamfile,e.alias),is,JSON.stringify(e),e.last_heartbeat)}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getTerminalLock(e,r);if(o===null||o.lock_id!==n)return this.db.exec("COMMIT"),!1;let i={...o,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(os,as(e,r),is,JSON.stringify(i),s),this.db.exec("COMMIT"),!0}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(os,as(e,r),is);return this.db.exec("COMMIT"),o.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:o0(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,o=P()){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i!==null&&!i0(i,s))return this.db.exec("COMMIT"),{acquired:!1,current:i};let a={lock_id:op(),holder_pid:process.pid,holder_host:us(),started_at:o,last_heartbeat:o};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),o),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:i}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o===null||o.lock_id!==s)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),i.changes===1}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,P(),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,P())}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,P());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,P(),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??P(),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,P());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,P()).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,P()),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,P());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(P(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=P();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??P());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,P())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,P())}}});import{realpathSync as d0}from"node:fs";import{resolve as f0}from"node:path";function Kl(t){let e=f0(t);try{return d0(e)}catch{return e}}var lp=E(()=>{"use strict"});import{platform as cp}from"node:os";function bt(t){let e=new ds;for(let r of t)e.registerAdapter(r);return e}var ds,Vl=E(()=>{"use strict";lp();ds=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=Kl(e.workspace);o=o.filter(a=>Kl(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=cp()==="darwin"||cp()==="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 up}from"node:fs";import{createInterface as dp}from"node:readline";import{stat as m0}from"node:fs/promises";import{homedir as p0}from"node:os";async function*Be(t){let e=up(t,{encoding:"utf-8"}),r=dp({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 Me(t,e){let r=[],n=up(t,{encoding:"utf-8"}),s=dp({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Re(t){let e=await m0(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function me(t){return t.replace(/\\n/g,`
1290
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ke,ar=E(()=>{"use strict";ke=p0()});import{readdir as Ao,stat as fp,unlink as h0}from"node:fs/promises";import{join as tn,basename as mp}from"node:path";function _0(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function g0(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return me(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function pp(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Be(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var Ro,hp=E(()=>{"use strict";ar();Ro=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||tn(ke,".claude"),this.projectsDir=tn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Ao(this.projectsDir)}catch{return e}for(let n of r){let s=tn(this.projectsDir,n);if(!(await fp(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Ao(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=mp(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=tn(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Me(e,50),s=await Re(e),o="",i,a,l,c,u,d;for(let m of n)if(!_0(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 pp(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Re(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Be(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:g0(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=G(_.trim(),80)),d=G(_.trim(),80),s.push({role:"user",timestamp:g,content:me(_.trim())})}else if(Array.isArray(_)){for(let S of _)if(S.type==="tool_result"){let w=typeof S.content=="string"?me(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:w,toolCallId:S.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let S of _)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:me(S.text),model:h.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:h.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!o)return null;let p=await pp(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 h0(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Ao(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=tn(this.projectsDir,i);if(!(await fp(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Ao(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=mp(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:tn(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 Me(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function $o(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function w0(t,e,r){if(!r)return"";let n=t.tools[e]??Yl[e],s=n?.profiles?.[r]?.flags??Yl[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 _p(t,e){return!!t.tools[e]}function gp(t,e,r,n,s){let o=t.tools[e]??Yl[e],i;if(o?.agent){let l=$o(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=y0[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($o).join(" ");i=`printf '%s\\n' ${$o(n)} | ${u}`}else i=c.map($o).join(" ")}let a=w0(t,e,s);return a&&(i+=" "+a),i}var Yl,y0,yp=E(()=>{"use strict";Yl={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:""}}}},y0={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 wp(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var Ep=E(()=>{"use strict"});var E0,Te,Lo,St=E(()=>{"use strict";E0="ACK: waiting for explicit lmctl task.",Te=`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: ${E0}`,Lo=`send this exact lmctl seed instruction: "${Te}"`});function Ut(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function T0(t,e){return e===void 0||e.length===0?t:{...t??process.env,[fs]:e}}function He(t,e,r){return T0(Ut(t,e),r)}var fs,ct=E(()=>{"use strict";fs="LMCTL_SELF_SESSIONID"});import{spawn as Tp}from"node:child_process";import{mkdirSync as b0}from"node:fs";var zl,$e,Wt=E(()=>{"use strict";yp();Ep();St();ct();zl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},$e=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===Te?r:n)}seed(e,r){return b0(e,{recursive:!0}),new Promise(n=>{let s;try{s=Tp(this.binary,this.seedArgsFor(r),{cwd:e,env:Ut(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1291
+ `: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:Lo,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&_p(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 zl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=gp(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=wp(r.env),c=Tp(s,{shell:!0,cwd:r.cwd,env:He(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function Oo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Ht(t,r,e)}var Qe,Ie,Bt,jo,Ht,rn=E(()=>{"use strict";Qe=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},Ie=class extends Qe{},Bt=class extends Qe{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},jo=class extends Qe{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Ht=class extends Qe{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Ql from"node:child_process";function v0(t){if(typeof Ql.spawnSync=="function")try{Ql.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function bp(t){return t.exitCode!==null||t.signalCode!==null}function Zl(t,e){return bp(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 ut(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??v0;if(bp(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Zl(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 Zl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await Zl(t,S0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var S0,Co=E(()=>{"use strict";S0=1e3});function Sp(t){fe()&&Oe({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function lr(t,e){let r=I0[t];if(r)return r[e]??r.yolo}function x0(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 dt(t,e,r="yolo"){if(N0.has(t)){Sp(`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"?lr(t,"plan"):k0[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 Ie(s)}if(!x0(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 Ie(o)}Sp(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var k0,I0,N0,nn=E(()=>{"use strict";rn();ve();k0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},I0={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};N0=new Set(["codex","opencode"])});import{spawn as A0}from"node:child_process";import{existsSync as R0}from"node:fs";function L0(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(`
1286
1292
 
1287
1293
  --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
1288
1294
 
@@ -1292,42 +1298,42 @@ ${e}
1292
1298
 
1293
1299
  ${r}`:r}function vp(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||$0[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=lr(s,a)??M0[s]??["--dangerously-skip-permissions"];i.push(...l);try{dt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!R0(e.cwd))return z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new Ie(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=A0(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:He(e.env,e.cwd,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,z({event:"transport_abort",provider:s,phase:"pre_spawn"}),ut(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,z({event:"transport_abort",provider:s}),ut(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=j0({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(`
1294
1300
  `);f=_.pop()||"";for(let S of _)m(S)});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 Ie(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(Tt(`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(C0({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
1295
- `),Tt(`stream-json: prompt sent (${t.length} chars)`)})}var $0,M0,kp=E(()=>{"use strict";rn();Oo();nn();ve();ct();$0={claude:"claude",qwen:"qwen"};M0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function Co(t={}){return[]}var ec=E(()=>{"use strict"});import{spawn as D0}from"node:child_process";import{createInterface as P0}from"node:readline";import{existsSync as F0,readFileSync as U0}from"node:fs";import{fileURLToPath as W0}from"node:url";function B0(t){return t==="plan"?"read-only":"danger-full-access"}function q0(){return{clientInfo:{name:"lmctl",title:"lmctl",version:H0},capabilities:{experimentalApi:!1}}}function cr(t,e){Tt(`[codex:${t}] ${JSON.stringify(e)}`)}function J0(){return{agentItems:new Map,resultText:""}}function Ip(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function X0(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function G0(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 K0(){return{pendingCodexError:null}}function V0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1301
+ `),Tt(`stream-json: prompt sent (${t.length} chars)`)})}var $0,M0,kp=E(()=>{"use strict";rn();Co();nn();ve();ct();$0={claude:"claude",qwen:"qwen"};M0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function Mo(t={}){return[]}var ec=E(()=>{"use strict"});import{spawn as D0}from"node:child_process";import{createInterface as P0}from"node:readline";import{existsSync as F0,readFileSync as U0}from"node:fs";import{fileURLToPath as W0}from"node:url";function B0(t){return t==="plan"?"read-only":"danger-full-access"}function q0(){return{clientInfo:{name:"lmctl",title:"lmctl",version:H0},capabilities:{experimentalApi:!1}}}function cr(t,e){Tt(`[codex:${t}] ${JSON.stringify(e)}`)}function J0(){return{agentItems:new Map,resultText:""}}function Ip(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function X0(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function G0(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 K0(){return{pendingCodexError:null}}function V0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1296
1302
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
1297
1303
  ${e}
1298
1304
 
1299
- ${r}`:r}function Y0(t,e){let r=G0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function z0(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 Np(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead",a=i?Co():[];o.push(...a),fe()&&Ce(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:a.length>0}));let l=e.permissionMode??"yolo",c=B0(l);try{dt("codex",o,l)}catch(W){return n(W)}if(e.cwd&&!F0(e.cwd))return z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new Ie(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=D0(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:He(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ut(u).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:"codex"}),ut(u).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=P0({input:u.stdout}),m=new Map,p=1,h=e.threadId||"",g="",_=!1,S=!1,w=Date.now(),b=J0(),x=K0();function k(W,M={}){return new Promise(($,Z)=>{let J=p++;m.set(J,{resolve:$,reject:Z});let I=JSON.stringify({jsonrpc:"2.0",id:J,method:W,params:M});u.stdin?.write(I+`
1305
+ ${r}`:r}function Y0(t,e){let r=G0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function z0(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 Np(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead",a=i?Mo():[];o.push(...a),fe()&&Ce(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:a.length>0}));let l=e.permissionMode??"yolo",c=B0(l);try{dt("codex",o,l)}catch(W){return n(W)}if(e.cwd&&!F0(e.cwd))return z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new Ie(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=D0(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:He(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ut(u).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:"codex"}),ut(u).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=P0({input:u.stdout}),m=new Map,p=1,h=e.threadId||"",g="",_=!1,S=!1,w=Date.now(),b=J0(),x=K0();function k(W,M={}){return new Promise(($,Z)=>{let J=p++;m.set(J,{resolve:$,reject:Z});let I=JSON.stringify({jsonrpc:"2.0",id:J,method:W,params:M});u.stdin?.write(I+`
1300
1306
  `)})}function j(W,M={}){let $=JSON.stringify({jsonrpc:"2.0",method:W,params:M});u.stdin?.write($+`
1301
- `)}f.on("line",W=>{let M;try{M=JSON.parse(W)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let J=m.get(M.id);if(m.delete(M.id),M.error){let I=M.error,N=typeof I?.message=="string"&&I.message.length>0?I.message:JSON.stringify(M.error);J.reject(jo(`codex app-server error: ${N}`,I))}else J.resolve(M);e.onEvent?.(M);return}let $=M.method;if(!$){e.onEvent?.(M);return}if($==="thread/started"){let I=M.params?.thread;I?.id&&(h=I.id)}let Z=fe()?J=>{cr("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if($==="turn/started"){let J=M.params,I=J?.turn;I?.id&&(g=I.id),Ip(M,b,e.onDelta,Z),fe()&&cr("turn/started",{params:J??null})}if(fe()&&($==="item/started"||$==="item/completed")){let J=M.params;J?.item?.type==="agentMessage"&&cr($,{params:J??null})}if($==="item/started"||$==="item/agentMessage/delta"||$==="item/completed"){if($==="item/agentMessage/delta"){let J=M.params;fe()&&cr("agentMessage/delta",{params:J??null})}Ip(M,b,e.onDelta,Z)}if($==="turn/completed"){let J=M.params;if(fe())for(let[N,O]of b.agentItems.entries())O.buffer&&cr("turn/completed/unflushed-item",{itemId:N,phase:O.phase,bufferLen:O.buffer.length});X0(b),fe()&&cr("turn/completed",{params:J??null});let I=z0(M,x);I.shouldReject?(fe()&&cr("turn/completed/terminal-reject",{message:I.turnError.message}),S=!0,_=!0,u.stdin?.end(),n(I.turnError)):(_=!0,u.stdin?.end())}if($==="error"){let J=Y0(M,x);if(fe()){let I=M.params,N=I?.error,O=typeof N?.message=="string"?N.message:"(no message)";cr(J.willRetry?"error/retry":"error/terminal-deferred",{message:O,willRetry:J.willRetry,params:I??null})}}e.onEvent?.(M)});let V="";u.stderr?.on("data",W=>{V+=W.toString()}),u.on("error",W=>{z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:W.message}),n(new Ie(`Failed to spawn codex app-server: ${W.message}`,{cause:W}))}),u.on("exit",W=>{if(!d&&!S){if(_){r({result:b.resultText,threadId:h,turnId:g,durationMs:Date.now()-w,exitCode:W});return}if(x.pendingCodexError){n(x.pendingCodexError);return}z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:V.slice(0,500)}),n(new Error(V0({exitCode:W,stderr:V})))}}),(async()=>{try{if(await k("initialize",q0()),j("initialized",{}),e.threadId)try{let W=k("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),M=new Promise(($,Z)=>setTimeout(()=>Z(new Error("resume timeout")),5e3));await Promise.race([W,M]),h=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1302
- `);let M=(await k("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;M?.id&&(h=M.id)}else{let M=(await k("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;M?.id&&(h=M.id)}await k("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(W){ut(u).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var H0,xp=E(()=>{"use strict";ve();ve();rn();Oo();nn();ec();ve();ct();H0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(U0(W0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as $p,mkdirSync as Z0,readFileSync as Lp,writeFileSync as Ap}from"node:fs";import{join as ms,resolve as Q0}from"node:path";function jp(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 tc(t,e,r={existsSync:$p,readFileSync:Lp}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=Q0(e,s.sessiondir??e);for(let i of eN(o)){let a=tN(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(jp(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 eN(t){return[ms(t,".opencode","opencode.jsonc"),ms(t,"opencode.jsonc"),ms(t,"opencode.json")]}function tN(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(rN(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function rN(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]!==`
1303
- `;)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 Mo(t,e={}){let r=ms(t,".opencode"),n=ms(r,"opencode.json");if(!$p(n)){Z0(r,{recursive:!0});let i=JSON.stringify({permission:"allow"},null,2);return Ap(n,i+`
1307
+ `)}f.on("line",W=>{let M;try{M=JSON.parse(W)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let J=m.get(M.id);if(m.delete(M.id),M.error){let I=M.error,N=typeof I?.message=="string"&&I.message.length>0?I.message:JSON.stringify(M.error);J.reject(Oo(`codex app-server error: ${N}`,I))}else J.resolve(M);e.onEvent?.(M);return}let $=M.method;if(!$){e.onEvent?.(M);return}if($==="thread/started"){let I=M.params?.thread;I?.id&&(h=I.id)}let Z=fe()?J=>{cr("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if($==="turn/started"){let J=M.params,I=J?.turn;I?.id&&(g=I.id),Ip(M,b,e.onDelta,Z),fe()&&cr("turn/started",{params:J??null})}if(fe()&&($==="item/started"||$==="item/completed")){let J=M.params;J?.item?.type==="agentMessage"&&cr($,{params:J??null})}if($==="item/started"||$==="item/agentMessage/delta"||$==="item/completed"){if($==="item/agentMessage/delta"){let J=M.params;fe()&&cr("agentMessage/delta",{params:J??null})}Ip(M,b,e.onDelta,Z)}if($==="turn/completed"){let J=M.params;if(fe())for(let[N,O]of b.agentItems.entries())O.buffer&&cr("turn/completed/unflushed-item",{itemId:N,phase:O.phase,bufferLen:O.buffer.length});X0(b),fe()&&cr("turn/completed",{params:J??null});let I=z0(M,x);I.shouldReject?(fe()&&cr("turn/completed/terminal-reject",{message:I.turnError.message}),S=!0,_=!0,u.stdin?.end(),n(I.turnError)):(_=!0,u.stdin?.end())}if($==="error"){let J=Y0(M,x);if(fe()){let I=M.params,N=I?.error,O=typeof N?.message=="string"?N.message:"(no message)";cr(J.willRetry?"error/retry":"error/terminal-deferred",{message:O,willRetry:J.willRetry,params:I??null})}}e.onEvent?.(M)});let V="";u.stderr?.on("data",W=>{V+=W.toString()}),u.on("error",W=>{z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:W.message}),n(new Ie(`Failed to spawn codex app-server: ${W.message}`,{cause:W}))}),u.on("exit",W=>{if(!d&&!S){if(_){r({result:b.resultText,threadId:h,turnId:g,durationMs:Date.now()-w,exitCode:W});return}if(x.pendingCodexError){n(x.pendingCodexError);return}z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:V.slice(0,500)}),n(new Error(V0({exitCode:W,stderr:V})))}}),(async()=>{try{if(await k("initialize",q0()),j("initialized",{}),e.threadId)try{let W=k("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),M=new Promise(($,Z)=>setTimeout(()=>Z(new Error("resume timeout")),5e3));await Promise.race([W,M]),h=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1308
+ `);let M=(await k("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;M?.id&&(h=M.id)}else{let M=(await k("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;M?.id&&(h=M.id)}await k("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(W){ut(u).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var H0,xp=E(()=>{"use strict";ve();ve();rn();Co();nn();ec();ve();ct();H0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(U0(W0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as $p,mkdirSync as Z0,readFileSync as Lp,writeFileSync as Ap}from"node:fs";import{join as ms,resolve as Q0}from"node:path";function jp(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 tc(t,e,r={existsSync:$p,readFileSync:Lp}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=Q0(e,s.sessiondir??e);for(let i of eN(o)){let a=tN(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(jp(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 eN(t){return[ms(t,".opencode","opencode.jsonc"),ms(t,"opencode.jsonc"),ms(t,"opencode.json")]}function tN(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(rN(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function rN(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]!==`
1309
+ `;)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 Do(t,e={}){let r=ms(t,".opencode"),n=ms(r,"opencode.json");if(!$p(n)){Z0(r,{recursive:!0});let i=JSON.stringify({permission:"allow"},null,2);return Ap(n,i+`
1304
1310
  `,"utf-8"),!0}let s;try{s=JSON.parse(Lp(n,"utf-8"))}catch{return console.log(Rp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Rp.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;return s.permission===void 0&&(s.permission="allow",o=!0),jp(s.permission)||z({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),o&&Ap(n,JSON.stringify(s,null,2)+`
1305
- `,"utf-8"),o}var Rp,Do=E(()=>{"use strict";ve();Rp={yellow:t=>t}});import{spawn as nN}from"node:child_process";import{existsSync as sN}from"node:fs";import{createInterface as oN}from"node:readline";function iN(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
1311
+ `,"utf-8"),o}var Rp,Po=E(()=>{"use strict";ve();Rp={yellow:t=>t}});import{spawn as nN}from"node:child_process";import{existsSync as sN}from"node:fs";import{createInterface as oN}from"node:readline";function iN(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
1306
1312
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
1307
1313
  ${e}
1308
1314
 
1309
- ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Op(t.slice(n).trimStart())}return Op(hN(t.replace(uN,"")))}function hN(t){let e=dN.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(fN)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Op(t){let e=[...t.matchAll(mN)];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 Mp(t,e){let r=aN[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{Mo(e.cwd)}catch(k){z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:k instanceof Error?k.message:String(k)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let k=lr("gemini","plan"),j=lr("gemini","yolo");a=a.filter(V=>!(j??[]).includes(V)),k&&a.push(...k)}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.
1315
+ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Op(t.slice(n).trimStart())}return Op(hN(t.replace(uN,"")))}function hN(t){let e=dN.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(fN)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Op(t){let e=[...t.matchAll(mN)];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 Mp(t,e){let r=aN[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{Do(e.cwd)}catch(k){z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:k instanceof Error?k.message:String(k)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let k=lr("gemini","plan"),j=lr("gemini","yolo");a=a.filter(V=>!(j??[]).includes(V)),k&&a.push(...k)}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.
1310
1316
  `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{dt(e.tool,a,l)}catch(k){return s(k)}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.
1311
1317
  `),e.cwd&&!sN(e.cwd))return z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new Ie(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=nN(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:He(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),ut(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),ut(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=oN({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1,S=!1;function w(k,j={}){return new Promise((V,W)=>{let M=lN++;m.set(M,{resolve:V,reject:W});let $=JSON.stringify({jsonrpc:"2.0",id:M,method:k,params:j});Oe({event:"acp_send",direction:"SEND",provider:e.tool,method:k,id:M,params:j}),c.stdin?.write($+`
1312
- `)})}f.on("line",k=>{let j;try{j=JSON.parse(k)}catch{return}if(Oe({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof j.id=="number"?j.id:void 0,method:typeof j.method=="string"?j.method:void 0,preview:JSON.stringify(j).slice(0,300)}),e.onEvent?.(j),typeof j.id=="number"&&m.has(j.id)){let W=m.get(j.id);if(m.delete(j.id),j.error){let M=j.error,$=typeof M?.message=="string"&&M.message.length>0?M.message:JSON.stringify(j.error);W.reject(jo(`ACP RPC error: ${$}`,M))}else W.resolve(j);return}let V=j.method;if(V){if(typeof j.id=="number"){z({event:"acp_unhandled_request",provider:e.tool,method:V,id:j.id,params:j.params});let W=JSON.stringify({jsonrpc:"2.0",id:j.id,error:{code:-32601,message:`Method not found: ${V} (lmctl does not implement server-side ACP methods)`}});Oe({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:j.id,error:"method not found"}),c.stdin?.write(W+`
1318
+ `)})}f.on("line",k=>{let j;try{j=JSON.parse(k)}catch{return}if(Oe({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof j.id=="number"?j.id:void 0,method:typeof j.method=="string"?j.method:void 0,preview:JSON.stringify(j).slice(0,300)}),e.onEvent?.(j),typeof j.id=="number"&&m.has(j.id)){let W=m.get(j.id);if(m.delete(j.id),j.error){let M=j.error,$=typeof M?.message=="string"&&M.message.length>0?M.message:JSON.stringify(j.error);W.reject(Oo(`ACP RPC error: ${$}`,M))}else W.resolve(j);return}let V=j.method;if(V){if(typeof j.id=="number"){z({event:"acp_unhandled_request",provider:e.tool,method:V,id:j.id,params:j.params});let W=JSON.stringify({jsonrpc:"2.0",id:j.id,error:{code:-32601,message:`Method not found: ${V} (lmctl does not implement server-side ACP methods)`}});Oe({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:j.id,error:"method not found"}),c.stdin?.write(W+`
1313
1319
  `);return}if(V==="session/update"){let M=j.params?.update;if(M?.sessionUpdate==="agent_message_chunk"){let Z=M.content?.text||"";Z&&S&&(h+=Z,e.onDelta?.(Z))}}}});let b="";c.stderr?.on("data",k=>{b+=k.toString()}),c.on("error",k=>{z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:k.message,elapsed_ms:Date.now()-u}),s(new Ie(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${k.message}`,{cause:k}))}),c.on("exit",k=>{d||(_?n({result:e.tool==="gemini"?pN(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:k}):(z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:k,stderr_tail:b.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(iN({tool:e.tool,exitCode:k,stderr:b})))))});function x(k,j={}){let V=JSON.stringify({jsonrpc:"2.0",method:k,params:j});c.stdin?.write(V+`
1314
1320
  `)}(async()=>{try{if(await w("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),x("notifications/initialized"),e.sessionId)try{p=(await w("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(j){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${j instanceof Error?j.message:String(j)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1315
1321
  `),p=(await w("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await w("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await w("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),Tt(`acp: set_config_option(model=${e.model}) ok`)}catch(j){let V=j instanceof Error?j.message:String(j);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${V}
1316
1322
  `)}if(e.effort&&e.tool==="opencode")try{await w("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),Tt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(j){let V=j instanceof Error?j.message:String(j);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${V}
1317
- `)}h="",S=!0,Tt(`acp: prompt sent (${t.length} chars)`),g=(await w("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,Tt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(k){ut(c).catch(()=>{}),s(k instanceof Error?k:new Error(String(k)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var aN,lN,Cp,cN,uN,dN,fN,mN,Dp=E(()=>{"use strict";ve();rn();Oo();nn();Do();ve();ct();aN={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},lN=1,Cp="(?:png|jpe?g|webp|heic|pdf)",cN=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Cp}\\s*`,"gi"),uN=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Cp}\\s*`,"i"),dN=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,fN=/^STANCE:\s+\S+\s*$/gim,mN=/\[Thought:\s*true\]\s*/gi});function ye(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Pp(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=_N){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 gN(){let t=new Map;return(e,r)=>{yN(e,Pp(t,r))}}function yN(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(ye(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(ye(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:ye(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=ye(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:ye(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:ye(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
1323
+ `)}h="",S=!0,Tt(`acp: prompt sent (${t.length} chars)`),g=(await w("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,Tt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(k){ut(c).catch(()=>{}),s(k instanceof Error?k:new Error(String(k)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var aN,lN,Cp,cN,uN,dN,fN,mN,Dp=E(()=>{"use strict";ve();rn();Co();nn();Po();ve();ct();aN={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},lN=1,Cp="(?:png|jpe?g|webp|heic|pdf)",cN=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Cp}\\s*`,"gi"),uN=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Cp}\\s*`,"i"),dN=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,fN=/^STANCE:\s+\S+\s*$/gim,mN=/\[Thought:\s*true\]\s*/gi});function ye(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Pp(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=_N){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 gN(){let t=new Map;return(e,r)=>{yN(e,Pp(t,r))}}function yN(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(ye(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(ye(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:ye(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=ye(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:ye(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:ye(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
1318
1324
  `).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(`
1319
- `).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 Po(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?gN():void 0,s=await vp(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function wN(){let t=new Map;return(e,r)=>{EN(e,Pp(t,r))}}function EN(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:ye(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:ye(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=ye(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:ye(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${ye(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function sn(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Oe({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?wN():void 0,s=await Mp(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 TN(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${ye(i,120)}`}:{kind:"other",summary:`codex error: ${ye(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:ye(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:ye(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:ye(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:ye(s)}:{kind:"text",summary:ye(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:ye(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
1325
+ `).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?gN():void 0,s=await vp(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function wN(){let t=new Map;return(e,r)=>{EN(e,Pp(t,r))}}function EN(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:ye(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:ye(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=ye(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:ye(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${ye(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function sn(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Oe({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?wN():void 0,s=await Mp(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 TN(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${ye(i,120)}`}:{kind:"other",summary:`codex error: ${ye(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:ye(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:ye(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:ye(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:ye(s)}:{kind:"text",summary:ye(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:ye(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
1320
1326
  `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${ye(i,60)}`:ye(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let o=s.split(`
1321
- `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${ye(i,60)}`:ye(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Fp(t,e){let r=await Np(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=>TN(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var _N,Lr=E(()=>{"use strict";kp();xp();Dp();ve();_N=256});function nc(t){return new rc(t)}var rc,sc=E(()=>{"use strict";hp();Wt();Lr();St();rc=class extends $e{constructor(e){super({provider:new Ao(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Te,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Po})}}});import{readdir as bN,stat as Up,unlink as SN}from"node:fs/promises";import{join as ps,basename as vN}from"node:path";function kN(t,e,r){return`${t}|${e.toISOString()}|${r}`}function hs(t,e,r){let n=kN(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Wp(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function IN(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(`
1322
- `);try{return JSON.stringify(t)}catch{return String(t)}}async function Bp(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Be(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=IN(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 Uo,Hp=E(()=>{"use strict";ar();Uo=class{name="codex";codexDirs;constructor(e={}){let r=[ps(ke,".codex"),ps(ke,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:ps(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=ps(r,"sessions");try{await Up(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 bN(e)}catch{return r}for(let s of n){let o=ps(e,s),i=await Up(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=vN(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 Me(e,30),n=await Re(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=G(h.text.trim(),80)),u=G(h.text.trim(),80))}}if(!o)return null;let m=await Bp(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:Wp(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Re(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Be(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Wp(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let S of _.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let w=S.text.trim();c||(c=G(w,80)),u=G(w,80),hs(s,m,{role:"user",timestamp:g,content:me(w)})}continue}if(_.role==="assistant"&&_.content){for(let S of _.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&hs(s,m,{role:"assistant",timestamp:g,content:me(S.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let S of _.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&hs(s,m,{role:"system",timestamp:g,content:me(S.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?me(Fo(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:me(Fo(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let S=_.summary.map(w=>Fo(w.text)).join(`
1323
- `);S.trim()&&hs(s,m,{role:"thinking",timestamp:g,content:me(S)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&hs(s,m,{role:"thinking",timestamp:g,content:me(_)})}}if(!o)return null;let p=await Bp(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await SN(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 Me(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 ic(t){return new oc(t)}var oc,ac=E(()=>{"use strict";Hp();Wt();Lr();St();oc=class extends $e{constructor(e){super({provider:new Uo(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:`${Te}
1324
- `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Fp})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function _s(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 Wo(t){let e=_s(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(`
1327
+ `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${ye(i,60)}`:ye(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Fp(t,e){let r=await Np(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=>TN(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var _N,Lr=E(()=>{"use strict";kp();xp();Dp();ve();_N=256});function nc(t){return new rc(t)}var rc,sc=E(()=>{"use strict";hp();Wt();Lr();St();rc=class extends $e{constructor(e){super({provider:new Ro(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Te,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Fo})}}});import{readdir as bN,stat as Up,unlink as SN}from"node:fs/promises";import{join as ps,basename as vN}from"node:path";function kN(t,e,r){return`${t}|${e.toISOString()}|${r}`}function hs(t,e,r){let n=kN(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Wp(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function IN(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 Uo(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 Uo(r)}).filter(r=>r.length>0).join(`
1328
+ `);try{return JSON.stringify(t)}catch{return String(t)}}async function Bp(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Be(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=IN(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 Wo,Hp=E(()=>{"use strict";ar();Wo=class{name="codex";codexDirs;constructor(e={}){let r=[ps(ke,".codex"),ps(ke,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:ps(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=ps(r,"sessions");try{await Up(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 bN(e)}catch{return r}for(let s of n){let o=ps(e,s),i=await Up(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=vN(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 Me(e,30),n=await Re(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=G(h.text.trim(),80)),u=G(h.text.trim(),80))}}if(!o)return null;let m=await Bp(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:Wp(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Re(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Be(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Wp(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let S of _.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let w=S.text.trim();c||(c=G(w,80)),u=G(w,80),hs(s,m,{role:"user",timestamp:g,content:me(w)})}continue}if(_.role==="assistant"&&_.content){for(let S of _.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&hs(s,m,{role:"assistant",timestamp:g,content:me(S.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let S of _.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&hs(s,m,{role:"system",timestamp:g,content:me(S.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?me(Uo(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:me(Uo(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let S=_.summary.map(w=>Uo(w.text)).join(`
1329
+ `);S.trim()&&hs(s,m,{role:"thinking",timestamp:g,content:me(S)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&hs(s,m,{role:"thinking",timestamp:g,content:me(_)})}}if(!o)return null;let p=await Bp(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await SN(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 Me(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 ic(t){return new oc(t)}var oc,ac=E(()=>{"use strict";Hp();Wt();Lr();St();oc=class extends $e{constructor(e){super({provider:new Wo(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:`${Te}
1330
+ `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Fp})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function _s(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 Bo(t){let e=_s(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(`
1325
1331
  `).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?NN(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 NN(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&qp(t.tokens)&&qp(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function qp(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Jp(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(`
1326
1332
  `)+`
1327
- `}var lc=E(()=>{"use strict"});import{createHash as xN}from"node:crypto";import{readdir as gs,readFile as Xp,stat as Bo,unlink as AN}from"node:fs/promises";import{join as Ve,basename as RN,dirname as $N}from"node:path";import{cwd as LN}from"node:process";function Gp(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Kp(t){return t==="user"}function cc(t){return t==="gemini"||t==="assistant"}function jr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function jN(t){return`${t.sessionId}\0${t.cwd}`}function ON(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 Ho(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Vp(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!cc(a.type)||!a.tokens)continue;let l=Ho(a.tokens.input),c=Ho(a.tokens.cached),u=Math.max(l-c,0),d=Ho(a.tokens.output),f=Ho(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 CN(t){return xN("sha256").update(t).digest("hex")}function ys(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=$N(r);if(n===r)break;r=n}}var qo,Yp=E(()=>{"use strict";ar();lc();ve();qo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Ve(ke,".gemini");this.geminiProjectsFile=Ve(r,"projects.json"),this.geminiTmpDir=Ve(r,"tmp");let n=e.claudeDir||Ve(ke,".claude");this.claudeProjectsDir=Ve(n,"projects");let s=[Ve(ke,".codex"),Ve(ke,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>Ve(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=jN(s),i=r.get(o);r.set(o,i?ON(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Re(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=jr(g.timestamp),S=g.type,w=me(Gp(g.content));if(Kp(S)){let x=w.trim();x&&(u||(u=G(x,80)),d=G(x,80)),o.push({role:"user",timestamp:_,content:x||w});continue}if(cc(S)){g.model&&(f=g.model);for(let x of g.thoughts||[]){let k=[x.subject,x.description].filter(Boolean).join(`
1328
- `).trim();k&&o.push({role:"thinking",timestamp:jr(x.timestamp,_),content:me(k)})}o.push({role:"assistant",timestamp:_,content:w,model:g.model});continue}let b=S?`[${S}] `:"";o.push({role:"system",timestamp:_,content:`${b}${w}`.trim()})}let m=jr(n.startTime,s.createdAt),p=jr(n.lastUpdated,s.modifiedAt),h=Vp(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Re(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(Kp(m.type)){d++;let p=Gp(m.content).trim();p&&(l||(l=G(me(p),80)),c=G(me(p),80))}else cc(m.type)&&(d++,m.model&&(u=m.model));let f=Vp(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:jr(r.startTime,n.createdAt),modifiedAt:jr(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 Xp(e,"utf-8");if(_s(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 Wo(r)}catch{return null}}extractSessionIdFromFilename(e){let r=RN(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 gs(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Ve(this.geminiTmpDir,n,"chats");if(!(await Bo(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await gs(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ve(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await AN(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await Re(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:jr(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;ys(e,LN());for(let n of this.extraWorkspacePaths)ys(e,n);for(let n of await this.collectGeminiProjectPaths())ys(e,n);for(let n of await this.collectCodexCwds())ys(e,n);for(let n of await this.collectClaudeCwds())ys(e,n);let r=new Map;for(let n of e)r.set(CN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Xp(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 Me(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await gs(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ve(this.claudeProjectsDir,n);if(!(await Bo(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await gs(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ve(s,a),u=(await Me(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Bo(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await gs(e)}catch{return r}for(let o of s){let i=Ve(e,o),a=await Bo(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 MN,writeFileSync as DN,mkdirSync as PN}from"node:fs";import{join as FN,dirname as UN}from"node:path";import{randomUUID as WN}from"node:crypto";function dc(t){return new uc(t)}var uc,fc=E(()=>{"use strict";Yp();Wt();Lr();St();lc();uc=class extends $e{constructor(e){super({provider:new qo(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",Te,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>sn(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(`
1329
- `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:$o,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=MN(n,"utf-8"),o=_s(s),i=Wo(s),a=WN();i.sessionId=a,i.kind="main";let l=UN(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=FN(l,d);return PN(l,{recursive:!0}),DN(f,Jp(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 zp,readFile as BN,rm as HN,stat as on}from"node:fs/promises";import{basename as qN,join as ft}from"node:path";function JN(t){let e={};for(let r of t.split(`
1330
- `)){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 Or(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function XN(t){let e=0;for await(let r of Be(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Jo,Zp=E(()=>{"use strict";ar();Jo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||ft(ke,".copilot");this.sessionStateDir=ft(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await zp(this.sessionStateDir)}catch{return e}for(let n of r){let s=ft(this.sessionStateDir,n);if((await on(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=ft(r,"events.jsonl"),o=await on(s).catch(()=>null),i=o?s:ft(r,"workspace.yaml"),a=await Re(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||qN(r)||e;if(o)for await(let _ of Be(s)){let S=Or(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=Or(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let w=_.data.content||"",b=w.trim();b&&(m||(m=G(b,80)),p=G(b,80)),l.push({role:"user",timestamp:S,content:me(b||w)});continue}if(_.type==="assistant.message"&&_.data){let w=(_.data.content||"").trim();if(w&&l.push({role:"assistant",timestamp:S,content:me(w),model:u}),_.data.toolRequests)for(let b of _.data.toolRequests)l.push({role:"tool_use",timestamp:S,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments?JSON.stringify(b.arguments,null,2):void 0,toolCallId:b.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let w=_.data.result?.content||"",b=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:me(w),toolDetailedContent:b?me(b):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:S,content:me(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let w=_.data?.message||"";w.trim()&&l.push({role:"system",timestamp:S,content:me(w)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Or(n?.created_at)??a.createdAt,modifiedAt:Or(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=ft(e,"events.jsonl"),o=await on(s).catch(()=>null),i=o?s:ft(e,"workspace.yaml"),a=await Re(o?s:e),l=o?await Me(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=Or(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let S=(_.data.content||"").trim();S&&(p||(p=G(S,80)),h=G(S,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=o?await XN(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Or(n?.created_at)??a.createdAt,modifiedAt:Or(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=ft(e,"workspace.yaml");try{let n=await BN(r,"utf-8");return JN(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await HN(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await zp(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=ft(this.sessionStateDir,e);if((await on(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=ft(this.sessionStateDir,s);(await on(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=ft(this.sessionStateDir,s);if(!(await on(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 mc(t){return new $e({provider:new Jo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Te,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>sn(e,{...r,acpTool:"copilot"})})}var pc=E(()=>{"use strict";Zp();Wt();Lr();St()});import{existsSync as Qp,readdirSync as GN,statSync as eh}from"node:fs";import{join as ur}from"node:path";import{createRequire as KN}from"node:module";function th(){return hc===null&&(hc=KN(import.meta.url)("node:sqlite").DatabaseSync),hc}function VN(){let t=process.env.XDG_DATA_HOME||ur(ke,".local","share"),e=process.env.XDG_CONFIG_HOME||ur(ke,".config");return[ur(t,"opencode","opencode.db"),ur(e,"opencode","opencode.db")]}function YN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||ur(ke,".local","share"),e=ur(t,"lmplayer"),r=ur(e,"opencode-local.db"),n=[r];try{let s=GN(e).filter(o=>/^opencode.*\.db$/u.test(o)).map(o=>ur(e,o)).filter(o=>o!==r).sort((o,i)=>{try{return eh(i).mtimeMs-eh(o).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function zN(t){return t==="lmplayer"?YN():VN()}var hc,an,_c=E(()=>{"use strict";ar();hc=null;an=class{name;startCommand;dbPaths;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=zN(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Qp(e))}openDb(e){return Qp(e)?new(th())(e,{open:!0,readOnly:!0}):null}async discoverSessions(){let e=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,o=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of o)s.set(a.id,a);let i=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1333
+ `}var lc=E(()=>{"use strict"});import{createHash as xN}from"node:crypto";import{readdir as gs,readFile as Xp,stat as Ho,unlink as AN}from"node:fs/promises";import{join as Ve,basename as RN,dirname as $N}from"node:path";import{cwd as LN}from"node:process";function Gp(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Kp(t){return t==="user"}function cc(t){return t==="gemini"||t==="assistant"}function jr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function jN(t){return`${t.sessionId}\0${t.cwd}`}function ON(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 qo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Vp(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!cc(a.type)||!a.tokens)continue;let l=qo(a.tokens.input),c=qo(a.tokens.cached),u=Math.max(l-c,0),d=qo(a.tokens.output),f=qo(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 CN(t){return xN("sha256").update(t).digest("hex")}function ys(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=$N(r);if(n===r)break;r=n}}var Jo,Yp=E(()=>{"use strict";ar();lc();ve();Jo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Ve(ke,".gemini");this.geminiProjectsFile=Ve(r,"projects.json"),this.geminiTmpDir=Ve(r,"tmp");let n=e.claudeDir||Ve(ke,".claude");this.claudeProjectsDir=Ve(n,"projects");let s=[Ve(ke,".codex"),Ve(ke,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>Ve(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=jN(s),i=r.get(o);r.set(o,i?ON(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Re(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=jr(g.timestamp),S=g.type,w=me(Gp(g.content));if(Kp(S)){let x=w.trim();x&&(u||(u=G(x,80)),d=G(x,80)),o.push({role:"user",timestamp:_,content:x||w});continue}if(cc(S)){g.model&&(f=g.model);for(let x of g.thoughts||[]){let k=[x.subject,x.description].filter(Boolean).join(`
1334
+ `).trim();k&&o.push({role:"thinking",timestamp:jr(x.timestamp,_),content:me(k)})}o.push({role:"assistant",timestamp:_,content:w,model:g.model});continue}let b=S?`[${S}] `:"";o.push({role:"system",timestamp:_,content:`${b}${w}`.trim()})}let m=jr(n.startTime,s.createdAt),p=jr(n.lastUpdated,s.modifiedAt),h=Vp(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Re(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(Kp(m.type)){d++;let p=Gp(m.content).trim();p&&(l||(l=G(me(p),80)),c=G(me(p),80))}else cc(m.type)&&(d++,m.model&&(u=m.model));let f=Vp(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:jr(r.startTime,n.createdAt),modifiedAt:jr(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 Xp(e,"utf-8");if(_s(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 Bo(r)}catch{return null}}extractSessionIdFromFilename(e){let r=RN(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 gs(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Ve(this.geminiTmpDir,n,"chats");if(!(await Ho(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await gs(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ve(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await AN(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await Re(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:jr(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;ys(e,LN());for(let n of this.extraWorkspacePaths)ys(e,n);for(let n of await this.collectGeminiProjectPaths())ys(e,n);for(let n of await this.collectCodexCwds())ys(e,n);for(let n of await this.collectClaudeCwds())ys(e,n);let r=new Map;for(let n of e)r.set(CN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Xp(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 Me(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await gs(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ve(this.claudeProjectsDir,n);if(!(await Ho(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await gs(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ve(s,a),u=(await Me(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 gs(e)}catch{return r}for(let o of s){let i=Ve(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 MN,writeFileSync as DN,mkdirSync as PN}from"node:fs";import{join as FN,dirname as UN}from"node:path";import{randomUUID as WN}from"node:crypto";function dc(t){return new uc(t)}var uc,fc=E(()=>{"use strict";Yp();Wt();Lr();St();lc();uc=class extends $e{constructor(e){super({provider:new Jo(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",Te,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>sn(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(`
1335
+ `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Lo,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=MN(n,"utf-8"),o=_s(s),i=Bo(s),a=WN();i.sessionId=a,i.kind="main";let l=UN(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=FN(l,d);return PN(l,{recursive:!0}),DN(f,Jp(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 zp,readFile as BN,rm as HN,stat as on}from"node:fs/promises";import{basename as qN,join as ft}from"node:path";function JN(t){let e={};for(let r of t.split(`
1336
+ `)){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 Or(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function XN(t){let e=0;for await(let r of Be(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Xo,Zp=E(()=>{"use strict";ar();Xo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||ft(ke,".copilot");this.sessionStateDir=ft(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await zp(this.sessionStateDir)}catch{return e}for(let n of r){let s=ft(this.sessionStateDir,n);if((await on(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=ft(r,"events.jsonl"),o=await on(s).catch(()=>null),i=o?s:ft(r,"workspace.yaml"),a=await Re(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||qN(r)||e;if(o)for await(let _ of Be(s)){let S=Or(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=Or(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let w=_.data.content||"",b=w.trim();b&&(m||(m=G(b,80)),p=G(b,80)),l.push({role:"user",timestamp:S,content:me(b||w)});continue}if(_.type==="assistant.message"&&_.data){let w=(_.data.content||"").trim();if(w&&l.push({role:"assistant",timestamp:S,content:me(w),model:u}),_.data.toolRequests)for(let b of _.data.toolRequests)l.push({role:"tool_use",timestamp:S,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments?JSON.stringify(b.arguments,null,2):void 0,toolCallId:b.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let w=_.data.result?.content||"",b=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:me(w),toolDetailedContent:b?me(b):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:S,content:me(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let w=_.data?.message||"";w.trim()&&l.push({role:"system",timestamp:S,content:me(w)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Or(n?.created_at)??a.createdAt,modifiedAt:Or(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=ft(e,"events.jsonl"),o=await on(s).catch(()=>null),i=o?s:ft(e,"workspace.yaml"),a=await Re(o?s:e),l=o?await Me(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=Or(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let S=(_.data.content||"").trim();S&&(p||(p=G(S,80)),h=G(S,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=o?await XN(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Or(n?.created_at)??a.createdAt,modifiedAt:Or(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=ft(e,"workspace.yaml");try{let n=await BN(r,"utf-8");return JN(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await HN(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await zp(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=ft(this.sessionStateDir,e);if((await on(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=ft(this.sessionStateDir,s);(await on(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=ft(this.sessionStateDir,s);if(!(await on(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 mc(t){return new $e({provider:new Xo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Te,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>sn(e,{...r,acpTool:"copilot"})})}var pc=E(()=>{"use strict";Zp();Wt();Lr();St()});import{existsSync as Qp,readdirSync as GN,statSync as eh}from"node:fs";import{join as ur}from"node:path";import{createRequire as KN}from"node:module";function th(){return hc===null&&(hc=KN(import.meta.url)("node:sqlite").DatabaseSync),hc}function VN(){let t=process.env.XDG_DATA_HOME||ur(ke,".local","share"),e=process.env.XDG_CONFIG_HOME||ur(ke,".config");return[ur(t,"opencode","opencode.db"),ur(e,"opencode","opencode.db")]}function YN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||ur(ke,".local","share"),e=ur(t,"lmplayer"),r=ur(e,"opencode-local.db"),n=[r];try{let s=GN(e).filter(o=>/^opencode.*\.db$/u.test(o)).map(o=>ur(e,o)).filter(o=>o!==r).sort((o,i)=>{try{return eh(i).mtimeMs-eh(o).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function zN(t){return t==="lmplayer"?YN():VN()}var hc,an,_c=E(()=>{"use strict";ar();hc=null;an=class{name;startCommand;dbPaths;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=zN(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Qp(e))}openDb(e){return Qp(e)?new(th())(e,{open:!0,readOnly:!0}):null}async discoverSessions(){let e=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,o=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of o)s.set(a.id,a);let i=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1331
1337
  s.time_created, s.time_updated
1332
1338
  FROM session s
1333
1339
  ORDER BY s.time_updated DESC`).all();for(let a of i){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",u=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
@@ -1340,11 +1346,11 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1340
1346
  FROM session s
1341
1347
  WHERE s.id LIKE ?
1342
1348
  ORDER BY s.time_updated DESC
1343
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function yc(){return new gc}var gc,wc=E(()=>{"use strict";_c();Wt();Lr();St();gc=class extends $e{constructor(){super({provider:new an,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",Te],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>sn(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??Te),r}}});import{spawn as ZN}from"node:child_process";import{mkdirSync as QN}from"node:fs";function Tc(t){return new Ec(t)}async function ex(t,e){let r=Date.now(),n=rh({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});dt("lmplayer",n,e.permissionMode??"yolo");let s=await nh(e.binary,n,{cwd:e.cwd,env:He(e.env,e.cwd,e.sessionId),signal:e.signal,onText:o=>{e.onProgress?.({kind:"text",summary:o.slice(0,120)}),e.onDelta?.(o)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function rh(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...lr("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function nh(t,e,r){return new Promise((n,s)=>{let o;try{o=ZN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let i="",a="",l="",c,u,d=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,o.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},h=g=>{let _=g.trim();if(!_)return;let S;try{S=JSON.parse(_)}catch{d.push(g),r.onText?.(g);return}if(!Go(S))return;let w=Xo(S,!1);c===void 0&&w!==void 0&&(c=w),u=Xo(S,!0)??u;let b=sh(S);b&&(d.push(b),r.onText?.(b))};o.stdout?.on("data",g=>{let _=g.toString("utf8");i+=_,l+=_;let S=l.indexOf(`
1349
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function yc(){return new gc}var gc,wc=E(()=>{"use strict";_c();Wt();Lr();St();gc=class extends $e{constructor(){super({provider:new an,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",Te],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>sn(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??Te),r}}});import{spawn as ZN}from"node:child_process";import{mkdirSync as QN}from"node:fs";function Tc(t){return new Ec(t)}async function ex(t,e){let r=Date.now(),n=rh({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});dt("lmplayer",n,e.permissionMode??"yolo");let s=await nh(e.binary,n,{cwd:e.cwd,env:He(e.env,e.cwd,e.sessionId),signal:e.signal,onText:o=>{e.onProgress?.({kind:"text",summary:o.slice(0,120)}),e.onDelta?.(o)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function rh(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...lr("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function nh(t,e,r){return new Promise((n,s)=>{let o;try{o=ZN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let i="",a="",l="",c,u,d=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,o.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},h=g=>{let _=g.trim();if(!_)return;let S;try{S=JSON.parse(_)}catch{d.push(g),r.onText?.(g);return}if(!Ko(S))return;let w=Go(S,!1);c===void 0&&w!==void 0&&(c=w),u=Go(S,!0)??u;let b=sh(S);b&&(d.push(b),r.onText?.(b))};o.stdout?.on("data",g=>{let _=g.toString("utf8");i+=_,l+=_;let S=l.indexOf(`
1344
1350
  `);for(;S>=0;){let w=l.slice(0,S);l=l.slice(S+1),h(w),S=l.indexOf(`
1345
- `)}}),o.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?o.kill():r.signal.addEventListener("abort",()=>o.kill(),{once:!0})),o.on("exit",g=>{f||(f=!0,p(),l.length>0&&h(l),n({code:g,stdout:i,stderr:a,sessionId:c??u,text:d.join("")}))}),o.on("error",g=>{f||(f=!0,p(),s(g))})})}function sh(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(Go(r)){let n=sh(r);if(n)return n}}}function Xo(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(Go(r)){let n=Xo(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(Go(s)){let o=Xo(s,e);if(o!==void 0)return o}}}function Go(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ec,bc=E(()=>{"use strict";_c();Wt();St();nn();ct();Ec=class extends $e{constructor(e){super({provider:new an({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",Te],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:ex})}seedArgsFor(e){return rh({prompt:e?.prompt??Te,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){QN(e,{recursive:!0});let n=this.seedArgsFor(r);dt("lmplayer",n);try{let s=await nh(this.binary,n,{cwd:e,env:Ut(void 0,e),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${Te}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as Ko,readFile as tx,rm as rx}from"node:fs/promises";import{basename as oh,join as dr}from"node:path";function ih(t){return t.type==="user"||t.message?.role==="user"}function ah(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function lh(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(`
1351
+ `)}}),o.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?o.kill():r.signal.addEventListener("abort",()=>o.kill(),{once:!0})),o.on("exit",g=>{f||(f=!0,p(),l.length>0&&h(l),n({code:g,stdout:i,stderr:a,sessionId:c??u,text:d.join("")}))}),o.on("error",g=>{f||(f=!0,p(),s(g))})})}function sh(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(Ko(r)){let n=sh(r);if(n)return n}}}function Go(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(Ko(r)){let n=Go(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(Ko(s)){let o=Go(s,e);if(o!==void 0)return o}}}function Ko(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ec,bc=E(()=>{"use strict";_c();Wt();St();nn();ct();Ec=class extends $e{constructor(e){super({provider:new an({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",Te],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:ex})}seedArgsFor(e){return rh({prompt:e?.prompt??Te,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){QN(e,{recursive:!0});let n=this.seedArgsFor(r);dt("lmplayer",n);try{let s=await nh(this.binary,n,{cwd:e,env:Ut(void 0,e),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${Te}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as Vo,readFile as tx,rm as rx}from"node:fs/promises";import{basename as oh,join as dr}from"node:path";function ih(t){return t.type==="user"||t.message?.role==="user"}function ah(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function lh(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(`
1346
1352
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
1347
- `):"":""}function ch(t){return t.model||t.message?.model}var Vo,uh=E(()=>{"use strict";ar();Vo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||dr(ke,".qwen")}async discoverSessions(){let e=dr(this.baseDir,"projects"),r;try{r=await Ko(e)}catch{return[]}let n=[];for(let s of r){let o=dr(e,s,"chats"),i;try{i=await Ko(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=dr(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Me(e,30);if(n.length===0)return null;let s=await Re(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),ih(d)){let f=lh(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(ah(d)){let f=ch(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=oh(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Re(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Be(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(ih(f)){let h=lh(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(ah(f)){let h=ch(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=dr(this.baseDir,"projects");try{let n=await Ko(r),s=[];for(let o of n){let i=dr(r,o,"chats",`${e}.jsonl`);try{return await tx(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=dr(r,o,"chats"),a;try{a=await Ko(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;oh(l,".jsonl").startsWith(e)&&s.push(dr(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 rx(r),!0}catch{return!1}}}});function vc(){return new Sc}var Sc,kc=E(()=>{"use strict";uh();Wt();Lr();St();Sc=class extends $e{constructor(){super({provider:new Vo,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Te,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Po})}}});import{readdir as dh,readFile as nx,rm as fh,stat as mh}from"node:fs/promises";import{basename as Ic,join as qt}from"node:path";async function sx(t){let e=await Promise.all(t.map(r=>Re(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function ox(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function ph(t){return t.type==="USER_INPUT"}function hh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function ix(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function _h(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function gh(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 ax(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function lx(t){for await(let e of Be(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=cx(s);if(o)return o}let n=ux(e.content);if(n)return n}return null}function cx(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 ux(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function yh(t){if(t.endsWith(".db"))return Ic(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Yo,wh=E(()=>{"use strict";ar();Yo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||qt(ke,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=qt(this.baseDir,"conversations"),r;try{r=await dh(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Ic(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return qt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return qt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await mh(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await sx([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Me(n,80);for(let f of d){let m=gh(f.content);if(m&&(a=m),ph(f)){let p=_h(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else hh(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=yh(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Be(o)){let d=ox(u.created_at,s.modifiedAt),f=gh(u.content);if(f&&(a=f),ph(u)){let m=_h(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:ax(m.args),toolName:m.name||"tool"});hh(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):ix(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 mh(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let o of await dh(n)){if(!o.endsWith(".db"))continue;Ic(o,".db").startsWith(e)&&s.push(qt(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=yh(r);return n?(await fh(this.conversationPath(n),{force:!0}),await fh(qt(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 lx(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await nx(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as dx}from"node:child_process";function xc(t){return new Nc(t)}async function fx(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",px(e.timeoutMs)];e.model&&n.push("--model",e.model),dt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await mx(e.binary,n,{cwd:e.cwd,env:He(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function mx(t,e,r){return new Promise((n,s)=>{let o;try{o=dx(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 px(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Nc,Ac=E(()=>{"use strict";wh();Wt();St();ct();nn();Nc=class extends $e{constructor(e){super({provider:new Yo(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",Te,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:fx})}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 hx}from"node:crypto";import{join as _x}from"node:path";function gx(t){return hx("sha256").update(t).digest("hex").slice(0,8)}function yx(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function wx(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 Ex(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function zo(t){return Math.max(1,Math.ceil(t.length/4))}function Eh(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function Lc(){return new $c}var Cr,Rc,$c,jc=E(()=>{"use strict";Cr=new Map;Rc=class{name="ClaudeMock";async discoverSessions(){return[...Cr.values()].map(Eh)}async loadSession(e){let r=Cr.get(e);return r===void 0?null:{...Eh(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Cr.get(e)?.filePath??null}async deleteSession(e){return Cr.delete(e)}},$c=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Rc;discover(){return this.provider.discoverSessions()}load(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=yx(wx(e,r)),s=`mock-${n}-${gx(`${e}:${n}`)}`,o=new Date,i=Cr.get(s),a=r?.prompt??"ClaudeMock seed",l=zo(a),c={sessionId:s,cwd:e,filePath:_x(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+=zo("ACK: ClaudeMock seeded"),Cr.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=Cr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${Ex(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+=zo(e),s.totalOutputTokens+=zo(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function vt(t){let e=[nc({claudeDir:t?.claudeDir}),ic({codexDir:t?.codexDir,codeDir:t?.codeDir}),dc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),mc({copilotDir:t?.copilotDir}),yc(),Tc({lmplayerDbPath:t?.lmplayerDbPath}),vc(),xc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Lc()),e}var Oc=E(()=>{"use strict";sc();ac();fc();pc();wc();bc();kc();Ac();jc();sc();ac();fc();pc();wc();bc();kc();Ac();jc()});var Pc={};ne(Pc,{ProviderRegistry:()=>ds,TransportConnectionError:()=>Ie,TransportError:()=>Qe,TransportJsonError:()=>Lo,TransportProcessError:()=>Bt,TransportRpcError:()=>Ht,_resetDefaultRegistryForTests:()=>Tx,chat:()=>Jt,countTokens:()=>Dc,createAdapterRegistry:()=>bt,createAllAdapters:()=>vt,listSessions:()=>Mc,seed:()=>Cc});function Qo(){return Zo===null&&(Zo=bt(vt())),Zo}function Tx(){Zo=null}function bh(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Jt(t){let e=t.registry??Qo(),r=bh(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 Cc(t){let e=t.registry??Qo(),r=bh(e,t.provider),n=await Th(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let o=await Th(e,t.provider,t.cwd),i=bx(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Th(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function bx(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 Mc(t={}){return(t.registry??Qo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Dc(t){let r=await(t.registry??Qo()).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 Zo,kt=E(()=>{"use strict";Vl();Oc();Vl();Oc();rn();Zo=null});function Sx(){return Fc===null&&(Fc=bt(vt())),Fc}async function cn(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 kx(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)ln.delete(r),e.setMemberState(r,"idle");else{let i=vx(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function vx(t,e){if(!(t instanceof Ne))return ln.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=(ln.get(e)??0)+1;return r>=3?(ln.delete(e),"consecutive_timeouts"):(ln.set(e,r),null)}return ln.delete(e),null}async function kx(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=Sx(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ne("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Uc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ne("other",null,`library: session resolution failed: ${Sh(u)}`,Uc(t.sessionid,t.sessiondir,"unresolved")))}let o=Uc(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 Jt({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 Ne("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 Ne("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):Ix(u,o)}finally{a!==null&&clearTimeout(a)}}function Uc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Sh(t){return t instanceof Error?t.message:String(t)}function Ix(t,e){if(t instanceof Ne)return t;if(t instanceof Ie){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ne("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ne("enoent",null,t.message,e):new Ne("other",null,t.message,e)}return t instanceof Bt?new Ne("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ht?new Ne("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Qe?new Ne("other",null,t.message,e):new Ne("other",null,Sh(t),e)}var Ne,Fc,ln,ws=E(()=>{"use strict";kt();Ne=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},Fc=null;ln=new Map});function vh(){return Wc===null&&(Wc=bt(vt())),Wc}function xx(t,e){if(!Nx.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new xe("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function un(t){let e=xx(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await Ax({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function Ax(t){let e=t.member.provider,r=t.member.sessiondir,n=Bc("seed",r,e);try{let s=await Cc({provider:e,cwd:r,registry:vh()});if(!s.success)throw $x(s.error,n);if(!s.sessionId)throw new xe("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof xe?s:Hc(s,n)}}async function kh(t){return Rx(t)}async function Rx(t){let e=vh(),r=Bc("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new xe("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof xe?o:Hc(o,r)}let s=Bc("tokens",t.sessionid,n);try{let o=await Dc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof xe?o:Hc(o,s)}}function Bc(t,e,r){return["<library>",t,e,"--provider",r]}function $x(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new xe("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new xe("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new xe("nonzero_exit",Number(n[1]),r,e)}return new xe("other",null,r,e)}function Hc(t,e){return t instanceof xe?t:t instanceof Ie?t.cause?.code==="ENOENT"?new xe("enoent",null,t.message,e):new xe("other",null,t.message,e):t instanceof Bt?new xe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ht?new xe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Qe?new xe("other",null,t.message,e):new xe("other",null,t instanceof Error?t.message:String(t),e)}var xe,Wc,Nx,ei=E(()=>{"use strict";kt();xe=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},Wc=null;Nx=/^provider[123]$/});function ti(t){return Buffer.from(t,"utf8").toString("base64url")}function Ts(t){return Buffer.from(t,"base64url").toString("utf8")}async function Ih(t,e=r=>kh({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of Lx(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 Nh(t,e,r){let n=xh(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Es(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await cn({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Ah(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 qc(t,e,r){let n=xh(t,e,r);if(n===null)throw new Error("session member not found");let s=await un({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Ah(t,e,r)}}function Lx(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function xh(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 Ah(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Es,ri=E(()=>{"use strict";ws();ei();Es=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Jc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??Ox(e),s=r-n,o=e.query(`
1353
+ `):"":""}function ch(t){return t.model||t.message?.model}var Yo,uh=E(()=>{"use strict";ar();Yo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||dr(ke,".qwen")}async discoverSessions(){let e=dr(this.baseDir,"projects"),r;try{r=await Vo(e)}catch{return[]}let n=[];for(let s of r){let o=dr(e,s,"chats"),i;try{i=await Vo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=dr(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Me(e,30);if(n.length===0)return null;let s=await Re(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),ih(d)){let f=lh(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(ah(d)){let f=ch(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=oh(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Re(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Be(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(ih(f)){let h=lh(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(ah(f)){let h=ch(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=dr(this.baseDir,"projects");try{let n=await Vo(r),s=[];for(let o of n){let i=dr(r,o,"chats",`${e}.jsonl`);try{return await tx(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=dr(r,o,"chats"),a;try{a=await Vo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;oh(l,".jsonl").startsWith(e)&&s.push(dr(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 rx(r),!0}catch{return!1}}}});function vc(){return new Sc}var Sc,kc=E(()=>{"use strict";uh();Wt();Lr();St();Sc=class extends $e{constructor(){super({provider:new Yo,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Te,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Fo})}}});import{readdir as dh,readFile as nx,rm as fh,stat as mh}from"node:fs/promises";import{basename as Ic,join as qt}from"node:path";async function sx(t){let e=await Promise.all(t.map(r=>Re(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function ox(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function ph(t){return t.type==="USER_INPUT"}function hh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function ix(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function _h(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function gh(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 ax(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function lx(t){for await(let e of Be(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=cx(s);if(o)return o}let n=ux(e.content);if(n)return n}return null}function cx(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 ux(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function yh(t){if(t.endsWith(".db"))return Ic(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var zo,wh=E(()=>{"use strict";ar();zo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||qt(ke,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=qt(this.baseDir,"conversations"),r;try{r=await dh(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Ic(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return qt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return qt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await mh(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await sx([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Me(n,80);for(let f of d){let m=gh(f.content);if(m&&(a=m),ph(f)){let p=_h(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else hh(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=yh(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Be(o)){let d=ox(u.created_at,s.modifiedAt),f=gh(u.content);if(f&&(a=f),ph(u)){let m=_h(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:ax(m.args),toolName:m.name||"tool"});hh(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):ix(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 mh(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let o of await dh(n)){if(!o.endsWith(".db"))continue;Ic(o,".db").startsWith(e)&&s.push(qt(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=yh(r);return n?(await fh(this.conversationPath(n),{force:!0}),await fh(qt(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 lx(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await nx(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as dx}from"node:child_process";function xc(t){return new Nc(t)}async function fx(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",px(e.timeoutMs)];e.model&&n.push("--model",e.model),dt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await mx(e.binary,n,{cwd:e.cwd,env:He(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function mx(t,e,r){return new Promise((n,s)=>{let o;try{o=dx(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 px(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Nc,Ac=E(()=>{"use strict";wh();Wt();St();ct();nn();Nc=class extends $e{constructor(e){super({provider:new zo(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",Te,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:fx})}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 hx}from"node:crypto";import{join as _x}from"node:path";function gx(t){return hx("sha256").update(t).digest("hex").slice(0,8)}function yx(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function wx(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 Ex(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Zo(t){return Math.max(1,Math.ceil(t.length/4))}function Eh(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function Lc(){return new $c}var Cr,Rc,$c,jc=E(()=>{"use strict";Cr=new Map;Rc=class{name="ClaudeMock";async discoverSessions(){return[...Cr.values()].map(Eh)}async loadSession(e){let r=Cr.get(e);return r===void 0?null:{...Eh(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Cr.get(e)?.filePath??null}async deleteSession(e){return Cr.delete(e)}},$c=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Rc;discover(){return this.provider.discoverSessions()}load(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=yx(wx(e,r)),s=`mock-${n}-${gx(`${e}:${n}`)}`,o=new Date,i=Cr.get(s),a=r?.prompt??"ClaudeMock seed",l=Zo(a),c={sessionId:s,cwd:e,filePath:_x(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+=Zo("ACK: ClaudeMock seeded"),Cr.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=Cr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${Ex(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+=Zo(e),s.totalOutputTokens+=Zo(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function vt(t){let e=[nc({claudeDir:t?.claudeDir}),ic({codexDir:t?.codexDir,codeDir:t?.codeDir}),dc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),mc({copilotDir:t?.copilotDir}),yc(),Tc({lmplayerDbPath:t?.lmplayerDbPath}),vc(),xc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Lc()),e}var Oc=E(()=>{"use strict";sc();ac();fc();pc();wc();bc();kc();Ac();jc();sc();ac();fc();pc();wc();bc();kc();Ac();jc()});var Pc={};ne(Pc,{ProviderRegistry:()=>ds,TransportConnectionError:()=>Ie,TransportError:()=>Qe,TransportJsonError:()=>jo,TransportProcessError:()=>Bt,TransportRpcError:()=>Ht,_resetDefaultRegistryForTests:()=>Tx,chat:()=>Jt,countTokens:()=>Dc,createAdapterRegistry:()=>bt,createAllAdapters:()=>vt,listSessions:()=>Mc,seed:()=>Cc});function ei(){return Qo===null&&(Qo=bt(vt())),Qo}function Tx(){Qo=null}function bh(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Jt(t){let e=t.registry??ei(),r=bh(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 Cc(t){let e=t.registry??ei(),r=bh(e,t.provider),n=await Th(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let o=await Th(e,t.provider,t.cwd),i=bx(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Th(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function bx(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 Mc(t={}){return(t.registry??ei()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Dc(t){let r=await(t.registry??ei()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var Qo,kt=E(()=>{"use strict";Vl();Oc();Vl();Oc();rn();Qo=null});function Sx(){return Fc===null&&(Fc=bt(vt())),Fc}async function cn(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 kx(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)ln.delete(r),e.setMemberState(r,"idle");else{let i=vx(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function vx(t,e){if(!(t instanceof Ne))return ln.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=(ln.get(e)??0)+1;return r>=3?(ln.delete(e),"consecutive_timeouts"):(ln.set(e,r),null)}return ln.delete(e),null}async function kx(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=Sx(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ne("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Uc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ne("other",null,`library: session resolution failed: ${Sh(u)}`,Uc(t.sessionid,t.sessiondir,"unresolved")))}let o=Uc(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 Jt({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 Ne("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 Ne("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):Ix(u,o)}finally{a!==null&&clearTimeout(a)}}function Uc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Sh(t){return t instanceof Error?t.message:String(t)}function Ix(t,e){if(t instanceof Ne)return t;if(t instanceof Ie){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ne("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ne("enoent",null,t.message,e):new Ne("other",null,t.message,e)}return t instanceof Bt?new Ne("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ht?new Ne("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Qe?new Ne("other",null,t.message,e):new Ne("other",null,Sh(t),e)}var Ne,Fc,ln,ws=E(()=>{"use strict";kt();Ne=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},Fc=null;ln=new Map});function vh(){return Wc===null&&(Wc=bt(vt())),Wc}function xx(t,e){if(!Nx.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new xe("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function un(t){let e=xx(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await Ax({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function Ax(t){let e=t.member.provider,r=t.member.sessiondir,n=Bc("seed",r,e);try{let s=await Cc({provider:e,cwd:r,registry:vh()});if(!s.success)throw $x(s.error,n);if(!s.sessionId)throw new xe("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof xe?s:Hc(s,n)}}async function kh(t){return Rx(t)}async function Rx(t){let e=vh(),r=Bc("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new xe("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof xe?o:Hc(o,r)}let s=Bc("tokens",t.sessionid,n);try{let o=await Dc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof xe?o:Hc(o,s)}}function Bc(t,e,r){return["<library>",t,e,"--provider",r]}function $x(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new xe("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new xe("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new xe("nonzero_exit",Number(n[1]),r,e)}return new xe("other",null,r,e)}function Hc(t,e){return t instanceof xe?t:t instanceof Ie?t.cause?.code==="ENOENT"?new xe("enoent",null,t.message,e):new xe("other",null,t.message,e):t instanceof Bt?new xe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ht?new xe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Qe?new xe("other",null,t.message,e):new xe("other",null,t instanceof Error?t.message:String(t),e)}var xe,Wc,Nx,ti=E(()=>{"use strict";kt();xe=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},Wc=null;Nx=/^provider[123]$/});function ri(t){return Buffer.from(t,"utf8").toString("base64url")}function Ts(t){return Buffer.from(t,"base64url").toString("utf8")}async function Ih(t,e=r=>kh({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of Lx(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 Nh(t,e,r){let n=xh(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Es(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await cn({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Ah(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 qc(t,e,r){let n=xh(t,e,r);if(n===null)throw new Error("session member not found");let s=await un({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Ah(t,e,r)}}function Lx(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function xh(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 Ah(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Es,ni=E(()=>{"use strict";ws();ti();Es=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Jc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??Ox(e),s=r-n,o=e.query(`
1348
1354
  SELECT
1349
1355
  isess.id AS interactive_session_id,
1350
1356
  isess.run_id,
@@ -1370,16 +1376,16 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1370
1376
  JOIN step s ON s.id = isess.step_id
1371
1377
  WHERE isess.status = 'waiting_agent'
1372
1378
  AND r.terminal_state IS NULL
1373
- `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=Dx(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=Cx(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let u=c.alias.toLowerCase()!=="lead",d=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!u||!d||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Ae(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(i.hung_detected+=1,Mx(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 Ox(t){return Rh(t.getConfig(ni),jx)*1e3}function Xc(t,e){return Rh(t.getConfig(si),e)}function Rh(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 Cx(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function Mx(t,e,r,n){return t.query(`SELECT * FROM attention
1379
+ `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=Dx(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=Cx(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let u=c.alias.toLowerCase()!=="lead",d=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!u||!d||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Ae(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(i.hung_detected+=1,Mx(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 Ox(t){return Rh(t.getConfig(si),jx)*1e3}function Xc(t,e){return Rh(t.getConfig(oi),e)}function Rh(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 Cx(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function Mx(t,e,r,n){return t.query(`SELECT * FROM attention
1374
1380
  WHERE kind = 'session_hung'
1375
1381
  AND run_id = ?
1376
- AND acknowledged_at IS NULL`,e).some(o=>{let i=$h(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function Dx(t,e,r){let n=$h(t);return n===null?null:Px(n,e,r)??Fx(n,e,r)}function Px(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(Ux),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=Mr(s.members)?s.members:null,i=o!==null&&Mr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function Fx(t,e,r){if(!Mr(t.states))return null;let n=t.states[e]??t.states[r];if(!Mr(n))return null;let s=n;if(!Mr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function Ux(t){return Mr(t)}function $h(t){if(t===null)return null;try{let e=JSON.parse(t);return Mr(e)?e:null}catch{return null}}function Mr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var ni,si,jx,Gc=E(()=>{"use strict";We();ni="monitor.session_hung.elapsed_threshold_seconds",si="monitor.session_hung.check_interval_ms",jx=600});function ii(t){let e=t.query(`
1382
+ AND acknowledged_at IS NULL`,e).some(o=>{let i=$h(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function Dx(t,e,r){let n=$h(t);return n===null?null:Px(n,e,r)??Fx(n,e,r)}function Px(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(Ux),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=Mr(s.members)?s.members:null,i=o!==null&&Mr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function Fx(t,e,r){if(!Mr(t.states))return null;let n=t.states[e]??t.states[r];if(!Mr(n))return null;let s=n;if(!Mr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function Ux(t){return Mr(t)}function $h(t){if(t===null)return null;try{let e=JSON.parse(t);return Mr(e)?e:null}catch{return null}}function Mr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var si,oi,jx,Gc=E(()=>{"use strict";We();si="monitor.session_hung.elapsed_threshold_seconds",oi="monitor.session_hung.check_interval_ms",jx=600});function ai(t){let e=t.query(`
1377
1383
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1378
- `),r={queued:oi(e,"queued"),running:oi(e,"running"),done:oi(e,"done"),failed:oi(e,"failed"),total:Vc(e)},n=t.query(`
1384
+ `),r={queued:ii(e,"queued"),running:ii(e,"running"),done:ii(e,"done"),failed:ii(e,"failed"),total:Vc(e)},n=t.query(`
1379
1385
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
1380
1386
  `),s=t.query(`
1381
1387
  SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
1382
- `);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:Vc(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:Vc(s)},projects:Kc(t,"project"),teams:Kc(t,"team"),workflows:Kc(t,"workflow")}}function ai(t){return t.listProjects()}function Oh(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function li(t){return t.query(`
1388
+ `);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:Vc(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:Vc(s)},projects:Kc(t,"project"),teams:Kc(t,"team"),workflows:Kc(t,"workflow")}}function li(t){return t.listProjects()}function Oh(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function ci(t){return t.query(`
1383
1389
  SELECT w.*
1384
1390
  FROM workflow w
1385
1391
  JOIN (
@@ -1388,7 +1394,7 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1388
1394
  GROUP BY name
1389
1395
  ) latest ON latest.name = w.name AND latest.version = w.version
1390
1396
  ORDER BY w.name ASC
1391
- `)}function Ch(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 Mh(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 Dh(t,e){return t.getSubmittedPr(e)}function ci(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function dn(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function Dr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:ci(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:Wx(t,r.id)}}function Wx(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Ph(t,r.id)}))}function Yc(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:Ph(t,n.id)}}function Ph(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Pr(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function Fh(t,e,r){let n=Yc(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 Uh(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 Wh(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 mr(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 ui(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(`${Bh}
1397
+ `)}function Ch(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 Mh(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 Dh(t,e){return t.getSubmittedPr(e)}function ui(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function dn(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function Dr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:ui(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:Wx(t,r.id)}}function Wx(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Ph(t,r.id)}))}function Yc(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:Ph(t,n.id)}}function Ph(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Pr(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function Fh(t,e,r){let n=Yc(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 Uh(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 Wh(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 mr(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 di(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(`${Bh}
1392
1398
  WHERE ${n}
1393
1399
  ORDER BY a.created_at DESC`,...r).map(Hh)}function It(t,e){let n=t.query(`${Bh}
1394
1400
  WHERE a.id = ?`,e)[0];return n===void 0?null:Hh(n)}function Hh(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 qh(t){return t.query(`
@@ -1397,7 +1403,7 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1397
1403
  JOIN workflow w ON w.id = r.workflow_id
1398
1404
  GROUP BY w.name, r.terminal_state
1399
1405
  ORDER BY w.name ASC, r.terminal_state ASC
1400
- `)}function Kc(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function oi(t,e){return t.find(r=>r.status===e)?.count??0}function Vc(t){return t.reduce((e,r)=>e+r.count,0)}function zc(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
1406
+ `)}function Kc(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function ii(t,e){return t.find(r=>r.status===e)?.count??0}function Vc(t){return t.reduce((e,r)=>e+r.count,0)}function zc(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
1401
1407
  FROM step s
1402
1408
  JOIN run r ON r.id = s.run_id
1403
1409
  JOIN job j ON j.id = r.job_id
@@ -1464,9 +1470,9 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1464
1470
  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 Jh(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 fn(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?Jh(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
1465
1471
  FROM interactive_session
1466
1472
  WHERE run_id = ? AND status = 'waiting_operator'
1467
- 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,S=l.get(g),w="pending",b=null;if(g.startsWith("@terminal:"))w=r.terminal_state===g.slice(10)?"done":"pending";else if(S!==void 0&&(S.ended_at===null?w=_&&u===g?"paused":"running":S.outcome===null?w="failed":w="done",S.ended_at!==null)){let x=Date.parse(S.started_at),k=Date.parse(S.ended_at);!Number.isNaN(x)&&!Number.isNaN(k)&&(b=k-x)}_&&u===g&&(w="paused"),h.push({id:g,status:w,is_current:_,elapsed_ms:b,prompt:_&&w==="paused"?f:null,expected:_&&w==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function di(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(...Bx(o));return`${e.join(`
1473
+ 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,S=l.get(g),w="pending",b=null;if(g.startsWith("@terminal:"))w=r.terminal_state===g.slice(10)?"done":"pending";else if(S!==void 0&&(S.ended_at===null?w=_&&u===g?"paused":"running":S.outcome===null?w="failed":w="done",S.ended_at!==null)){let x=Date.parse(S.started_at),k=Date.parse(S.ended_at);!Number.isNaN(x)&&!Number.isNaN(k)&&(b=k-x)}_&&u===g&&(w="paused"),h.push({id:g,status:w,is_current:_,elapsed_ms:b,prompt:_&&w==="paused"?f:null,expected:_&&w==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function fi(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(...Bx(o));return`${e.join(`
1468
1474
  `)}
1469
- `}function Bx(t){let e=[],r=Hx(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 Hx(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function fi(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?Jh(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
1475
+ `}function Bx(t){let e=[],r=Hx(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 Hx(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function mi(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?Jh(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
1470
1476
  FROM session_event
1471
1477
  WHERE run_id = ? AND step_id IS NOT NULL
1472
1478
  GROUP BY step_id`,e))x.step_id!==null&&h.set(x.step_id,x.timestamp_ms);let _=qx(c,d,u),S=Jx(s.current_state),w=t.query(`SELECT kind, severity, payload
@@ -1474,9 +1480,9 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1474
1480
  WHERE run_id = ?
1475
1481
  AND kind = 'session_hung'
1476
1482
  AND acknowledged_at IS NULL
1477
- ORDER BY id ASC`,e).map(x=>({kind:x.kind,severity:x.severity,payload:Zx(x.payload)})),b=_.map(x=>{let k=f.get(x),j=p.get(x),V=Xx(s,x,S,k,j),W=k===void 0?null:Date.parse(k.started_at),M=k?.ended_at===null||k===void 0?null:Date.parse(k.ended_at),$=k===void 0||Number.isNaN(W??NaN)?null:M!==null&&!Number.isNaN(M)?M-W:V==="running"||V==="paused"?n-W:null,Z=k===void 0?null:h.get(k.id)??null,J=Qx(j?.last_activity_at??null,Z,g),I=o===null||j===void 0?void 0:Vx(t,s.team_id,o.definition,j.state_name,k?.state_name??x);return{step_id:k?.id??null,state_id:x,status:V,started_at:k?.started_at??null,ended_at:k?.ended_at??null,last_activity_at:J,elapsed_ms:$,...I!==void 0?{member:I}:{},...j!==void 0?{interactive_session:{id:j.id,status:j.status,turn_count:j.turn_count,state_name:j.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:Kx(s,a,b),submitted_at:a?.enqueued_at??s.started_at,nodes:b,current_node_index:Gx(b,s.terminal_state!==null),related_attentions:w}}function mi(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} (${jh(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Lh(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Lh(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${pi(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 ${jh(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}${eA(a.payload)}`)}return`${n.join(`
1483
+ ORDER BY id ASC`,e).map(x=>({kind:x.kind,severity:x.severity,payload:Zx(x.payload)})),b=_.map(x=>{let k=f.get(x),j=p.get(x),V=Xx(s,x,S,k,j),W=k===void 0?null:Date.parse(k.started_at),M=k?.ended_at===null||k===void 0?null:Date.parse(k.ended_at),$=k===void 0||Number.isNaN(W??NaN)?null:M!==null&&!Number.isNaN(M)?M-W:V==="running"||V==="paused"?n-W:null,Z=k===void 0?null:h.get(k.id)??null,J=Qx(j?.last_activity_at??null,Z,g),I=o===null||j===void 0?void 0:Vx(t,s.team_id,o.definition,j.state_name,k?.state_name??x);return{step_id:k?.id??null,state_id:x,status:V,started_at:k?.started_at??null,ended_at:k?.ended_at??null,last_activity_at:J,elapsed_ms:$,...I!==void 0?{member:I}:{},...j!==void 0?{interactive_session:{id:j.id,status:j.status,turn_count:j.turn_count,state_name:j.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:Kx(s,a,b),submitted_at:a?.enqueued_at??s.started_at,nodes:b,current_node_index:Gx(b,s.terminal_state!==null),related_attentions:w}}function pi(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} (${jh(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Lh(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Lh(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${hi(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 ${jh(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}${eA(a.payload)}`)}return`${n.join(`
1478
1484
  `)}
1479
- `}function qx(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 Jx(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function Xx(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 Gx(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 Kx(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 Vx(t,e,r,n,s){let o=Yx(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:Ae(i)}}function Yx(t,e,r){let n=zx(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>fr(a)?a.id===e||a.name===e||a.name===r:!1),o=fr(s?.members)?s.members:null,i=o!==null&&fr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(fr(n.states)){let s=n.states[e]??n.states[r];if(!fr(s))return null;let o=fr(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function zx(t){try{let e=JSON.parse(t);return fr(e)?e:null}catch{return null}}function Zx(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function fr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Qx(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Lh(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${pi(Math.max(0,n-r)).padEnd(6)}]`}function jh(t,e){return Number.isNaN(t)?"?":pi(Math.max(0,e-t))}function pi(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 eA(t){if(!fr(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"?`, ${pi(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Bh,Xt=E(()=>{"use strict";We();Bh=`SELECT a.id AS attention_id,
1485
+ `}function qx(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 Jx(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function Xx(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 Gx(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 Kx(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 Vx(t,e,r,n,s){let o=Yx(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:Ae(i)}}function Yx(t,e,r){let n=zx(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>fr(a)?a.id===e||a.name===e||a.name===r:!1),o=fr(s?.members)?s.members:null,i=o!==null&&fr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(fr(n.states)){let s=n.states[e]??n.states[r];if(!fr(s))return null;let o=fr(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function zx(t){try{let e=JSON.parse(t);return fr(e)?e:null}catch{return null}}function Zx(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function fr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Qx(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Lh(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${hi(Math.max(0,n-r)).padEnd(6)}]`}function jh(t,e){return Number.isNaN(t)?"?":hi(Math.max(0,e-t))}function hi(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 eA(t){if(!fr(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"?`, ${hi(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Bh,Xt=E(()=>{"use strict";We();Bh=`SELECT a.id AS attention_id,
1480
1486
  a.kind AS kind,
1481
1487
  a.severity AS severity,
1482
1488
  a.created_at AS created_at,
@@ -1498,10 +1504,10 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1498
1504
  ON isess.run_id = a.run_id
1499
1505
  AND isess.id = (
1500
1506
  SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
1501
- )`});var a_={};ne(a_,{parseApiArgs:()=>Yh,readApiClientConfig:()=>Ss,runApi:()=>iA});import{readFileSync as tA}from"node:fs";import{basename as rA,extname as nA}from"node:path";async function iA(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(oA),0;if(t[0]==="config")return lA(t.slice(1),e);let r=o_(t,"--direct");if(r.rest[0]==="escalations")return cA(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&gi(r.rest.slice(2)))return e.stdout.write(`${mA}
1507
+ )`});var a_={};ne(a_,{parseApiArgs:()=>Yh,readApiClientConfig:()=>Ss,runApi:()=>iA});import{readFileSync as tA}from"node:fs";import{basename as rA,extname as nA}from"node:path";async function iA(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(oA),0;if(t[0]==="config")return lA(t.slice(1),e);let r=o_(t,"--direct");if(r.rest[0]==="escalations")return cA(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&yi(r.rest.slice(2)))return e.stdout.write(`${mA}
1502
1508
  `),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
1503
- `),2):aR(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&gi(r.rest.slice(2)))return e.stdout.write(`${dA}
1504
- `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&gi(r.rest.slice(2)))return e.stdout.write(`${fA}
1509
+ `),2):aR(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&yi(r.rest.slice(2)))return e.stdout.write(`${dA}
1510
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&yi(r.rest.slice(2)))return e.stdout.write(`${fA}
1505
1511
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?nR(r.rest.slice(2),e):sR(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?oR(r.rest.slice(2),e):iR(r.rest.slice(2),e);if(r.present)return BA(r.rest,e);let n=Yh(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1506
1512
  `),2;let s=Fr(e),o=s.baseUrl,i=pr(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=TA(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1507
1513
  `),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)}
@@ -1513,24 +1519,24 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1513
1519
  `):e.stdout.write(`${JSON.stringify(f)}
1514
1520
  `)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1515
1521
  `):(e.stdout.write(await l.text()),e.stdout.write(`
1516
- `));return 0}function Yh(t){let e=Qh(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"?_i(o,"/api/status",n):s==="projects"?_i(o,"/api/projects",n):s==="teams"?_i(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?$A(o.slice(1),e.format):_i(o,"/api/workflows",n):s==="workflow"?RA(o,n):s==="upload"?xA(o,n):s==="submit-job"?AA(o,n):s==="issues"?NA(o,n):s==="jobs"?bs(o,"--status","/api/jobs","status",n):s==="job"?IA(o,n):s==="project"?LA(o,n):s==="artifact"?CA(o,n):s==="runs"?bs(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?bs(o,"--type","/api/external-objects","type",n):s==="external-signals"?Gh(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?MA(o,n):Gh(o,"--unacked","/api/attentions","unacked",n):s==="stats"?DA(o,n):s==="daemon"?PA(o,n):s==="intake"?FA(o,n):s==="session"?UA(o,n):s==="run"?WA(o,e.format):s==="prs"?bs(o,"--status","/api/submitted-prs","status",n):s==="pr"?vA(o,n):`unknown subcommand: ${s}`}function pr(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function Fr(t){if(t.dal!==void 0)return Ss(t.dal,process.env,t);let e=ge({path:le()});try{return Ss(e,process.env,t)}finally{e.close()}}function Ss(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=sA;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: ${aA(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1522
+ `));return 0}function Yh(t){let e=Qh(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"?gi(o,"/api/status",n):s==="projects"?gi(o,"/api/projects",n):s==="teams"?gi(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?$A(o.slice(1),e.format):gi(o,"/api/workflows",n):s==="workflow"?RA(o,n):s==="upload"?xA(o,n):s==="submit-job"?AA(o,n):s==="issues"?NA(o,n):s==="jobs"?bs(o,"--status","/api/jobs","status",n):s==="job"?IA(o,n):s==="project"?LA(o,n):s==="artifact"?CA(o,n):s==="runs"?bs(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?bs(o,"--type","/api/external-objects","type",n):s==="external-signals"?Gh(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?MA(o,n):Gh(o,"--unacked","/api/attentions","unacked",n):s==="stats"?DA(o,n):s==="daemon"?PA(o,n):s==="intake"?FA(o,n):s==="session"?UA(o,n):s==="run"?WA(o,e.format):s==="prs"?bs(o,"--status","/api/submitted-prs","status",n):s==="pr"?vA(o,n):`unknown subcommand: ${s}`}function pr(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function Fr(t){if(t.dal!==void 0)return Ss(t.dal,process.env,t);let e=ge({path:le()});try{return Ss(e,process.env,t)}finally{e.close()}}function Ss(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=sA;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: ${aA(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1517
1523
  `);return{baseUrl:o,token:a}}function aA(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 lA(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1518
1524
  `),2;let s=e.dal===void 0,o=e.dal??ge({path:le()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
1519
- `),2;let i=n[0];if(!hi.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...hi].join(", ")})
1525
+ `),2;let i=n[0];if(!_i.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[..._i].join(", ")})
1520
1526
  `),2;let a=o.getConfig(i);return a===null?(e.stderr.write(`error: ${i} is not set
1521
1527
  `),1):(e.stdout.write(`${a}
1522
1528
  `),0)}if(r==="set"){if(n.length!==2)return e.stderr.write(`usage: lmctl api config set <key> <value>
1523
- `),2;let[i,a]=n;if(!hi.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...hi].join(", ")})
1529
+ `),2;let[i,a]=n;if(!_i.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[..._i].join(", ")})
1524
1530
  `),2;let l=EA(i,a);return l!==null?(e.stderr.write(`error: ${l}
1525
1531
  `),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${Xh(i,a,!1)}
1526
1532
  `),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}
1527
1533
  `),2}let a=o.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return e.stdout.write(`(no config rows)
1528
1534
  `),0;for(let c of l)e.stdout.write(`${c} = ${Xh(c,a[c],i)}
1529
1535
  `);return 0}return e.stderr.write(`error: unknown api config verb: ${r}
1530
- `),2}finally{s&&o.close()}}async function cA(t,e,r){if(gi(t))return e.stdout.write(`${uA}
1536
+ `),2}finally{s&&o.close()}}async function cA(t,e,r){if(yi(t))return e.stdout.write(`${uA}
1531
1537
  `),0;let n=o_(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>
1532
1538
  `),2):s?pA(i,a,e):i==="list"?_A(a,e):i==="show"?yA(a,e):i==="respond"?wA(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
1533
- `),2)}function gi(t){return t.some(e=>e==="--help"||e==="-h")}function pA(t,e,r){let n=r.dal===void 0,s=r.dal??ge({path:le()});try{return i_(s,[t,...e],r)}finally{n&&s.close()}}function zh(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=hA(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return se(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function hA(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 _A(t,e){let r=zh(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1539
+ `),2)}function yi(t){return t.some(e=>e==="--help"||e==="-h")}function pA(t,e,r){let n=r.dal===void 0,s=r.dal??ge({path:le()});try{return i_(s,[t,...e],r)}finally{n&&s.close()}}function zh(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=hA(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return se(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function hA(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 _A(t,e){let r=zh(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1534
1540
  `),2;let n=Fr(e),s=pr("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)}
1535
1541
  `),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1536
1542
  `),a.status===400?2:1;let l=await a.json();return Zh(l,r.json,e)}function Zh(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
@@ -1556,7 +1562,7 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1556
1562
  `),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
1557
1563
  `),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
1558
1564
  `):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
1559
- `),0}function Xh(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function EA(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===ni||t===si){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function TA(t,e){let r=tA(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:bA(t)}),rA(t)),e!==void 0&&s.append("project",e),s}function bA(t){switch(nA(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 SA(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 vA(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return bs(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 Qh(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 _i(t,e,r){return t.length>0?se(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function bs(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 se(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 Gh(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return se(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function kA(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=oe(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function IA(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return kA([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 se(f)}if(s===void 0&&o===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=Qc(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=oe(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function NA(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return se(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=oe(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?e_(n,e):r==="claim"?t_(n,e):r==="claim-next"?r_(n,e):r==="close"?n_(n,e):r==="reopen"?s_(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function e_(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=Qc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=oe(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return se(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 t_(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=oe(r,"id");if(typeof s=="string")return s;let 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=oe(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return se(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 r_(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=oe(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return se(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 n_(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=oe(r,"id");if(typeof s=="string")return s;let 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=oe(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return se(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function s_(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=oe(r,"id");if(typeof s=="string")return s;let 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=oe(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return se(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function xA(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 se(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function AA(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return se(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 Qc(t){try{return JSON.parse(t)}catch{return t}}function RA(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 $A(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return se(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function LA(t,e){let[r,n,...s]=t;return r==="workflow"?jA([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 jA(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=oe(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=oe(n[0],"id");if(typeof s=="string")return s;let 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=OA(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 OA(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=Qc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return se(i)}return{project:e,body:s}}function CA(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=oe(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return se(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 MA(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=oe(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function DA(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 PA(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 FA(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 UA(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=ti(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function WA(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=oe(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=oe(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 se(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=oe(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=oe(n,"run_id");if(typeof i=="string")return i;let a=oe(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=oe(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 se(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=oe(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=oe(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 oe(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function se(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function o_(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 BA(t,e){let r=Qh(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1565
+ `),0}function Xh(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function EA(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===si||t===oi){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function TA(t,e){let r=tA(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:bA(t)}),rA(t)),e!==void 0&&s.append("project",e),s}function bA(t){switch(nA(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 SA(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 vA(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return bs(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 Qh(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 gi(t,e,r){return t.length>0?se(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function bs(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 se(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 Gh(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return se(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function kA(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=oe(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function IA(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return kA([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 se(f)}if(s===void 0&&o===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=Qc(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=oe(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function NA(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return se(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=oe(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?e_(n,e):r==="claim"?t_(n,e):r==="claim-next"?r_(n,e):r==="close"?n_(n,e):r==="reopen"?s_(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function e_(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=Qc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=oe(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return se(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 t_(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=oe(r,"id");if(typeof s=="string")return s;let 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=oe(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return se(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 r_(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=oe(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return se(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 n_(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=oe(r,"id");if(typeof s=="string")return s;let 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=oe(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return se(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function s_(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=oe(r,"id");if(typeof s=="string")return s;let 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=oe(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return se(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function xA(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 se(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function AA(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return se(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 Qc(t){try{return JSON.parse(t)}catch{return t}}function RA(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 $A(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return se(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function LA(t,e){let[r,n,...s]=t;return r==="workflow"?jA([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 jA(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=oe(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=oe(n[0],"id");if(typeof s=="string")return s;let 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=OA(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 OA(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=Qc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return se(i)}return{project:e,body:s}}function CA(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=oe(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return se(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 MA(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=oe(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function DA(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 PA(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 FA(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 UA(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=ri(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function WA(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=oe(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=oe(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 se(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=oe(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=oe(n,"run_id");if(typeof i=="string")return i;let a=oe(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=oe(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 se(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=oe(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=oe(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 oe(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function se(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function o_(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 BA(t,e){let r=Qh(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1560
1566
  `),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)
1561
1567
  `),2;let a=e.dal===void 0,l=e.dal??ge({path:le()});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)
1562
1568
  `),2):c==="create"?HA(l,u,e,s):c==="claim"?qA(l,u,e,s):c==="claim-next"?JA(l,u,e,s):c==="close"?XA(l,u,e,s):c==="reopen"?GA(l,u,e,s):c==="list"?zA(l,u,e,s):c==="show"?ZA(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
@@ -1588,9 +1594,9 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1588
1594
  `),2;let s=oe(e[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
1589
1595
  `),2;let o=t.getIssue(s);return o===null?(r.stderr.write(`error: issue not found: ${s}
1590
1596
  `),1):(Ye(r,o,n),0)}function QA(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${se(e[0])}
1591
- `),2):(Ye(r,ii(t),n),0)}function eR(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${se(e[0])}
1592
- `),2):(Ye(r,ai(t),n),0)}function tR(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${se(e[0])}
1593
- `),2):(Ye(r,li(t),n),0)}function rR(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}
1597
+ `),2):(Ye(r,ai(t),n),0)}function eR(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${se(e[0])}
1598
+ `),2):(Ye(r,li(t),n),0)}function tR(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${se(e[0])}
1599
+ `),2):(Ye(r,ci(t),n),0)}function rR(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}
1594
1600
  `),2;if(i==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
1595
1601
  `),2;s=Number(a)}else return r.stderr.write(`error: ${se(i)}
1596
1602
  `),2}return Ye(r,dn(t,s!==void 0?{limit:s}:{}),n),0}function nR(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
@@ -1598,7 +1604,7 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1598
1604
  `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${se(a)}
1599
1605
  `),2}let o=e.dal===void 0,i=e.dal??ge({path:le()});try{let a=fn(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1600
1606
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1601
- `):e.stdout.write(di(a)),0)}finally{o&&i.close()}}async function sR(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1607
+ `):e.stdout.write(fi(a)),0)}finally{o&&i.close()}}async function sR(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1602
1608
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1603
1609
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${se(c)}
1604
1610
  `),2}let o=Fr(e),a=pr(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)}
@@ -1608,9 +1614,9 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1608
1614
  `),l.status===404?1:l.status===400?2:1)}function oR(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
1609
1615
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1610
1616
  `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${se(a)}
1611
- `),2}let o=e.dal===void 0,i=e.dal??ge({path:le()});try{let a=fi(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1617
+ `),2}let o=e.dal===void 0,i=e.dal??ge({path:le()});try{let a=mi(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1612
1618
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1613
- `):e.stdout.write(mi(a)),0)}finally{o&&i.close()}}async function iR(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1619
+ `):e.stdout.write(pi(a)),0)}finally{o&&i.close()}}async function iR(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1614
1620
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1615
1621
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${se(c)}
1616
1622
  `),2}let o=Fr(e),a=pr(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)}
@@ -1625,7 +1631,7 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1625
1631
  `),i.status===400?2:1)}function lR(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${se(o)}
1626
1632
  `),2}return Ye(r,mr(t,{unacked:s}),n),0}function i_(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1627
1633
  `),2;if(n==="list"){let o=zh(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
1628
- `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=ui(t,i);return Zh(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]
1634
+ `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=di(t,i);return Zh(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]
1629
1635
  `),2;let i=oe(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1630
1636
  `),2;let a=It(t,i);return a===null?(r.stderr.write(`error: escalation not found: ${i}
1631
1637
  `),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
@@ -1643,12 +1649,12 @@ ${r}`:r}function pN(t){let e=[...t.matchAll(cN)];if(e.length>0){let r=e[e.length
1643
1649
  `),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})
1644
1650
  `),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)}
1645
1651
  `):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1646
- `),0}function Kh(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 sA,oA,Vh,hi,uA,dA,fA,mA,YA,eu=E(()=>{"use strict";We();Ke();ri();Gc();Xt();sA="http://127.0.0.1:8787",oA=`usage: lmctl api [--direct] <subcommand> ...
1652
+ `),0}function Kh(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 sA,oA,Vh,_i,uA,dA,fA,mA,YA,eu=E(()=>{"use strict";We();Ke();ni();Gc();Xt();sA="http://127.0.0.1:8787",oA=`usage: lmctl api [--direct] <subcommand> ...
1647
1653
 
1648
1654
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1649
1655
  workflow shellstep-safe commands also support --direct to use the local DAL
1650
1656
  without an HTTP round trip.
1651
- `,Vh=["low","medium","high","critical"];hi=new Set(["api.url","api.port","api.token","project.docroot",ni,si]);uA=`usage: lmctl api escalations <list|show|respond>
1657
+ `,Vh=["low","medium","high","critical"];_i=new Set(["api.url","api.port","api.token","project.docroot",si,oi]);uA=`usage: lmctl api escalations <list|show|respond>
1652
1658
 
1653
1659
  list [--project P] [--all] [--since DURATION] [--json]
1654
1660
  Print pending operator escalations (interactive_waiting_operator
@@ -1673,7 +1679,7 @@ without an HTTP round trip.
1673
1679
 
1674
1680
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1675
1681
  and report the first step that would be started. Default output is the TTY
1676
- table; --json emits the structured WorkflowVerifyReport payload.`;YA=["open","assigned","closed","reopened"]});import{existsSync as l_,mkdirSync as uR,readdirSync as dR,readFileSync as c_,writeFileSync as fR}from"node:fs";import{join as mn}from"node:path";import{fileURLToPath as mR}from"node:url";function vs(t){try{return pR.some(e=>l_(mn(t,e)))}catch{return!1}}function hR(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 yi(t,e){t.durable_memory_mode!=="db"?_R(t):gR(t,e)}function u_(t){let e=vs(t),r;try{r=dR(tu).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 _R(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=mn(e,"durable-memory");try{uR(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=u_(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=mn(r,i);if(!l_(a))try{let l=c_(mn(tu,o),"utf8");fR(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 gR(t,e){let r=t.local_path??"",n=u_(r),s=[];for(let o of n){let i=mn(tu,o),a;try{a=c_(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=hR(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 tu,pR,ks=E(()=>{"use strict";tu=mn(mR(import.meta.url),"../../config/durable_memory_templates"),pR=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as yR,mkdirSync as wR,readdirSync as ER,readFileSync as TR,writeFileSync as bR}from"node:fs";import{join as wi}from"node:path";import{fileURLToPath as SR}from"node:url";function Ei(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!vs(e))return;let r=wi(e,"ai-test");try{wR(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of vR()){let o=s.replace(/\.template$/,""),i=wi(r,o);if(!yR(i))try{bR(i,kR(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 vR(){try{return ER(d_).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function kR(t){try{return TR(wi(d_,t),"utf8")}catch{return IR(t)}}function IR(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1682
+ table; --json emits the structured WorkflowVerifyReport payload.`;YA=["open","assigned","closed","reopened"]});import{existsSync as l_,mkdirSync as uR,readdirSync as dR,readFileSync as c_,writeFileSync as fR}from"node:fs";import{join as mn}from"node:path";import{fileURLToPath as mR}from"node:url";function vs(t){try{return pR.some(e=>l_(mn(t,e)))}catch{return!1}}function hR(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 wi(t,e){t.durable_memory_mode!=="db"?_R(t):gR(t,e)}function u_(t){let e=vs(t),r;try{r=dR(tu).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 _R(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=mn(e,"durable-memory");try{uR(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=u_(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=mn(r,i);if(!l_(a))try{let l=c_(mn(tu,o),"utf8");fR(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 gR(t,e){let r=t.local_path??"",n=u_(r),s=[];for(let o of n){let i=mn(tu,o),a;try{a=c_(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=hR(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 tu,pR,ks=E(()=>{"use strict";tu=mn(mR(import.meta.url),"../../config/durable_memory_templates"),pR=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as yR,mkdirSync as wR,readdirSync as ER,readFileSync as TR,writeFileSync as bR}from"node:fs";import{join as Ei}from"node:path";import{fileURLToPath as SR}from"node:url";function Ti(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!vs(e))return;let r=Ei(e,"ai-test");try{wR(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of vR()){let o=s.replace(/\.template$/,""),i=Ei(r,o);if(!yR(i))try{bR(i,kR(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 vR(){try{return ER(d_).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function kR(t){try{return TR(Ei(d_,t),"utf8")}catch{return IR(t)}}function IR(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1677
1683
 
1678
1684
  Add test chapters in this directory.
1679
1685
  `:`---
@@ -1695,7 +1701,7 @@ last_run_id: 0
1695
1701
  ## Expected
1696
1702
 
1697
1703
  ## Cleanup
1698
- `}var d_,ru=E(()=>{"use strict";ks();d_=wi(SR(import.meta.url),"../../config/ai_test_templates")});var pn,nu=E(()=>{"use strict";pn=`---
1704
+ `}var d_,ru=E(()=>{"use strict";ks();d_=Ei(SR(import.meta.url),"../../config/ai_test_templates")});var pn,nu=E(()=>{"use strict";pn=`---
1699
1705
 
1700
1706
  # Durable memory \u2014 how to use it
1701
1707
 
@@ -1706,15 +1712,15 @@ ON EVERY NEW TASK:
1706
1712
  2. Pull only the chapters relevant to your current task. Don't load everything.
1707
1713
  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.
1708
1714
 
1709
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Ti(t){return NR.has(t)}function ou(){return su===null&&(su=bt(vt())),su}function iu(t,e,r={}){if(!Ti(t))return null;try{let n=ou().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?Co({warn:()=>{}}):[];return[...o,...i,...f_[t]??[]]}catch{return null}}function hn(t,e){let r=iu(t,e);return r===null?null:r.join(" ")}function Gt(t,e){return ou().getSession(t,e)}async function bi(t){return(await ou().resolveSessions(t)).map(r=>r.provider.name)}var f_,NR,m_,su,Ur=E(()=>{"use strict";kt();ec();f_={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},NR=new Set(Object.keys(f_)),m_=/^[\w.:-]+$/;su=null});import{createHash as xR}from"node:crypto";import{existsSync as Is,mkdirSync as h_,readFileSync as Ns,readdirSync as AR,renameSync as RR,statSync as $R,unlinkSync as LR,writeFileSync as Si}from"node:fs";import{homedir as jR}from"node:os";import{dirname as au,isAbsolute as p_,join as et,relative as OR,resolve as _n}from"node:path";import{fileURLToPath as CR}from"node:url";function g_(t){let e=_n(t);for(;;){let r=et(e,lu);try{if($R(r).isDirectory())return r}catch{}let n=au(e);if(n===e)return null;e=n}}function ki(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return _n(e);let r=g_(t);return r!==null?r:et(__(),lu)}function y_(t){return et(ki(t),"templates","workflows")}function w_(){return _n(au(CR(import.meta.url)),"..","..","workflows")}function MR(t){let e=et(t,E_);try{let r=JSON.parse(Ns(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 DR(t,e){h_(t,{recursive:!0});let r=et(t,E_),n=`${r}.tmp-${process.pid}`;Si(n,`${JSON.stringify(e,null,2)}
1710
- `,"utf8"),RR(n,r)}function PR(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function FR(t,e,r,n,s){let o=`${e}.dist-${r}`;for(let i=0;i<1e3;i+=1){let a=i===0?o:`${o}-${i}`,l=et(t,a);try{return Si(l,n,{flag:"wx"}),a}catch(c){if(PR(c)!=="EEXIST")throw c;if(vi(Ns(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function UR(t,e){if(p_(e)||au(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=_n(t,"templates","workflows"),s=_n(t,"templates",e),o=OR(n,s);return o.length===0||o.startsWith("..")||p_(o)||o.includes("/")||o.includes("\\")?null:s}function WR(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=UR(t,n);if(o===null){delete e.files[n];continue}if(!Is(o)){delete e.files[n];continue}try{if(vi(Ns(o))!==s)continue;LR(o),delete e.files[n]}catch{}}}function Ii(t={}){let e=ki(t.cwd),r=et(e,"templates","workflows"),n=w_(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=Is(n)?AR(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;h_(r,{recursive:!0});let i=MR(e),a=lt(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=Ns(et(n,c)),f=vi(d),m=et(r,c);if(!Is(m)){try{Si(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=vi(Ns(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)Si(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=FR(r,c,a,d,f);s.preserved.push(c),s.shadowed.push(g)}}WR(e,i,l),DR(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function cu(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(_n(r));let n=g_(t??process.cwd());return n!==null&&e.push(n),e.push(et(__(),lu)),e}function Ni(t,e){let r=cu(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=et(s,"templates","workflows",o);if(Is(i))return i}for(let s of n){let o=et(w_(),s);if(Is(o))return o}return null}var lu,__,vi,E_,xi=E(()=>{"use strict";ts();lu=".lmctl",__=()=>process.env.HOME??jR(),vi=t=>xR("sha256").update(t).digest("hex");E_=".dist-manifest.json"});import{createHash as BR}from"node:crypto";import{existsSync as HR,mkdirSync as qR,writeFileSync as JR}from"node:fs";import{dirname as XR,join as gn}from"node:path";function hr(t){return typeof t=="string"&&t.startsWith(T_)}function ZR(t){if(!hr(t))throw new mt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(T_.length),r=e.indexOf("/");if(r<=0)throw new mt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!YR.has(n))throw new mt(`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 mt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new mt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function QR(t,e,r){if(t==="workflow")return Ni(e,r);let n=t==="mcp"?gn("templates","mcp",`${e}.json`):gn("templates","skills",e,"SKILL.md");for(let s of cu(r)){let o=gn(s,n);if(HR(o))return o}return null}function e$(t,e,r){let n=gn(ki(r),KR,t);return t==="skill"?gn(n,e,"SKILL.md"):gn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function t$(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 xs(t,e){let{kind:r,name:n,ref:s}=ZR(t),o=QR(r,n,e);if(o!==null)return o;let i=`${GR}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(VR)})}catch(u){throw new mt(`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 mt(`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=zR.exec(s);if(u!==null){let d=BR("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new mt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!t$(r,l))throw new mt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=e$(r,n,e);return qR(XR(c),{recursive:!0}),JR(c,l,"utf8"),c}var T_,GR,KR,VR,YR,mt,zR,uu=E(()=>{"use strict";xi();T_="lmctl://",GR="https://lmctl.com/templates/",KR=".cache",VR=8e3,YR=new Set(["workflow","mcp","skill"]),mt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},zR=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as r$,mkdirSync as n$,readFileSync as s$,renameSync as o$,unlinkSync as i$,writeFileSync as a$}from"node:fs";import{homedir as S_}from"node:os";import{dirname as As,join as pt,resolve as l$}from"node:path";function En(t,e,r){let n=As(l$(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())_r(pt(i,".mcp.json"),"mcpServers",[yn(),wn()]),a.has("opencode")&&_r(pt(i,".opencode","opencode.json"),"mcp",[N_(),x_()]);for(let i of s)d$(i)}function du(t=v_??S_()){return pt(t,".copilot","mcp-config.json")}function k_(t,e){let r={};if(qe.existsSync(t)){let o=JSON.parse(qe.readFileSync(t,"utf8"));if(!Nt(o))throw new Error(`${t} is not a JSON object`);r=o}let n=Nt(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=Nt(n[o])?n[o]:void 0;S$(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,I_(t,r),{changed:!0}):{changed:!1}}function I_(t,e){qe.mkdirSync(As(t),{recursive:!0});let r=pt(As(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{qe.writeFileSync(r,`${JSON.stringify(e,null,2)}
1711
- `,"utf8"),qe.renameSync(r,t)}catch(n){try{qe.unlinkSync(r)}catch{}throw n}}function u$(t,e){qe.mkdirSync(As(t),{recursive:!0});let r=pt(As(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{qe.writeFileSync(r,e,"utf8"),qe.renameSync(r,t)}catch(n){try{qe.unlinkSync(r)}catch{}throw n}}function _r(t,e,r){try{if(!qe.existsSync(t))return;let n=JSON.parse(qe.readFileSync(t,"utf8"));if(!Nt(n)||!Nt(n[e]))return;let s={...n[e]},o=[];for(let{name:i,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,i)&&a(s[i])&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,I_(t,n),z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function yn(){return{name:Ri,shouldRemove:w$}}function N_(){return{name:Ri,shouldRemove:E$}}function wn(){return{name:Ai,shouldRemove:g$}}function x_(){return{name:Ai,shouldRemove:y$}}function d$(t){let e=v_??S_();switch(t){case"copilot":_r(du(e),"mcpServers",[yn(),wn()]);return;case"claude":_r(pt(e,".claude.json"),"mcpServers",[yn(),wn()]);return;case"gemini":_r(pt(e,".gemini","settings.json"),"mcpServers",[yn(),wn()]);return;case"qwen":_r(pt(e,".qwen","settings.json"),"mcpServers",[yn(),wn()]);return;case"agy":_r(pt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[yn(),wn()]);return;case"opencode":_r(pt(e,".config","opencode","opencode.json"),"mcp",[N_(),x_()]);return;case"codex":f$(pt(e,".codex","config.toml"));return;default:return}}function f$(t){try{if(!qe.existsSync(t))return;let e=qe.readFileSync(t,"utf8"),r=m$(e);if(r===null)return;let n=e.split(/\n/),s=[],o=new Set,i=!1,a;for(let l of n){let c=A_(l);if(c===null)return;if(c!==void 0){if(b_(c,r)){i=!0,a=c[1],o.add(a);continue}i=!1,a=void 0,s.push(l);continue}if(i){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&o.add(a);continue}let u=h$(l);if(u===null)return;if(u!==void 0&&b_(u,r)){o.add(u[1]);continue}s.push(l)}if(o.size===0)return;u$(t,s.join(`
1712
- `)),z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function b_(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function m$(t){let e=new Map,r;for(let s of t.split(/\n/)){let o=A_(s);if(o===null)return null;if(o!==void 0){r=o;continue}let i=s.indexOf("=");if(i<0)continue;let a=s.slice(0,i).trim(),l=s.slice(i+1).trim(),c=p$(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Ai&&c[1]!==Ri)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let d=R_(l);if(d===null)return null;u.command=d}else if(c[2]==="args"){let d=_$(l);if(d===null)return null;u.args=d}e.set(c[1],u)}let n=new Set;for(let[s,o]of e.entries())s===Ai&&L_(o.command,o.args)&&n.add(s),s===Ri&&j_(o.command,o.args)&&n.add(s);return n}function p$(t,e){if(t.startsWith("mcp_servers"))return $i(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=$i(t);return r===null?null:[...e,...r]}function A_(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:$i(e[1])}function h$(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 $i(r)}function $i(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 R_(t){let e=$_(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function _$(t){let e=$_(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>R_(s.trim()));return n.some(s=>s===null)?null:n}function $_(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function g$(t){return Nt(t)?t.type==="stdio"&&typeof t.command=="string"&&L_(t.command,t.args):!1}function y$(t){return!Nt(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&C_(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&O_(t.command[0],[t.command[1],t.command[2]])}function w$(t){return Nt(t)?t.type==="stdio"&&j_(t.command,t.args):!1}function E$(t){return!Nt(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&M_(t.command[0])&&t.command[1]==="mcp"}function L_(t,e){return C_(t)&&D_(e)||O_(t,e)}function j_(t,e){return M_(t)&&D_(e)}function O_(t,e){return T$(t)&&Array.isArray(e)&&e.length===2&&b$(e[0])&&e[1]==="mcp"}function C_(t){return typeof t=="string"&&fu(t)==="lmctl"}function M_(t){return typeof t=="string"&&fu(t)==="lmctl0"}function T$(t){if(typeof t!="string")return!1;let e=fu(t).toLowerCase();return e==="node"||e==="node.exe"}function b$(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function fu(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function D_(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function S$(t,e){return t!==void 0&&Li(t)===Li(e)}function Li(t){return Array.isArray(t)?`[${t.map(e=>Li(e)).join(",")}]`:Nt(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${Li(t[e])}`).join(",")}}`:JSON.stringify(t)}function Nt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ai,Ri,c$,qe,v_,Rs=E(()=>{"use strict";ve();Ai="lmctl",Ri="lmctl0",c$={existsSync:r$,mkdirSync:n$,readFileSync:s$,writeFileSync:a$,renameSync:o$,unlinkSync:i$},qe=c$});import{spawnSync as H_}from"node:child_process";import{cpSync as P_,existsSync as hu,mkdirSync as q_,mkdtempSync as v$,readFileSync as J_,statSync as k$,writeFileSync as mu}from"node:fs";import{homedir as I$,tmpdir as N$}from"node:os";import{basename as F_,join as tt}from"node:path";function Kt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function pu(t,e,r){if(Array.isArray(t)){for(let n of t)pu(n,e,r);return}if(Kt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))pu(n,e,r)}}function $$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Kt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Kt(l)&&l.members!==void 0&&pu(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(R$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function L$(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function X_(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(x$)})}catch(s){throw new rt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new rt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>U_)throw new rt(e,`fetched ${t} exceeds ${U_} bytes`);return n}async function j$(t,e){if(typeof t!="string")return[t];hr(t)&&(t=await xs(t));let r;if(_u.test(t))r=await X_(t,e);else{if(!hu(t))throw new rt(e,`mcp file not found: ${t}`);r=J_(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new rt(e,`mcp source is not JSON: ${t}`)}if(Kt(n)&&Kt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Kt(o)?o:{}}));if(Kt(n)&&typeof n.name=="string")return[n];throw new rt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Oi(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function ji(t,e,r,n){let s=H_(t,e,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new rt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new rt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function O$(t,e,r){H_(t,e,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4})}function C$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function M$(t){let e=["mcp","add"];if(Oi(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 D$(t){if(Oi(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 P$(t){let e=tt(process.env.XDG_CONFIG_HOME??tt(Tn(),".config"),"opencode"),r=tt(e,"opencode.json"),n={};if(hu(r))try{let o=JSON.parse(J_(r,"utf8"));Kt(o)&&(n=o)}catch{}let s=Kt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Oi(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"),q_(e,{recursive:!0}),mu(r,`${JSON.stringify(n,null,2)}
1713
- `,"utf8")}function F$(t,e){let r={};for(let n of t)r[n.name]=Oi(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{k_(du(Tn()),r)}catch(n){throw new rt(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function U$(t){if(typeof t!="string")return t.name;let e=F_(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?F_(t.replace(/\/skill\.md$/i,"")):e}async function W_(t,e,r){let n=U$(t),s=tt(e,n);if(q_(s,{recursive:!0}),typeof t!="string")return mu(tt(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(hr(t)&&(t=await xs(t)),_u.test(t))return mu(tt(s,"SKILL.md"),await X_(t,r),"utf8"),{name:n,dir:s};if(!hu(t))throw new rt(r,`skill path not found: ${t}`);return k$(t).isDirectory()?(P_(t,s,{recursive:!0}),{name:n,dir:s}):(P_(t,tt(s,"SKILL.md")),{name:n,dir:s})}async function Ci(t){let{dal:e,member:r,stderr:n}=t,s=$$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ae(r),i=r.sessiondir||t.baseDir||L$(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1714
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await j$(c,r.alias));if(o==="opencode")P$(l);else if(o==="copilot")F$(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(O$(o,C$(o,c.name),i),o==="claude"){let{name:u,...d}=c;ji("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?ji("codex",D$(c),i,r.alias):ji(o,M$(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(A$.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=v$(tt(N$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!_u.test(c)?c:(await W_(c,l,r.alias)).dir;ji(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(B_[o]!==void 0){let l=B_[o]();for(let c of s.skills)await W_(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var rt,_u,x$,U_,A$,R$,Tn,B_,gu=E(()=>{"use strict";We();uu();ct();Rs();rt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},_u=/^https?:\/\//i,x$=8e3,U_=1e6,A$=new Set(["opencode"]),R$=t=>JSON.stringify(t),Tn=()=>process.env.HOME??I$();B_={claude:()=>tt(Tn(),".claude","skills"),qwen:()=>tt(Tn(),".qwen","skills"),codex:()=>tt(Tn(),".codex","skills"),copilot:()=>tt(Tn(),".copilot","skills")}});async function R(t,e){if(t.dal!==void 0)return e(t.dal);let r=ge({path:le()});try{return await e(r)}finally{r.close()}}function D(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function A(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function C(t,e){return t.flags[e]===!0}function U(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1715
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function bi(t){return NR.has(t)}function ou(){return su===null&&(su=bt(vt())),su}function iu(t,e,r={}){if(!bi(t))return null;try{let n=ou().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?Mo({warn:()=>{}}):[];return[...o,...i,...f_[t]??[]]}catch{return null}}function hn(t,e){let r=iu(t,e);return r===null?null:r.join(" ")}function Gt(t,e){return ou().getSession(t,e)}async function Si(t){return(await ou().resolveSessions(t)).map(r=>r.provider.name)}var f_,NR,m_,su,Ur=E(()=>{"use strict";kt();ec();f_={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},NR=new Set(Object.keys(f_)),m_=/^[\w.:-]+$/;su=null});import{createHash as xR}from"node:crypto";import{existsSync as Is,mkdirSync as h_,readFileSync as Ns,readdirSync as AR,renameSync as RR,statSync as $R,unlinkSync as LR,writeFileSync as vi}from"node:fs";import{homedir as jR}from"node:os";import{dirname as au,isAbsolute as p_,join as et,relative as OR,resolve as _n}from"node:path";import{fileURLToPath as CR}from"node:url";function g_(t){let e=_n(t);for(;;){let r=et(e,lu);try{if($R(r).isDirectory())return r}catch{}let n=au(e);if(n===e)return null;e=n}}function Ii(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return _n(e);let r=g_(t);return r!==null?r:et(__(),lu)}function y_(t){return et(Ii(t),"templates","workflows")}function w_(){return _n(au(CR(import.meta.url)),"..","..","workflows")}function MR(t){let e=et(t,E_);try{let r=JSON.parse(Ns(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 DR(t,e){h_(t,{recursive:!0});let r=et(t,E_),n=`${r}.tmp-${process.pid}`;vi(n,`${JSON.stringify(e,null,2)}
1716
+ `,"utf8"),RR(n,r)}function PR(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function FR(t,e,r,n,s){let o=`${e}.dist-${r}`;for(let i=0;i<1e3;i+=1){let a=i===0?o:`${o}-${i}`,l=et(t,a);try{return vi(l,n,{flag:"wx"}),a}catch(c){if(PR(c)!=="EEXIST")throw c;if(ki(Ns(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function UR(t,e){if(p_(e)||au(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=_n(t,"templates","workflows"),s=_n(t,"templates",e),o=OR(n,s);return o.length===0||o.startsWith("..")||p_(o)||o.includes("/")||o.includes("\\")?null:s}function WR(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=UR(t,n);if(o===null){delete e.files[n];continue}if(!Is(o)){delete e.files[n];continue}try{if(ki(Ns(o))!==s)continue;LR(o),delete e.files[n]}catch{}}}function Ni(t={}){let e=Ii(t.cwd),r=et(e,"templates","workflows"),n=w_(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=Is(n)?AR(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;h_(r,{recursive:!0});let i=MR(e),a=lt(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=Ns(et(n,c)),f=ki(d),m=et(r,c);if(!Is(m)){try{vi(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=ki(Ns(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)vi(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=FR(r,c,a,d,f);s.preserved.push(c),s.shadowed.push(g)}}WR(e,i,l),DR(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function cu(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(_n(r));let n=g_(t??process.cwd());return n!==null&&e.push(n),e.push(et(__(),lu)),e}function xi(t,e){let r=cu(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=et(s,"templates","workflows",o);if(Is(i))return i}for(let s of n){let o=et(w_(),s);if(Is(o))return o}return null}var lu,__,ki,E_,Ai=E(()=>{"use strict";ts();lu=".lmctl",__=()=>process.env.HOME??jR(),ki=t=>xR("sha256").update(t).digest("hex");E_=".dist-manifest.json"});import{createHash as BR}from"node:crypto";import{existsSync as HR,mkdirSync as qR,writeFileSync as JR}from"node:fs";import{dirname as XR,join as gn}from"node:path";function hr(t){return typeof t=="string"&&t.startsWith(T_)}function ZR(t){if(!hr(t))throw new mt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(T_.length),r=e.indexOf("/");if(r<=0)throw new mt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!YR.has(n))throw new mt(`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 mt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new mt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function QR(t,e,r){if(t==="workflow")return xi(e,r);let n=t==="mcp"?gn("templates","mcp",`${e}.json`):gn("templates","skills",e,"SKILL.md");for(let s of cu(r)){let o=gn(s,n);if(HR(o))return o}return null}function e$(t,e,r){let n=gn(Ii(r),KR,t);return t==="skill"?gn(n,e,"SKILL.md"):gn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function t$(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 xs(t,e){let{kind:r,name:n,ref:s}=ZR(t),o=QR(r,n,e);if(o!==null)return o;let i=`${GR}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(VR)})}catch(u){throw new mt(`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 mt(`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=zR.exec(s);if(u!==null){let d=BR("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new mt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!t$(r,l))throw new mt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=e$(r,n,e);return qR(XR(c),{recursive:!0}),JR(c,l,"utf8"),c}var T_,GR,KR,VR,YR,mt,zR,uu=E(()=>{"use strict";Ai();T_="lmctl://",GR="https://lmctl.com/templates/",KR=".cache",VR=8e3,YR=new Set(["workflow","mcp","skill"]),mt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},zR=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as r$,mkdirSync as n$,readFileSync as s$,renameSync as o$,unlinkSync as i$,writeFileSync as a$}from"node:fs";import{homedir as S_}from"node:os";import{dirname as As,join as pt,resolve as l$}from"node:path";function En(t,e,r){let n=As(l$(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())_r(pt(i,".mcp.json"),"mcpServers",[yn(),wn()]),a.has("opencode")&&_r(pt(i,".opencode","opencode.json"),"mcp",[N_(),x_()]);for(let i of s)d$(i)}function du(t=v_??S_()){return pt(t,".copilot","mcp-config.json")}function k_(t,e){let r={};if(qe.existsSync(t)){let o=JSON.parse(qe.readFileSync(t,"utf8"));if(!Nt(o))throw new Error(`${t} is not a JSON object`);r=o}let n=Nt(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=Nt(n[o])?n[o]:void 0;S$(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,I_(t,r),{changed:!0}):{changed:!1}}function I_(t,e){qe.mkdirSync(As(t),{recursive:!0});let r=pt(As(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{qe.writeFileSync(r,`${JSON.stringify(e,null,2)}
1717
+ `,"utf8"),qe.renameSync(r,t)}catch(n){try{qe.unlinkSync(r)}catch{}throw n}}function u$(t,e){qe.mkdirSync(As(t),{recursive:!0});let r=pt(As(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{qe.writeFileSync(r,e,"utf8"),qe.renameSync(r,t)}catch(n){try{qe.unlinkSync(r)}catch{}throw n}}function _r(t,e,r){try{if(!qe.existsSync(t))return;let n=JSON.parse(qe.readFileSync(t,"utf8"));if(!Nt(n)||!Nt(n[e]))return;let s={...n[e]},o=[];for(let{name:i,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,i)&&a(s[i])&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,I_(t,n),z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function yn(){return{name:$i,shouldRemove:w$}}function N_(){return{name:$i,shouldRemove:E$}}function wn(){return{name:Ri,shouldRemove:g$}}function x_(){return{name:Ri,shouldRemove:y$}}function d$(t){let e=v_??S_();switch(t){case"copilot":_r(du(e),"mcpServers",[yn(),wn()]);return;case"claude":_r(pt(e,".claude.json"),"mcpServers",[yn(),wn()]);return;case"gemini":_r(pt(e,".gemini","settings.json"),"mcpServers",[yn(),wn()]);return;case"qwen":_r(pt(e,".qwen","settings.json"),"mcpServers",[yn(),wn()]);return;case"agy":_r(pt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[yn(),wn()]);return;case"opencode":_r(pt(e,".config","opencode","opencode.json"),"mcp",[N_(),x_()]);return;case"codex":f$(pt(e,".codex","config.toml"));return;default:return}}function f$(t){try{if(!qe.existsSync(t))return;let e=qe.readFileSync(t,"utf8"),r=m$(e);if(r===null)return;let n=e.split(/\n/),s=[],o=new Set,i=!1,a;for(let l of n){let c=A_(l);if(c===null)return;if(c!==void 0){if(b_(c,r)){i=!0,a=c[1],o.add(a);continue}i=!1,a=void 0,s.push(l);continue}if(i){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&o.add(a);continue}let u=h$(l);if(u===null)return;if(u!==void 0&&b_(u,r)){o.add(u[1]);continue}s.push(l)}if(o.size===0)return;u$(t,s.join(`
1718
+ `)),z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function b_(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function m$(t){let e=new Map,r;for(let s of t.split(/\n/)){let o=A_(s);if(o===null)return null;if(o!==void 0){r=o;continue}let i=s.indexOf("=");if(i<0)continue;let a=s.slice(0,i).trim(),l=s.slice(i+1).trim(),c=p$(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Ri&&c[1]!==$i)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let d=R_(l);if(d===null)return null;u.command=d}else if(c[2]==="args"){let d=_$(l);if(d===null)return null;u.args=d}e.set(c[1],u)}let n=new Set;for(let[s,o]of e.entries())s===Ri&&L_(o.command,o.args)&&n.add(s),s===$i&&j_(o.command,o.args)&&n.add(s);return n}function p$(t,e){if(t.startsWith("mcp_servers"))return Li(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=Li(t);return r===null?null:[...e,...r]}function A_(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Li(e[1])}function h$(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 Li(r)}function Li(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 R_(t){let e=$_(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function _$(t){let e=$_(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>R_(s.trim()));return n.some(s=>s===null)?null:n}function $_(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function g$(t){return Nt(t)?t.type==="stdio"&&typeof t.command=="string"&&L_(t.command,t.args):!1}function y$(t){return!Nt(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&C_(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&O_(t.command[0],[t.command[1],t.command[2]])}function w$(t){return Nt(t)?t.type==="stdio"&&j_(t.command,t.args):!1}function E$(t){return!Nt(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&M_(t.command[0])&&t.command[1]==="mcp"}function L_(t,e){return C_(t)&&D_(e)||O_(t,e)}function j_(t,e){return M_(t)&&D_(e)}function O_(t,e){return T$(t)&&Array.isArray(e)&&e.length===2&&b$(e[0])&&e[1]==="mcp"}function C_(t){return typeof t=="string"&&fu(t)==="lmctl"}function M_(t){return typeof t=="string"&&fu(t)==="lmctl0"}function T$(t){if(typeof t!="string")return!1;let e=fu(t).toLowerCase();return e==="node"||e==="node.exe"}function b$(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function fu(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function D_(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function S$(t,e){return t!==void 0&&ji(t)===ji(e)}function ji(t){return Array.isArray(t)?`[${t.map(e=>ji(e)).join(",")}]`:Nt(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${ji(t[e])}`).join(",")}}`:JSON.stringify(t)}function Nt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ri,$i,c$,qe,v_,Rs=E(()=>{"use strict";ve();Ri="lmctl",$i="lmctl0",c$={existsSync:r$,mkdirSync:n$,readFileSync:s$,writeFileSync:a$,renameSync:o$,unlinkSync:i$},qe=c$});import{spawnSync as H_}from"node:child_process";import{cpSync as P_,existsSync as hu,mkdirSync as q_,mkdtempSync as v$,readFileSync as J_,statSync as k$,writeFileSync as mu}from"node:fs";import{homedir as I$,tmpdir as N$}from"node:os";import{basename as F_,join as tt}from"node:path";function Kt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function pu(t,e,r){if(Array.isArray(t)){for(let n of t)pu(n,e,r);return}if(Kt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))pu(n,e,r)}}function $$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Kt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Kt(l)&&l.members!==void 0&&pu(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(R$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function L$(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function X_(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(x$)})}catch(s){throw new rt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new rt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>U_)throw new rt(e,`fetched ${t} exceeds ${U_} bytes`);return n}async function j$(t,e){if(typeof t!="string")return[t];hr(t)&&(t=await xs(t));let r;if(_u.test(t))r=await X_(t,e);else{if(!hu(t))throw new rt(e,`mcp file not found: ${t}`);r=J_(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new rt(e,`mcp source is not JSON: ${t}`)}if(Kt(n)&&Kt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Kt(o)?o:{}}));if(Kt(n)&&typeof n.name=="string")return[n];throw new rt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Ci(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function Oi(t,e,r,n){let s=H_(t,e,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new rt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new rt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function O$(t,e,r){H_(t,e,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4})}function C$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function M$(t){let e=["mcp","add"];if(Ci(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 D$(t){if(Ci(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 P$(t){let e=tt(process.env.XDG_CONFIG_HOME??tt(Tn(),".config"),"opencode"),r=tt(e,"opencode.json"),n={};if(hu(r))try{let o=JSON.parse(J_(r,"utf8"));Kt(o)&&(n=o)}catch{}let s=Kt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Ci(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"),q_(e,{recursive:!0}),mu(r,`${JSON.stringify(n,null,2)}
1719
+ `,"utf8")}function F$(t,e){let r={};for(let n of t)r[n.name]=Ci(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{k_(du(Tn()),r)}catch(n){throw new rt(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function U$(t){if(typeof t!="string")return t.name;let e=F_(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?F_(t.replace(/\/skill\.md$/i,"")):e}async function W_(t,e,r){let n=U$(t),s=tt(e,n);if(q_(s,{recursive:!0}),typeof t!="string")return mu(tt(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(hr(t)&&(t=await xs(t)),_u.test(t))return mu(tt(s,"SKILL.md"),await X_(t,r),"utf8"),{name:n,dir:s};if(!hu(t))throw new rt(r,`skill path not found: ${t}`);return k$(t).isDirectory()?(P_(t,s,{recursive:!0}),{name:n,dir:s}):(P_(t,tt(s,"SKILL.md")),{name:n,dir:s})}async function Mi(t){let{dal:e,member:r,stderr:n}=t,s=$$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ae(r),i=r.sessiondir||t.baseDir||L$(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1720
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await j$(c,r.alias));if(o==="opencode")P$(l);else if(o==="copilot")F$(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(O$(o,C$(o,c.name),i),o==="claude"){let{name:u,...d}=c;Oi("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?Oi("codex",D$(c),i,r.alias):Oi(o,M$(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(A$.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=v$(tt(N$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!_u.test(c)?c:(await W_(c,l,r.alias)).dir;Oi(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(B_[o]!==void 0){let l=B_[o]();for(let c of s.skills)await W_(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var rt,_u,x$,U_,A$,R$,Tn,B_,gu=E(()=>{"use strict";We();uu();ct();Rs();rt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},_u=/^https?:\/\//i,x$=8e3,U_=1e6,A$=new Set(["opencode"]),R$=t=>JSON.stringify(t),Tn=()=>process.env.HOME??I$();B_={claude:()=>tt(Tn(),".claude","skills"),qwen:()=>tt(Tn(),".qwen","skills"),codex:()=>tt(Tn(),".codex","skills"),copilot:()=>tt(Tn(),".copilot","skills")}});async function R(t,e){if(t.dal!==void 0)return e(t.dal);let r=ge({path:le()});try{return await e(r)}finally{r.close()}}function D(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function A(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function C(t,e){return t.flags[e]===!0}function U(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1715
1721
  `)}function y(t,e){return t.stderr.write(`error: ${e}
1716
1722
  `),1}function _e(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1717
- `),2}var pe=E(()=>{"use strict";We();Ke()});var z_={};ne(z_,{defaultTeamNameForProject:()=>oL,resolveAlias:()=>Pi,resolveProject:()=>Mi,resolveTeam:()=>Di,runCode:()=>H$});import{execFileSync as W$}from"node:child_process";import{basename as B$,resolve as G_}from"node:path";import*as wu from"node:readline";import{setTimeout as yu}from"node:timers/promises";async function H$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return q$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return V_(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return Q$(e);try{return await R(e,async s=>{switch(r){case"team":return J$(n,e,s);case"chat":return Y$(n,e,s);case"spec":return z$(n,e,s);default:return y(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return _e(e,s)}}function q$(t){return t.stdout.write(["usage: lmctl code <team|chat|spec> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1723
+ `),2}var pe=E(()=>{"use strict";We();Ke()});var z_={};ne(z_,{defaultTeamNameForProject:()=>oL,resolveAlias:()=>Fi,resolveProject:()=>Di,resolveTeam:()=>Pi,runCode:()=>H$});import{execFileSync as W$}from"node:child_process";import{basename as B$,resolve as G_}from"node:path";import*as wu from"node:readline";import{setTimeout as yu}from"node:timers/promises";async function H$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return q$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return V_(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return Q$(e);try{return await R(e,async s=>{switch(r){case"team":return J$(n,e,s);case"chat":return Y$(n,e,s);case"spec":return z$(n,e,s);default:return y(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return _e(e,s)}}function q$(t){return t.stdout.write(["usage: lmctl code <team|chat|spec> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1718
1724
  `)),0}function J$(t,e,r){let[n,...s]=t;switch(n){case"add":return X$(s,e,r);case"list":return G$(s,e,r);case"show":return K$(s,e,r);case"rm":return V$(s,e,r);default:return y(e,"usage: lmctl code team <add|list|show|rm>")}}function X$(t,e,r){let n=D(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]");let o=A(n,"--provider");if(o===void 0)return y(e,"code team add requires --provider");let i=bn(e,r,A(n,"--project"),A(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:A(n,"--model")??null,role:A(n,"--role")??"agent",sessiondir:A(n,"--sessiondir")??i.project.local_path});return C(n,"--json")?U(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1719
1725
  `),0}function G$(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=bn(e,r,A(n,"--project"),A(n,"--team"));if(typeof s=="number")return s;let o=Y_(r.listTeamMembers(s.team.id));if(C(n,"--json"))U(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${Ae(i)} ${i.sessionid??"(unseeded)"}
1720
1726
  `);return 0}function K$(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team show <alias>");let o=bn(e,r,A(n,"--project"),A(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?y(e,`member not found: ${s}`):(C(n,"--json")?U(e,i):(e.stdout.write(`member ${i.alias}
@@ -1724,7 +1730,7 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1724
1730
  `),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
1725
1731
  `),e.stdout.write(`sessiondir: ${i.sessiondir}
1726
1732
  `)),0)}function V$(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team rm <alias>");let o=bn(e,r,A(n,"--project"),A(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return y(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return C(n,"--json")?U(e,a):e.stdout.write(`retired member ${i.alias}
1727
- `),0}async function Y$(t,e,r){if(t.includes("--help")||t.includes("-h"))return V_(e);let n=D(t,["--project","--team","--alias"]);if(n.error!==void 0)return y(e,n.error);let s=bn(e,r,A(n,"--project"),A(n,"--team"));if(typeof s=="number")return s;let o=Pi(e,r,s.team,A(n,"--alias"));if(typeof o=="number")return o;let i=await sL(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1733
+ `),0}async function Y$(t,e,r){if(t.includes("--help")||t.includes("-h"))return V_(e);let n=D(t,["--project","--team","--alias"]);if(n.error!==void 0)return y(e,n.error);let s=bn(e,r,A(n,"--project"),A(n,"--team"));if(typeof s=="number")return s;let o=Fi(e,r,s.team,A(n,"--alias"));if(typeof o=="number")return o;let i=await sL(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1728
1734
  `);let a=e.stdin??process.stdin,l=wu.createInterface({input:a,terminal:!1}),c=i;$s(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){$s(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1729
1735
  `),0;if(d==="/help"){nL(e),$s(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
1730
1736
  `),$s(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
@@ -1740,32 +1746,32 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1740
1746
  `);let a=wu.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}
1741
1747
  `),0;if(c==="/done")return await Ls(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await Ls(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function Ls(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 rL(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function V_(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(`
1742
1748
  `)),0}function nL(t){t.stderr.write(`commands: /help, /exit
1743
- `)}function $s(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function Mi(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?y(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=W$("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return y(t,"not in a git repo; use --project <name>")}let o=G_(s),i=e.listProjects().find(a=>G_(a.local_path)===o);return i===void 0?y(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function Di(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?y(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?y(t,`project ${r.name} has no assigned team; use --team <name>`):s}function Pi(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?y(t,`member not found: ${n}`):o}let s=Y_(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?y(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function bn(t,e,r,n){let s=Mi(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 Y_(t){return t.filter(e=>e.state!=="retired")}async function sL(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1744
- `),yi(r,e),Ei(r);let s=await un({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=hn(Ae(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
1749
+ `)}function $s(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function Di(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?y(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=W$("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return y(t,"not in a git repo; use --project <name>")}let o=G_(s),i=e.listProjects().find(a=>G_(a.local_path)===o);return i===void 0?y(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function Pi(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?y(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?y(t,`project ${r.name} has no assigned team; use --team <name>`):s}function Fi(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?y(t,`member not found: ${n}`):o}let s=Y_(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?y(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function bn(t,e,r,n){let s=Di(t,e,r);if(typeof s=="number")return s;let o=Pi(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function Y_(t){return t.filter(e=>e.state!=="retired")}async function sL(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1750
+ `),wi(r,e),Ti(r);let s=await un({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=hn(Ae(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
1745
1751
  ${i}
1746
- `),await Ci({dal:e,member:o,stderr:t.stderr,baseDir:r.local_path});let a=o.role_prompt??"",l=a.length>0?`${a}
1752
+ `),await Mi({dal:e,member:o,stderr:t.stderr,baseDir:r.local_path});let a=o.role_prompt??"",l=a.length>0?`${a}
1747
1753
 
1748
- ${pn}`:pn;return e.setMemberPromptSnapshot(o.id,l)??o}function oL(t){return`${B$(t.local_path)}-code`}var K_,Eu=E(()=>{"use strict";ws();ei();ks();ru();nu();We();Ur();gu();pe();eu();K_="spec-driven-task"});import Z_ from"jexl";function gr(t){Z_.compile(Q_(t))}async function Wr(t,e){return Z_.eval(Q_(t),e)}function Q_(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Sn=E(()=>{"use strict"});import{z as T}from"zod";function Nu(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var iL,eg,Tu,bu,Su,vu,ku,Iu,tg,aL,lL,cL,js,uL,Fi,Ui,Wi,Bi,Hi,rg,dL,fL,mL,pL,qi,vn=E(()=>{"use strict";Sn();iL=T.object({kind:T.enum(["success","neutral","failure"])}),eg=T.enum(["string","number","boolean","object","array"]),Tu=T.object({name:T.string().min(1),type:eg,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),bu=T.object({name:T.string().min(1),type:eg,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),Su=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),vu="__failure__",ku=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),Iu=T.object({on_unhandled_failure:T.object({attention_kind:T.string().min(1).default("workflow_failed"),severity:T.enum(["warn","error","critical"]).default("warn"),capture_evidence:T.boolean().default(!0),recommend_recovery:T.string().min(1).optional()}).optional(),on_unhandled_failure_state:T.string().min(1).optional()}).optional(),tg=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),aL=T.object({name:T.string().min(1),command:T.string().min(1).optional(),args:T.array(T.string()).optional(),env:T.record(T.string(),T.string()).optional(),type:T.enum(["stdio","http","sse"]).optional(),url:T.string().min(1).optional(),headers:T.record(T.string(),T.string()).optional()}).strict(),lL=T.union([T.string().min(1),aL]),cL=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),js=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(lL).optional(),skills:T.array(cL).optional()}),uL=T.object({kind:T.literal("shell"),command:T.string().min(1),description:T.string().optional()}),Fi=T.object({type:T.literal("Review"),state_name:T.string().min(1),coder:js,pre_checks:T.array(uL).optional(),reviewers:T.array(js.extend({rubric_artifact:T.string().optional()})).optional(),outcomes:T.object({approve:T.string().min(1),request_changes:T.string().optional(),fail_pre_check:T.string().optional(),max_loops_exceeded:T.string().optional()}),writes_to_project_path:T.boolean().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional(),max_loops:T.number().int().positive().default(5),loop_feedback_artifact:T.string().optional(),outcomes_from_stance:T.record(T.string(),T.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Ui=T.object({type:T.literal("Consolidate"),state_name:T.string().min(1),researchers:T.array(js.extend({topic:T.string().min(1)})).optional(),consolidator:js,outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),research_artifact_prefix:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Wi=T.object({type:T.literal("Interactive"),state_name:T.string().min(1),agent:js.extend({initial_prompt_template:T.string().min(1)}),termination:T.object({operator_signal:T.boolean().default(!0),agent_signal:T.string().optional(),max_turns:T.number().int().positive().default(20),timeout_seconds:T.number().int().positive().optional()}),outcomes:T.object({done:T.string().min(1),timeout:T.string().optional()}),artifact_name:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Bi=T.object({type:T.literal("Loop"),state_name:T.string().min(1),over:T.string().min(1),item_var:T.string().min(1),body:T.string().min(1),outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),stop_on_error:T.boolean().default(!0),max_items:T.number().int().positive().default(1e3)}),Hi=T.object({type:T.literal("ShellStep"),state_name:T.string().min(1),command:T.string().min(1),outcomes_from_exit:T.record(T.string(),T.string().min(1)),timeout_ms:T.number().int().nonnegative().optional(),capture_output_to:T.string().optional(),writes_to_project_path:T.boolean().optional()}),rg=T.object({type:T.literal("Choice"),state_name:T.string().min(1),branches:T.array(T.object({when:T.string().min(1),next:T.string().min(1)})).default([]),default_next:T.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{gr(Nu(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}`})}}),dL=T.discriminatedUnion("type",[tg,Fi,Ui,Wi,Bi,Hi,rg]),fL=T.object({type:T.literal("ForEach"),state_name:T.string().min(1),items_from:T.string().min(1),mode:T.enum(["sequential","parallel"]).default("sequential"),max_concurrency:T.number().int().positive().default(1),on_item_failure:T.enum(["continue","stop"]).default("stop"),body:dL,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((t,e)=>{try{gr(Nu(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}`})}}),mL=T.object({type:T.literal("Subflow"),state_name:T.string().min(1),workflow_name:T.string().min(1),inputs:T.record(T.string(),T.string().min(1)).optional(),outcomes:T.record(T.string(),T.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{gr(Nu(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),pL=T.discriminatedUnion("type",[tg,Fi,Ui,Wi,Bi,Hi,rg,fL,mL]),qi=T.object({name:T.string().min(1),version:T.number().int().positive(),definition_schema_version:T.union([T.literal(1),T.literal(2)]),description:T.string().optional(),estimated_duration_ms:T.number().int().nonnegative().optional(),primitive_version:T.union([T.literal(1),T.literal(2)]).default(1),start_at:T.string().min(1),states:T.record(T.string().min(1),pL),terminals:T.record(T.string().min(1),iL),errors:Iu,concurrency_key:T.string().min(1).optional(),concurrent_limit:T.number().int().positive().optional(),default_task_timeout_ms:T.number().int().positive().max(216e5).optional(),inputs:T.array(Tu).optional(),outputs:T.array(bu).optional(),triggers:T.array(Su).optional(),read_only:T.boolean().optional(),requires:ku}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var hL,Ji,_L,gL,yL,xt,kn=E(()=>{"use strict";vn();hL=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ji=Q.string().regex(hL),_L=Q.object({step_id:Ji,type:Q.literal("main"),index:Q.number().int().min(0)}),gL=Q.record(Ji,Q.record(Q.string().min(1),Q.array(Q.array(_L)))),yL=Q.object({id:Ji,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()}),xt=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:Iu,inputs:Q.array(Tu).optional(),outputs:Q.array(bu).optional(),steps:Q.array(yL).min(1),connections:gL.default({}),entry_step_id:Ji,triggers:Q.array(Su).optional(),read_only:Q.boolean().optional(),requires:ku}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Xi(t){return Au(t)}function Au(t){if(Array.isArray(t))return t.map(Au);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Au(e[n]);if(typeof r.type=="string"){let n=EL[r.type];n!==void 0&&(r.type=n)}return r}var xu,wL,EL,Ru=E(()=>{"use strict";xu="lmctl.builtin.",wL={Review:`${xu}Review`,Research:`${xu}Research`,Consolidate:`${xu}Consolidate`},EL=Object.fromEntries(Object.entries(wL).map(([t,e])=>[e,t]))});import{readFileSync as TL}from"node:fs";function og(t){return bL(t)}function bL(t){let e=Xi(kL(t));if(vL(e),ig(e)===3)return SL(e);let r=qi.safeParse(e);if(!r.success)throw new Vt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=IL(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Vt(n);return r.data}function SL(t){let e=xt.safeParse(t);if(!e.success)throw new Vt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function vL(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=ig(t);if(!(e===null||ng.includes(e)))throw new Vt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${ng.join(", ")}`}]})}function ig(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 kL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1754
+ ${pn}`:pn;return e.setMemberPromptSnapshot(o.id,l)??o}function oL(t){return`${B$(t.local_path)}-code`}var K_,Eu=E(()=>{"use strict";ws();ti();ks();ru();nu();We();Ur();gu();pe();eu();K_="spec-driven-task"});import Z_ from"jexl";function gr(t){Z_.compile(Q_(t))}async function Wr(t,e){return Z_.eval(Q_(t),e)}function Q_(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Sn=E(()=>{"use strict"});import{z as T}from"zod";function Nu(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var iL,eg,Tu,bu,Su,vu,ku,Iu,tg,aL,lL,cL,js,uL,Ui,Wi,Bi,Hi,qi,rg,dL,fL,mL,pL,Ji,vn=E(()=>{"use strict";Sn();iL=T.object({kind:T.enum(["success","neutral","failure"])}),eg=T.enum(["string","number","boolean","object","array"]),Tu=T.object({name:T.string().min(1),type:eg,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),bu=T.object({name:T.string().min(1),type:eg,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),Su=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),vu="__failure__",ku=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),Iu=T.object({on_unhandled_failure:T.object({attention_kind:T.string().min(1).default("workflow_failed"),severity:T.enum(["warn","error","critical"]).default("warn"),capture_evidence:T.boolean().default(!0),recommend_recovery:T.string().min(1).optional()}).optional(),on_unhandled_failure_state:T.string().min(1).optional()}).optional(),tg=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),aL=T.object({name:T.string().min(1),command:T.string().min(1).optional(),args:T.array(T.string()).optional(),env:T.record(T.string(),T.string()).optional(),type:T.enum(["stdio","http","sse"]).optional(),url:T.string().min(1).optional(),headers:T.record(T.string(),T.string()).optional()}).strict(),lL=T.union([T.string().min(1),aL]),cL=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),js=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(lL).optional(),skills:T.array(cL).optional()}),uL=T.object({kind:T.literal("shell"),command:T.string().min(1),description:T.string().optional()}),Ui=T.object({type:T.literal("Review"),state_name:T.string().min(1),coder:js,pre_checks:T.array(uL).optional(),reviewers:T.array(js.extend({rubric_artifact:T.string().optional()})).optional(),outcomes:T.object({approve:T.string().min(1),request_changes:T.string().optional(),fail_pre_check:T.string().optional(),max_loops_exceeded:T.string().optional()}),writes_to_project_path:T.boolean().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional(),max_loops:T.number().int().positive().default(5),loop_feedback_artifact:T.string().optional(),outcomes_from_stance:T.record(T.string(),T.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Wi=T.object({type:T.literal("Consolidate"),state_name:T.string().min(1),researchers:T.array(js.extend({topic:T.string().min(1)})).optional(),consolidator:js,outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),research_artifact_prefix:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Bi=T.object({type:T.literal("Interactive"),state_name:T.string().min(1),agent:js.extend({initial_prompt_template:T.string().min(1)}),termination:T.object({operator_signal:T.boolean().default(!0),agent_signal:T.string().optional(),max_turns:T.number().int().positive().default(20),timeout_seconds:T.number().int().positive().optional()}),outcomes:T.object({done:T.string().min(1),timeout:T.string().optional()}),artifact_name:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Hi=T.object({type:T.literal("Loop"),state_name:T.string().min(1),over:T.string().min(1),item_var:T.string().min(1),body:T.string().min(1),outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),stop_on_error:T.boolean().default(!0),max_items:T.number().int().positive().default(1e3)}),qi=T.object({type:T.literal("ShellStep"),state_name:T.string().min(1),command:T.string().min(1),outcomes_from_exit:T.record(T.string(),T.string().min(1)),timeout_ms:T.number().int().nonnegative().optional(),capture_output_to:T.string().optional(),writes_to_project_path:T.boolean().optional()}),rg=T.object({type:T.literal("Choice"),state_name:T.string().min(1),branches:T.array(T.object({when:T.string().min(1),next:T.string().min(1)})).default([]),default_next:T.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{gr(Nu(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}`})}}),dL=T.discriminatedUnion("type",[tg,Ui,Wi,Bi,Hi,qi,rg]),fL=T.object({type:T.literal("ForEach"),state_name:T.string().min(1),items_from:T.string().min(1),mode:T.enum(["sequential","parallel"]).default("sequential"),max_concurrency:T.number().int().positive().default(1),on_item_failure:T.enum(["continue","stop"]).default("stop"),body:dL,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((t,e)=>{try{gr(Nu(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}`})}}),mL=T.object({type:T.literal("Subflow"),state_name:T.string().min(1),workflow_name:T.string().min(1),inputs:T.record(T.string(),T.string().min(1)).optional(),outcomes:T.record(T.string(),T.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{gr(Nu(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),pL=T.discriminatedUnion("type",[tg,Ui,Wi,Bi,Hi,qi,rg,fL,mL]),Ji=T.object({name:T.string().min(1),version:T.number().int().positive(),definition_schema_version:T.union([T.literal(1),T.literal(2)]),description:T.string().optional(),estimated_duration_ms:T.number().int().nonnegative().optional(),primitive_version:T.union([T.literal(1),T.literal(2)]).default(1),start_at:T.string().min(1),states:T.record(T.string().min(1),pL),terminals:T.record(T.string().min(1),iL),errors:Iu,concurrency_key:T.string().min(1).optional(),concurrent_limit:T.number().int().positive().optional(),default_task_timeout_ms:T.number().int().positive().max(216e5).optional(),inputs:T.array(Tu).optional(),outputs:T.array(bu).optional(),triggers:T.array(Su).optional(),read_only:T.boolean().optional(),requires:ku}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var hL,Xi,_L,gL,yL,xt,kn=E(()=>{"use strict";vn();hL=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Xi=Q.string().regex(hL),_L=Q.object({step_id:Xi,type:Q.literal("main"),index:Q.number().int().min(0)}),gL=Q.record(Xi,Q.record(Q.string().min(1),Q.array(Q.array(_L)))),yL=Q.object({id:Xi,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()}),xt=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:Iu,inputs:Q.array(Tu).optional(),outputs:Q.array(bu).optional(),steps:Q.array(yL).min(1),connections:gL.default({}),entry_step_id:Xi,triggers:Q.array(Su).optional(),read_only:Q.boolean().optional(),requires:ku}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Gi(t){return Au(t)}function Au(t){if(Array.isArray(t))return t.map(Au);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Au(e[n]);if(typeof r.type=="string"){let n=EL[r.type];n!==void 0&&(r.type=n)}return r}var xu,wL,EL,Ru=E(()=>{"use strict";xu="lmctl.builtin.",wL={Review:`${xu}Review`,Research:`${xu}Research`,Consolidate:`${xu}Consolidate`},EL=Object.fromEntries(Object.entries(wL).map(([t,e])=>[e,t]))});import{readFileSync as TL}from"node:fs";function og(t){return bL(t)}function bL(t){let e=Gi(kL(t));if(vL(e),ig(e)===3)return SL(e);let r=Ji.safeParse(e);if(!r.success)throw new Vt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=IL(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Vt(n);return r.data}function SL(t){let e=xt.safeParse(t);if(!e.success)throw new Vt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function vL(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=ig(t);if(!(e===null||ng.includes(e)))throw new Vt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${ng.join(", ")}`}]})}function ig(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 kL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1749
1755
  `)||e.startsWith("{")||e.startsWith("[")?sg(t,"$"):e.endsWith(".json")?sg(TL(e,"utf8"),e):t}function sg(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Vt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function IL(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"}),NL(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function NL(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 ng,Vt,ag=E(()=>{"use strict";vn();kn();Ru();ng=[1,2,3],Vt=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 xL}from"node:crypto";function lg(t,e){let r=AL(e),n=xL("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function AL(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var cg=E(()=>{"use strict";kn()});function LL(t,e){let r=$L[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 mg(t){let e=[],r=(I,N)=>{throw new In([{line:I,message:N}])},n=t.split(`
1750
- `),s=[];for(let I=0;I<n.length;I+=1){let O=CL(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,N,O,q,B,F)=>{l.has(I)&&r(q,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(q,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:N,params:O,line:q,isTerminal:B,...F?{members:F}:{}}),u.push(I)},S=I=>{let N=[],O=I+1;for(;O<s.length;O+=1){let q=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(q===null)break;N.push({label:q[1],dst:q[2]})}return{branches:N,nextIdx:O-1}};for(let I=1;I<s.length;I+=1){let{n:N,text:O}=s[I],q=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){I!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let B=/^meta\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),F=yr(B[1],N,r);for(let te of Object.keys(F))dg.has(te)||r(N,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...dg].join(", ")} (no grammar inflation; bounded)`);m=F;continue}if(q==="step"){let B=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),F=B[1],te=B[2],Ee=B[3],ae=ug[te];ae===void 0&&r(N,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(ug).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Se,members:Mt}=LL(ae,yr(Ee,N,r));_(F,ae,Se,N,!1,Object.keys(Mt).length>0?Mt:void 0);continue}if(q==="trigger"){let B=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),F=B[1],te=B[2],Ee=B[3],ae=fg[te];ae===void 0&&r(N,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(fg).join(", ")})`),p.has(F)&&r(N,`duplicate trigger id: ${F}`),p.set(F,{id:F,type:ae,parameters:yr(Ee,N,r)});continue}if(q==="mcp"||q==="skill"){let B=new RegExp(`^${q}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${q}\` decl (expected \`${q} <name> = {json} | ${q} <name> = "<file|url>"\`): ${O}`),F=B[1],te=B[2].trim(),Ee=q==="mcp"?h:g;Ee.has(F)&&r(N,`duplicate ${q} declaration: ${F}`);let ae;if(te.startsWith("{")){let Se=yr(te,N,r);q==="mcp"?ae={...Se,name:F}:((typeof Se.content!="string"||Se.content.length===0)&&r(N,`\`skill ${F}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ae={name:F,content:Se.content})}else{let Se=pg(te);(typeof Se!="string"||Se.length===0)&&r(N,`\`${q} ${F}\`: string form must be a non-empty file path or http(s) URL`),ae=Se}Ee.set(F,ae);continue}if(q==="terminal"){let B=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(B[1],"lmctl/terminal",{name:B[2],kind:B[3]??"neutral"},N,!0);continue}if(q==="seq"){let F=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(F.length<3||F.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<F.length+1&&!(te+2>F.length-1);te+=2){let Ee=F[te],ae=F[te+1],Se=F[te+2],Mt=ae==="->"?"main":ae.slice(1,-2);c.push({srcDeclId:Ee,port:Mt,dstDeclId:Se,line:N})}continue}if(q==="choice"){let F=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],Ee,ae=I+1;for(;ae<s.length;ae+=1){let Se=s[ae].text,Mt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(Mt!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${F}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Yn=Mt[2];te.push({when:Mt[1].trim(),next:`@terminal:${Yn}`}),c.push({srcDeclId:F,port:Yn,dstDeclId:Mt[3],line:s[ae].n});continue}let Sl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(Sl!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${F}\` has more than one \`default\``);let Yn=Sl[1];Ee=`@terminal:${Yn}`,c.push({srcDeclId:F,port:Yn,dstDeclId:Sl[2],line:s[ae].n});continue}break}te.length===0&&r(N,`\`choice ${F}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(F,"lmctl/choice",{branches:te,...Ee!==void 0?{default_next:Ee}:{}},N,!1),I=ae-1;continue}if(q==="loop"){let B=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(B[1],"lmctl/loop",yr(B[2],N,r),N,!1);continue}if(q==="foreach"){let B=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),F=yr(B[2],N,r);"mode"in F&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(B[1],"lmctl/foreach",F,N,!1);continue}if(q==="call"){let B=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),F=B[1],te=yr(B[2],N,r),Ee=te.workflow;(typeof Ee!="string"||Ee.length===0)&&r(N,`\`call ${F}\` requires a \`workflow=<name>\` argument`);let{workflow:ae,...Se}=te;_(F,"lmctl/subflow",{workflow_name:Ee,...Se},N,!1),d.push({declId:F,target:Ee,line:N});continue}if(q==="decide"){let B=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),F=B[1],te=yr(B[2],N,r),{branches:Ee,nextIdx:ae}=S(I);Ee.length===0&&r(N,`\`decide ${F}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(F,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:te});for(let Se of Ee)c.push({srcDeclId:F,port:Se.label,dstDeclId:Se.dst,line:N});I=ae;continue}if(q==="entry"){let B=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=B[1];continue}r(N,`unknown statement \`${q}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let w=I=>{if(Array.isArray(I)){for(let O of I)w(O);return}if(typeof I!="object"||I===null)return;let N=I;if(typeof N.alias=="string")for(let[O,q]of[["mcp",h],["skills",g]]){let B=N[O];Array.isArray(B)&&(N[O]=B.map(F=>typeof F=="string"&&q.has(F)?structuredClone(q.get(F)):F))}for(let O of Object.values(N))w(O)};for(let I of u){let N=l.get(I);N.members!==void 0&&w(N.members)}let b=I=>lg(i,I),x=u.map(I=>{let N=l.get(I);return{id:b(I),name:I,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.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 N=b(I.srcDeclId);k[N]??={},k[N][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),k[N][I.port]=[[{step_id:b(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let N=l.get(I);jL.has(N.type)||r(N.line,`unknown archetype \`${N.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 j=new Map;for(let I of c){let N=j.get(I.srcDeclId);N===void 0?j.set(I.srcDeclId,[I.dstDeclId]):N.push(I.dstDeclId)}for(let I of u){let N=l.get(I);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let q=j.get(I);q===void 0?j.set(I,[O]):q.push(O)}}let V=new Set([f]),W=[f];for(;W.length>0;){let I=W.shift();for(let N of j.get(I)??[])V.has(N)||(V.add(N),W.push(N))}for(let I of u)V.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let M=new Map;for(let I of c){let N=M.get(I.srcDeclId);N===void 0&&(N=new Set,M.set(I.srcDeclId,N)),N.add(I.port)}let $=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let N=l.get(I);if(N.isTerminal)continue;let O=M.get(I)??new Set;if(N.type==="lmctl/review"){let B=[...O].some(F=>!$.has(F));!O.has("approve")&&!B&&r(N.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let q=OL[N.type];if(q!==void 0)for(let B of q)O.has(B)||r(N.line,`uncovered outcome: required outcome \`${B}\` of step \`${I}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${I} -${B}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${I}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let N=l.get(I),O=RL[N.type];if(O===void 0)continue;let q={...N.params,...N.members??{},type:O.v2type,state_name:I,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},B=O.schema.safeParse(q);if(!B.success){let F=B.error.issues[0],te=F.path.length===0?"$":F.path.map(String).join(".");r(N.line,`step \`${I}\` (\`${N.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${F.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let Z={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:x,connections:k,entry_step_id:b(f)},J=xt.safeParse(Z);if(!J.success)throw new In(J.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return J.data}function CL(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 yr(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 ML(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]=pg(l)}return s}function ML(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function pg(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 RL,$L,ug,In,jL,OL,dg,fg,hg=E(()=>{"use strict";kn();cg();vn();RL={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Fi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Ui},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Wi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Bi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Hi}},$L={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ug={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"},In=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1756
+ `),s=[];for(let I=0;I<n.length;I+=1){let O=CL(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,N,O,q,B,F)=>{l.has(I)&&r(q,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(q,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:N,params:O,line:q,isTerminal:B,...F?{members:F}:{}}),u.push(I)},S=I=>{let N=[],O=I+1;for(;O<s.length;O+=1){let q=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(q===null)break;N.push({label:q[1],dst:q[2]})}return{branches:N,nextIdx:O-1}};for(let I=1;I<s.length;I+=1){let{n:N,text:O}=s[I],q=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){I!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let B=/^meta\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),F=yr(B[1],N,r);for(let te of Object.keys(F))dg.has(te)||r(N,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...dg].join(", ")} (no grammar inflation; bounded)`);m=F;continue}if(q==="step"){let B=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),F=B[1],te=B[2],Ee=B[3],ae=ug[te];ae===void 0&&r(N,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(ug).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Se,members:Mt}=LL(ae,yr(Ee,N,r));_(F,ae,Se,N,!1,Object.keys(Mt).length>0?Mt:void 0);continue}if(q==="trigger"){let B=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),F=B[1],te=B[2],Ee=B[3],ae=fg[te];ae===void 0&&r(N,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(fg).join(", ")})`),p.has(F)&&r(N,`duplicate trigger id: ${F}`),p.set(F,{id:F,type:ae,parameters:yr(Ee,N,r)});continue}if(q==="mcp"||q==="skill"){let B=new RegExp(`^${q}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${q}\` decl (expected \`${q} <name> = {json} | ${q} <name> = "<file|url>"\`): ${O}`),F=B[1],te=B[2].trim(),Ee=q==="mcp"?h:g;Ee.has(F)&&r(N,`duplicate ${q} declaration: ${F}`);let ae;if(te.startsWith("{")){let Se=yr(te,N,r);q==="mcp"?ae={...Se,name:F}:((typeof Se.content!="string"||Se.content.length===0)&&r(N,`\`skill ${F}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ae={name:F,content:Se.content})}else{let Se=pg(te);(typeof Se!="string"||Se.length===0)&&r(N,`\`${q} ${F}\`: string form must be a non-empty file path or http(s) URL`),ae=Se}Ee.set(F,ae);continue}if(q==="terminal"){let B=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(B[1],"lmctl/terminal",{name:B[2],kind:B[3]??"neutral"},N,!0);continue}if(q==="seq"){let F=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(F.length<3||F.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<F.length+1&&!(te+2>F.length-1);te+=2){let Ee=F[te],ae=F[te+1],Se=F[te+2],Mt=ae==="->"?"main":ae.slice(1,-2);c.push({srcDeclId:Ee,port:Mt,dstDeclId:Se,line:N})}continue}if(q==="choice"){let F=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],Ee,ae=I+1;for(;ae<s.length;ae+=1){let Se=s[ae].text,Mt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(Mt!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${F}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Yn=Mt[2];te.push({when:Mt[1].trim(),next:`@terminal:${Yn}`}),c.push({srcDeclId:F,port:Yn,dstDeclId:Mt[3],line:s[ae].n});continue}let vl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(vl!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${F}\` has more than one \`default\``);let Yn=vl[1];Ee=`@terminal:${Yn}`,c.push({srcDeclId:F,port:Yn,dstDeclId:vl[2],line:s[ae].n});continue}break}te.length===0&&r(N,`\`choice ${F}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(F,"lmctl/choice",{branches:te,...Ee!==void 0?{default_next:Ee}:{}},N,!1),I=ae-1;continue}if(q==="loop"){let B=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(B[1],"lmctl/loop",yr(B[2],N,r),N,!1);continue}if(q==="foreach"){let B=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),F=yr(B[2],N,r);"mode"in F&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(B[1],"lmctl/foreach",F,N,!1);continue}if(q==="call"){let B=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),F=B[1],te=yr(B[2],N,r),Ee=te.workflow;(typeof Ee!="string"||Ee.length===0)&&r(N,`\`call ${F}\` requires a \`workflow=<name>\` argument`);let{workflow:ae,...Se}=te;_(F,"lmctl/subflow",{workflow_name:Ee,...Se},N,!1),d.push({declId:F,target:Ee,line:N});continue}if(q==="decide"){let B=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),F=B[1],te=yr(B[2],N,r),{branches:Ee,nextIdx:ae}=S(I);Ee.length===0&&r(N,`\`decide ${F}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(F,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:te});for(let Se of Ee)c.push({srcDeclId:F,port:Se.label,dstDeclId:Se.dst,line:N});I=ae;continue}if(q==="entry"){let B=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=B[1];continue}r(N,`unknown statement \`${q}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let w=I=>{if(Array.isArray(I)){for(let O of I)w(O);return}if(typeof I!="object"||I===null)return;let N=I;if(typeof N.alias=="string")for(let[O,q]of[["mcp",h],["skills",g]]){let B=N[O];Array.isArray(B)&&(N[O]=B.map(F=>typeof F=="string"&&q.has(F)?structuredClone(q.get(F)):F))}for(let O of Object.values(N))w(O)};for(let I of u){let N=l.get(I);N.members!==void 0&&w(N.members)}let b=I=>lg(i,I),x=u.map(I=>{let N=l.get(I);return{id:b(I),name:I,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.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 N=b(I.srcDeclId);k[N]??={},k[N][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),k[N][I.port]=[[{step_id:b(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let N=l.get(I);jL.has(N.type)||r(N.line,`unknown archetype \`${N.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 j=new Map;for(let I of c){let N=j.get(I.srcDeclId);N===void 0?j.set(I.srcDeclId,[I.dstDeclId]):N.push(I.dstDeclId)}for(let I of u){let N=l.get(I);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let q=j.get(I);q===void 0?j.set(I,[O]):q.push(O)}}let V=new Set([f]),W=[f];for(;W.length>0;){let I=W.shift();for(let N of j.get(I)??[])V.has(N)||(V.add(N),W.push(N))}for(let I of u)V.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let M=new Map;for(let I of c){let N=M.get(I.srcDeclId);N===void 0&&(N=new Set,M.set(I.srcDeclId,N)),N.add(I.port)}let $=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let N=l.get(I);if(N.isTerminal)continue;let O=M.get(I)??new Set;if(N.type==="lmctl/review"){let B=[...O].some(F=>!$.has(F));!O.has("approve")&&!B&&r(N.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let q=OL[N.type];if(q!==void 0)for(let B of q)O.has(B)||r(N.line,`uncovered outcome: required outcome \`${B}\` of step \`${I}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${I} -${B}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${I}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let N=l.get(I),O=RL[N.type];if(O===void 0)continue;let q={...N.params,...N.members??{},type:O.v2type,state_name:I,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},B=O.schema.safeParse(q);if(!B.success){let F=B.error.issues[0],te=F.path.length===0?"$":F.path.map(String).join(".");r(N.line,`step \`${I}\` (\`${N.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${F.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let Z={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:x,connections:k,entry_step_id:b(f)},J=xt.safeParse(Z);if(!J.success)throw new In(J.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return J.data}function CL(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 yr(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 ML(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]=pg(l)}return s}function ML(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function pg(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 RL,$L,ug,In,jL,OL,dg,fg,hg=E(()=>{"use strict";kn();cg();vn();RL={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Ui},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Wi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Bi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Hi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:qi}},$L={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ug={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"},In=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1751
1757
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1752
1758
  `)}`),this.issues=e,this.name="DslCompileError"}},jL=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"]),OL={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},dg=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),fg={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as DL}from"node:fs";function PL(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function FL(t){for(let e of t.split(`
1753
- `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function De(t){if(typeof t=="string"&&PL()&&FL(t)){let r;try{r=mg(t)}catch(s){throw s instanceof In?new Yt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=xt.safeParse(r);if(!n.success)throw new Yt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Xi(WL(t));if(BL(e)&&e.definition_schema_version===3){let r=xt.safeParse(e);if(!r.success)throw new Yt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return UL(e)}function UL(t){let e=qi.safeParse(t);if(!e.success)throw new Yt(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new Yt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return og(r)}catch(s){throw s instanceof Vt?new $u(s):s}}function WL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1754
- `)||e.startsWith("{")||e.startsWith("[")?_g(t):e.endsWith(".json")?_g(DL(e,"utf8")):t}function _g(t){return JSON.parse(t)}function BL(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var $u,Yt,Nn=E(()=>{"use strict";vn();ag();Ru();kn();hg();$u=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Yt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Gi(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:HL(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:JL(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function HL(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=qL(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function qL(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 JL(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Lu=E(()=>{"use strict"});var gg={};ne(gg,{enqueueFromAgentOutput:()=>GL,enqueueFromGitHubIssue:()=>ju,enqueueManual:()=>XL,enqueueScheduled:()=>KL});function ju(t,e){return Vi(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:Ki(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function XL(t,e){return Vi(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:Ki(e.payload),concurrency_key:e.concurrency_key})}function GL(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Vi(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:Ki(e.payload),concurrency_key:e.concurrency_key})}function KL(t,e){return Vi(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:Ki(e.payload),concurrency_key:e.concurrency_key})}function Ki(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Vi(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=De(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=Gi({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Ou=E(()=>{"use strict";Nn();Lu()});async function wg(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return yg(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 VL(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...YL(o.parameters_override)},l=yg(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 yg(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[ju(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function VL(t,e){if(t===null||t.trim().length===0)return!0;try{return await Wr(t,e)===!0}catch{return!1}}function YL(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 Eg=E(()=>{"use strict";Sn();Ou()});import{spawnSync as zL}from"node:child_process";async function Mu(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=zL(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(!QL(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await wg({dal:t.dal,project:t.project,issue:ej(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function xn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=ZL(r.intake_config);try{let s=await Mu({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 ZL(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Cu(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 QL(t){return Array.isArray(t)&&t.every(e=>{if(!Cu(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:Cu(n)&&typeof n.name=="string"))})}function ej(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 Cu(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Yi=E(()=>{"use strict";Eg()});function bg(t){return async e=>rj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function rj(t,e,r={}){let n=nj(e.path),s={"content-type":"application/json",...e.headers??{},[zi]:Du},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 sj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Tg(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} ${Tg(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Tg(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function nj(t){let e=t.startsWith("/")?t:`/${t}`;return`${tj}${e}`}async function sj(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()!==zi&&(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 zi,Du,tj,Pu=E(()=>{"use strict";zi="x-mailbox-channel",Du="1",tj="http://mailbox.local"});import{createHash as Sg,createHmac as oj,timingSafeEqual as ij}from"node:crypto";function vg(){return async(t,e)=>{let r=kg();if(r===null||dj(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(zi)===Du){await e();return}let n=t.req.query("token");if(n!==void 0&&Zi(n,r)){Uu(t,r),await e();return}if(uj(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 kg(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Ig(t){let e=kg();return e!==null&&Zi(t,e)}function Uu(t,e,r=new Date){t.header("Set-Cookie",`${Fu}=${lj(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Ng(t){t.header("Set-Cookie",`${Fu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function lj(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+aj*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${xg(t,n)}`,"utf8").toString("base64url")}function cj(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:Zi(s[2],xg(e,`${s[0]}|${s[1]}`))}function Zi(t,e){return ij(Sg("sha256").update(t).digest(),Sg("sha256").update(e).digest())}function uj(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&Zi(r,e))return!0;let n=fj(t.req.header("cookie")??"")[Fu];return n!==void 0&&cj(n,e)}function dj(t){return t==="/login"||t==="/logout"}function fj(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 xg(t,e){return oj("sha256",t).update(e).digest("hex")}var Fu,aj,Ag=E(()=>{"use strict";Pu();Fu="lmctl_next_session",aj=30});import{existsSync as An,mkdirSync as mj,readdirSync as pj,readFileSync as Qi,unlinkSync as hj,writeFileSync as Hu}from"node:fs";import{join as Br}from"node:path";function nt(t){if(!_j.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function $g(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 Ej(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:Rg,updated_at:Rg}:null}function gj(t,e,r,n){let s=r!==null?`
1759
+ `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function De(t){if(typeof t=="string"&&PL()&&FL(t)){let r;try{r=mg(t)}catch(s){throw s instanceof In?new Yt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=xt.safeParse(r);if(!n.success)throw new Yt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Gi(WL(t));if(BL(e)&&e.definition_schema_version===3){let r=xt.safeParse(e);if(!r.success)throw new Yt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return UL(e)}function UL(t){let e=Ji.safeParse(t);if(!e.success)throw new Yt(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new Yt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return og(r)}catch(s){throw s instanceof Vt?new $u(s):s}}function WL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1760
+ `)||e.startsWith("{")||e.startsWith("[")?_g(t):e.endsWith(".json")?_g(DL(e,"utf8")):t}function _g(t){return JSON.parse(t)}function BL(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var $u,Yt,Nn=E(()=>{"use strict";vn();ag();Ru();kn();hg();$u=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Yt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Ki(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:HL(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:JL(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function HL(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=qL(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function qL(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 JL(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Lu=E(()=>{"use strict"});var gg={};ne(gg,{enqueueFromAgentOutput:()=>GL,enqueueFromGitHubIssue:()=>ju,enqueueManual:()=>XL,enqueueScheduled:()=>KL});function ju(t,e){return Yi(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:Vi(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function XL(t,e){return Yi(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:Vi(e.payload),concurrency_key:e.concurrency_key})}function GL(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Yi(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:Vi(e.payload),concurrency_key:e.concurrency_key})}function KL(t,e){return Yi(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:Vi(e.payload),concurrency_key:e.concurrency_key})}function Vi(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Yi(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=De(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=Ki({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Ou=E(()=>{"use strict";Nn();Lu()});async function wg(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return yg(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 VL(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...YL(o.parameters_override)},l=yg(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 yg(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[ju(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function VL(t,e){if(t===null||t.trim().length===0)return!0;try{return await Wr(t,e)===!0}catch{return!1}}function YL(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 Eg=E(()=>{"use strict";Sn();Ou()});import{spawnSync as zL}from"node:child_process";async function Mu(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=zL(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(!QL(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await wg({dal:t.dal,project:t.project,issue:ej(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function xn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=ZL(r.intake_config);try{let s=await Mu({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 ZL(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Cu(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 QL(t){return Array.isArray(t)&&t.every(e=>{if(!Cu(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:Cu(n)&&typeof n.name=="string"))})}function ej(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 Cu(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var zi=E(()=>{"use strict";Eg()});function bg(t){return async e=>rj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function rj(t,e,r={}){let n=nj(e.path),s={"content-type":"application/json",...e.headers??{},[Zi]:Du},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 sj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Tg(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} ${Tg(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Tg(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function nj(t){let e=t.startsWith("/")?t:`/${t}`;return`${tj}${e}`}async function sj(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()!==Zi&&(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 Zi,Du,tj,Pu=E(()=>{"use strict";Zi="x-mailbox-channel",Du="1",tj="http://mailbox.local"});import{createHash as Sg,createHmac as oj,timingSafeEqual as ij}from"node:crypto";function vg(){return async(t,e)=>{let r=kg();if(r===null||dj(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Zi)===Du){await e();return}let n=t.req.query("token");if(n!==void 0&&Qi(n,r)){Uu(t,r),await e();return}if(uj(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 kg(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Ig(t){let e=kg();return e!==null&&Qi(t,e)}function Uu(t,e,r=new Date){t.header("Set-Cookie",`${Fu}=${lj(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Ng(t){t.header("Set-Cookie",`${Fu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function lj(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+aj*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${xg(t,n)}`,"utf8").toString("base64url")}function cj(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:Qi(s[2],xg(e,`${s[0]}|${s[1]}`))}function Qi(t,e){return ij(Sg("sha256").update(t).digest(),Sg("sha256").update(e).digest())}function uj(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&Qi(r,e))return!0;let n=fj(t.req.header("cookie")??"")[Fu];return n!==void 0&&cj(n,e)}function dj(t){return t==="/login"||t==="/logout"}function fj(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 xg(t,e){return oj("sha256",t).update(e).digest("hex")}var Fu,aj,Ag=E(()=>{"use strict";Pu();Fu="lmctl_next_session",aj=30});import{existsSync as An,mkdirSync as mj,readdirSync as pj,readFileSync as ea,unlinkSync as hj,writeFileSync as Hu}from"node:fs";import{join as Br}from"node:path";function nt(t){if(!_j.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function $g(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 Ej(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:Rg,updated_at:Rg}:null}function gj(t,e,r,n){let s=r!==null?`
1755
1761
  description: ${r}`:"";return`---
1756
1762
  name: ${t}${s}
1757
1763
  type: ${e}
1758
1764
  ---
1759
- ${n}`}function yj(t,e,r,n){let s=Br(t,qu),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=An(s)?Qi(s,"utf8"):"",a=new RegExp(`^- \\[${Lg(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1765
+ ${n}`}function yj(t,e,r,n){let s=Br(t,qu),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=An(s)?ea(s,"utf8"):"",a=new RegExp(`^- \\[${Lg(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1760
1766
  `)?`${i}
1761
1767
  ${o}
1762
1768
  `:`${i}${o}
1763
- `,Hu(s,i,"utf8")}function wj(t,e){let r=Br(t,qu);if(!An(r))return;let n=Qi(r,"utf8"),s=new RegExp(`^- \\[${Lg(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Hu(r,n.replace(s,""),"utf8")}function Lg(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ej(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ht(t,e){return t.durable_memory_mode==="db"?new Bu(e,t.id):new Wu(t.local_path)}var _j,qu,Rg,Wu,Bu,Ju=E(()=>{"use strict";_j=/^[a-zA-Z0-9_-]+$/;qu="MEMORY.md",Rg="1970-01-01T00:00:00.000Z",Wu=class{dir;constructor(e){this.dir=Br(e,"durable-memory")}read(e){nt(e);let r=Br(this.dir,`${e}.md`);if(!An(r))return null;let n=Qi(r,"utf8");return $g(e,n)}write(e){nt(e.name),mj(this.dir,{recursive:!0});let r=Br(this.dir,`${e.name}.md`),n=!An(r),s=gj(e.name,e.type,e.description??null,e.body);return Hu(r,s,"utf8"),yj(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){nt(e);let r=Br(this.dir,`${e}.md`);return An(r)?(hj(r),wj(this.dir,e),!0):!1}listFiles(){if(!An(this.dir))return[];let e=pj(this.dir).filter(n=>n.endsWith(".md")&&n!==qu),r=[];for(let n of e){let s=n.slice(0,-3),o=Qi(Br(this.dir,n),"utf8"),i=$g(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Bu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){nt(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(e){nt(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return nt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Og(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ht(o,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=ht(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!jg.has(a))return n.json({error:`invalid type: must be one of ${[...jg].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ht(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ht(o,r),a=n.req.query("type");return n.json(i.list(a))})}var jg,Cg=E(()=>{"use strict";Ju();jg=new Set(["user","feedback","project","reference"])});function bj(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(Tj[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function Sj(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 Mg(t,e=new Date){let{time:r,date:n}=Sj(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=bj(h.data),S=h.data.length,w=new Uint8Array(30+g.length),b=new DataView(w.buffer);b.setUint32(0,67324752,!0),b.setUint16(4,20,!0),b.setUint16(6,0,!0),b.setUint16(8,0,!0),b.setUint16(10,r,!0),b.setUint16(12,n,!0),b.setUint32(14,_,!0),b.setUint32(18,S,!0),b.setUint32(22,S,!0),b.setUint16(26,g.length,!0),b.setUint16(28,0,!0),w.set(g,30),s.push(w,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,S,!0),k.setUint32(24,S,!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+=w.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var Tj,Dg=E(()=>{"use strict";Tj=(()=>{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 ra,mkdirSync as vj,readdirSync as kj,readFileSync as Ug,statSync as Ij,unlinkSync as Nj,writeFileSync as xj}from"node:fs";import{join as Ms}from"node:path";function Wg(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await _t(n);if(typeof s=="string")return L(n,s,400);let o=ce(s,"name"),i=ce(s,"local_path");if(o===null||o.length===0)return L(n,"missing or empty name",400);if(i===null||i.length===0)return L(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return L(n,`project already exists: ${o}`,409);let a=ce(s,"workflow_name")??"bugfix",l,c=ce(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return L(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return L(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ce(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return L(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 L(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 L(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 L(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 L(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?L(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await _t(n);if(typeof s=="string")return L(n,s,400);let o=ce(s,"name");if(o===null||o.length===0)return L(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return L(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 L(n,"team not found",404);let o=await _t(n);if(typeof o=="string")return L(n,o,400);let i=ce(o,"alias"),a=ce(o,"provider");if(i===null||i.length===0)return L(n,"missing or empty alias",400);if(a===null||a.length===0)return L(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return L(n,`member already exists: ${i}`,409);let l=ce(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ce(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return L(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return L(n,"member not found",404);let i=await _t(n);if(typeof i=="string")return L(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 L(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 L(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 L(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return L(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?L(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 L(n,"project not found",404);let o=ht(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return L(n,o,400);let i=ce(o,"name"),a=ce(o,"body"),l=ce(o,"type");if(i===null||i.length===0)return L(n,"missing or empty name",400);if(a===null)return L(n,"missing body",400);if(l===null||!ea.includes(l))return L(n,`invalid type: must be one of ${ea.join("|")}`,400);try{nt(i)}catch(d){return L(n,d.message,400)}let c=ht(s,r);try{if(c.read(i)!==null)return L(n,`chapter already exists: ${i}`,409)}catch(d){return L(n,d.message,400)}try{c.write({type:l,name:i,description:ce(o,"description"),body:a})}catch(d){return L(n,d.message,400)}let u=c.read(i);return u===null?L(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 L(n,"project not found",404);let o=ht(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return L(n,a.message,400)}return i===null?L(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 L(n,"project not found",404);let o=n.req.param("chapter"),i=await _t(n);if(typeof i=="string")return L(n,i,400);let a=ht(s,r),l;try{l=a.read(o)}catch(m){return L(n,m.message,400)}if(l===null)return L(n,"chapter not found",404);let c=ce(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ce(i,"description"):l.description,d=ce(i,"type")??l.type;if(!ea.includes(d))return L(n,`invalid type: must be one of ${ea.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return L(n,m.message,400)}let f=a.read(o);return f===null?L(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 L(n,"project not found",404);let o=ht(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return L(n,a.message,400)}return i?n.json({removed:!0}):L(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?L(n,"project not found",404):n.json(Rj(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return L(n,o,400);let i=ce(o,"name"),a=ce(o,"body"),l=ce(o,"type");if(i===null||i.length===0)return L(n,"missing or empty name",400);if(a===null)return L(n,"missing body",400);if(l===null||!ta.has(l))return L(n,`invalid type: must be one of ${[...ta].join("|")}`,400);try{nt(i)}catch(f){return L(n,f.message,400)}let c=Os(s.local_path),u=Ms(c,`${i}.md`);if(ra(u))return L(n,`chapter already exists: ${i}`,409);vj(c,{recursive:!0}),Fg(u,i,l,ce(o,"description"),a);let d=Cs(c,i);return d===null?L(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 L(n,"project not found",404);try{nt(n.req.param("chapter"))}catch(i){return L(n,i.message,400)}let o=Cs(Os(s.local_path),n.req.param("chapter"));return o===null?L(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 L(n,"project not found",404);let o=n.req.param("chapter");try{nt(o)}catch(m){return L(n,m.message,400)}let i=Os(s.local_path),a=Cs(i,o);if(a===null)return L(n,"chapter not found",404);let l=await _t(n);if(typeof l=="string")return L(n,l,400);let c=ce(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ce(l,"description"):a.description,d=ce(l,"type")??a.type;if(!ta.has(d))return L(n,`invalid type: must be one of ${[...ta].join("|")}`,400);Fg(Ms(i,`${o}.md`),o,d,u,c);let f=Cs(i,o);return f===null?L(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 L(n,"project not found",404);let o=n.req.param("chapter");try{nt(o)}catch(a){return L(n,a.message,400)}let i=Ms(Os(s.local_path),`${o}.md`);return ra(i)?(Nj(i),n.json({removed:!0})):L(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>L(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await _t(n);return typeof s=="string"?L(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Pg))),t.post("/api/chat/sessions",async n=>{let s=await Aj(n);if(typeof s=="string")return L(n,s,400);let o=s!==null?ce(s,"title"):null,i=r.createChatbotSession(Pg,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?L(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 L(n,"chat session not found",404);let o=await _t(n);if(typeof o=="string")return L(n,o,400);let i=ce(o,"role"),a=ce(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return L(n,"role must be one of user|assistant|tool",400);if(a===null)return L(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 L(n,"invalid run id",400);if(r.getRun(s)===null)return L(n,"run not found",404);let i=Pr(r,s),a=[];for(let c of i){let u=Lj(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=Ug(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=Mg(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 L(t,e,r){return t.json({error:e},r)}async function _t(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function Aj(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ce(t,e){let r=t[e];return typeof r!="string"?null:r}function Os(t){return Ms(t,"ai-test")}function Cs(t,e){let r=Ms(t,`${e}.md`);if(!ra(r))return null;let n=Ug(r,"utf8"),s=$j(n),o=Ij(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function Rj(t){let e=Os(t);return ra(e)?kj(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Cs(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 Fg(t,e,r,n,s){let o=n!==null&&n.length>0?`
1769
+ `,Hu(s,i,"utf8")}function wj(t,e){let r=Br(t,qu);if(!An(r))return;let n=ea(r,"utf8"),s=new RegExp(`^- \\[${Lg(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Hu(r,n.replace(s,""),"utf8")}function Lg(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ej(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ht(t,e){return t.durable_memory_mode==="db"?new Bu(e,t.id):new Wu(t.local_path)}var _j,qu,Rg,Wu,Bu,Ju=E(()=>{"use strict";_j=/^[a-zA-Z0-9_-]+$/;qu="MEMORY.md",Rg="1970-01-01T00:00:00.000Z",Wu=class{dir;constructor(e){this.dir=Br(e,"durable-memory")}read(e){nt(e);let r=Br(this.dir,`${e}.md`);if(!An(r))return null;let n=ea(r,"utf8");return $g(e,n)}write(e){nt(e.name),mj(this.dir,{recursive:!0});let r=Br(this.dir,`${e.name}.md`),n=!An(r),s=gj(e.name,e.type,e.description??null,e.body);return Hu(r,s,"utf8"),yj(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){nt(e);let r=Br(this.dir,`${e}.md`);return An(r)?(hj(r),wj(this.dir,e),!0):!1}listFiles(){if(!An(this.dir))return[];let e=pj(this.dir).filter(n=>n.endsWith(".md")&&n!==qu),r=[];for(let n of e){let s=n.slice(0,-3),o=ea(Br(this.dir,n),"utf8"),i=$g(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Bu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){nt(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(e){nt(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return nt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Og(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ht(o,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=ht(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!jg.has(a))return n.json({error:`invalid type: must be one of ${[...jg].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ht(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ht(o,r),a=n.req.query("type");return n.json(i.list(a))})}var jg,Cg=E(()=>{"use strict";Ju();jg=new Set(["user","feedback","project","reference"])});function bj(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(Tj[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function Sj(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 Mg(t,e=new Date){let{time:r,date:n}=Sj(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=bj(h.data),S=h.data.length,w=new Uint8Array(30+g.length),b=new DataView(w.buffer);b.setUint32(0,67324752,!0),b.setUint16(4,20,!0),b.setUint16(6,0,!0),b.setUint16(8,0,!0),b.setUint16(10,r,!0),b.setUint16(12,n,!0),b.setUint32(14,_,!0),b.setUint32(18,S,!0),b.setUint32(22,S,!0),b.setUint16(26,g.length,!0),b.setUint16(28,0,!0),w.set(g,30),s.push(w,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,S,!0),k.setUint32(24,S,!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+=w.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var Tj,Dg=E(()=>{"use strict";Tj=(()=>{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 na,mkdirSync as vj,readdirSync as kj,readFileSync as Ug,statSync as Ij,unlinkSync as Nj,writeFileSync as xj}from"node:fs";import{join as Ms}from"node:path";function Wg(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await _t(n);if(typeof s=="string")return L(n,s,400);let o=ce(s,"name"),i=ce(s,"local_path");if(o===null||o.length===0)return L(n,"missing or empty name",400);if(i===null||i.length===0)return L(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return L(n,`project already exists: ${o}`,409);let a=ce(s,"workflow_name")??"bugfix",l,c=ce(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return L(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return L(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ce(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return L(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 L(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 L(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 L(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 L(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?L(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await _t(n);if(typeof s=="string")return L(n,s,400);let o=ce(s,"name");if(o===null||o.length===0)return L(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return L(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 L(n,"team not found",404);let o=await _t(n);if(typeof o=="string")return L(n,o,400);let i=ce(o,"alias"),a=ce(o,"provider");if(i===null||i.length===0)return L(n,"missing or empty alias",400);if(a===null||a.length===0)return L(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return L(n,`member already exists: ${i}`,409);let l=ce(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ce(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return L(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return L(n,"member not found",404);let i=await _t(n);if(typeof i=="string")return L(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 L(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 L(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 L(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return L(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?L(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 L(n,"project not found",404);let o=ht(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return L(n,o,400);let i=ce(o,"name"),a=ce(o,"body"),l=ce(o,"type");if(i===null||i.length===0)return L(n,"missing or empty name",400);if(a===null)return L(n,"missing body",400);if(l===null||!ta.includes(l))return L(n,`invalid type: must be one of ${ta.join("|")}`,400);try{nt(i)}catch(d){return L(n,d.message,400)}let c=ht(s,r);try{if(c.read(i)!==null)return L(n,`chapter already exists: ${i}`,409)}catch(d){return L(n,d.message,400)}try{c.write({type:l,name:i,description:ce(o,"description"),body:a})}catch(d){return L(n,d.message,400)}let u=c.read(i);return u===null?L(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 L(n,"project not found",404);let o=ht(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return L(n,a.message,400)}return i===null?L(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 L(n,"project not found",404);let o=n.req.param("chapter"),i=await _t(n);if(typeof i=="string")return L(n,i,400);let a=ht(s,r),l;try{l=a.read(o)}catch(m){return L(n,m.message,400)}if(l===null)return L(n,"chapter not found",404);let c=ce(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ce(i,"description"):l.description,d=ce(i,"type")??l.type;if(!ta.includes(d))return L(n,`invalid type: must be one of ${ta.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return L(n,m.message,400)}let f=a.read(o);return f===null?L(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 L(n,"project not found",404);let o=ht(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return L(n,a.message,400)}return i?n.json({removed:!0}):L(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?L(n,"project not found",404):n.json(Rj(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return L(n,o,400);let i=ce(o,"name"),a=ce(o,"body"),l=ce(o,"type");if(i===null||i.length===0)return L(n,"missing or empty name",400);if(a===null)return L(n,"missing body",400);if(l===null||!ra.has(l))return L(n,`invalid type: must be one of ${[...ra].join("|")}`,400);try{nt(i)}catch(f){return L(n,f.message,400)}let c=Os(s.local_path),u=Ms(c,`${i}.md`);if(na(u))return L(n,`chapter already exists: ${i}`,409);vj(c,{recursive:!0}),Fg(u,i,l,ce(o,"description"),a);let d=Cs(c,i);return d===null?L(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 L(n,"project not found",404);try{nt(n.req.param("chapter"))}catch(i){return L(n,i.message,400)}let o=Cs(Os(s.local_path),n.req.param("chapter"));return o===null?L(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 L(n,"project not found",404);let o=n.req.param("chapter");try{nt(o)}catch(m){return L(n,m.message,400)}let i=Os(s.local_path),a=Cs(i,o);if(a===null)return L(n,"chapter not found",404);let l=await _t(n);if(typeof l=="string")return L(n,l,400);let c=ce(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ce(l,"description"):a.description,d=ce(l,"type")??a.type;if(!ra.has(d))return L(n,`invalid type: must be one of ${[...ra].join("|")}`,400);Fg(Ms(i,`${o}.md`),o,d,u,c);let f=Cs(i,o);return f===null?L(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 L(n,"project not found",404);let o=n.req.param("chapter");try{nt(o)}catch(a){return L(n,a.message,400)}let i=Ms(Os(s.local_path),`${o}.md`);return na(i)?(Nj(i),n.json({removed:!0})):L(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>L(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await _t(n);return typeof s=="string"?L(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Pg))),t.post("/api/chat/sessions",async n=>{let s=await Aj(n);if(typeof s=="string")return L(n,s,400);let o=s!==null?ce(s,"title"):null,i=r.createChatbotSession(Pg,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?L(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 L(n,"chat session not found",404);let o=await _t(n);if(typeof o=="string")return L(n,o,400);let i=ce(o,"role"),a=ce(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return L(n,"role must be one of user|assistant|tool",400);if(a===null)return L(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 L(n,"invalid run id",400);if(r.getRun(s)===null)return L(n,"run not found",404);let i=Pr(r,s),a=[];for(let c of i){let u=Lj(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=Ug(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=Mg(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 L(t,e,r){return t.json({error:e},r)}async function _t(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function Aj(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ce(t,e){let r=t[e];return typeof r!="string"?null:r}function Os(t){return Ms(t,"ai-test")}function Cs(t,e){let r=Ms(t,`${e}.md`);if(!na(r))return null;let n=Ug(r,"utf8"),s=$j(n),o=Ij(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function Rj(t){let e=Os(t);return na(e)?kj(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Cs(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 Fg(t,e,r,n,s){let o=n!==null&&n.length>0?`
1764
1770
  description: ${n}`:"",i=`---
1765
1771
  name: ${e}${o}
1766
1772
  type: ${r}
1767
1773
  ---
1768
- ${s}`;xj(t,i,"utf8")}function $j(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 Lj(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?jj(t.path):Oj(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function jj(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function Oj(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var ea,ta,Pg,Bg=E(()=>{"use strict";Xt();Dg();Ju();ea=["user","feedback","project","reference"],ta=new Set(["smoke","integration","vision","scenario","regression"]),Pg="operator"});function Le(t,e){return`<!doctype html>
1774
+ ${s}`;xj(t,i,"utf8")}function $j(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 Lj(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?jj(t.path):Oj(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function jj(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function Oj(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var ta,ra,Pg,Bg=E(()=>{"use strict";Xt();Dg();Ju();ta=["user","feedback","project","reference"],ra=new Set(["smoke","integration","vision","scenario","regression"]),Pg="operator"});function Le(t,e){return`<!doctype html>
1769
1775
  <html lang="en">
1770
1776
  <head>
1771
1777
  <meta charset="utf-8">
@@ -1835,40 +1841,40 @@ ${s}`;xj(t,i,"utf8")}function $j(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1835
1841
  FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],j=k?.input!==null&&k?.input!==void 0?`input: ${k.input}, output: ${k.output??0}`:"n/a",V=e.getWorkflow(n.workflow_id),W=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,M={run_id:t,workflow_name:V?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:W,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:b,token_totals:j};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(M)})}var qg=E(()=>{"use strict"});import{spawnSync as Xg}from"node:child_process";function Gu(t){return Cj[t]??`no install hint; ensure '${t}' is on PATH`}function Mj(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 Jg(t){return Xg("which",[t],{encoding:"utf8"}).status===0}function Gg(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Jg(e)){let r=Gu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!Jg(e)){let s=Gu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=Mj(e);if(r===null)continue;let n=Xg(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:Gu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var Cj,Kg=E(()=>{"use strict";Cj={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 Dj,readdirSync as Pj,readFileSync as Fj}from"node:fs";import{join as Vg}from"node:path";function Uj(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(`
1836
1842
  `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function Yg(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 zg(t,e){if(e.length===0)return null;let r=Vg(t,"durable-memory");if(!Dj(r))return null;let n;try{n=Pj(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=Fj(Vg(r,o),"utf8");if(Uj(i).some(l=>e.includes(l))){let l=Yg(i,"name")??o.replace(".md",""),c=Yg(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 Zg=E(()=>{"use strict"});function Yu(t){let e=t.trim().replace(Wj,"").trim();for(let r=0;r<4;r+=1){let n=Bj.exec(e);if(n===null)break;e=n[2].trim()}return e}function Qg(t){let e=t.trim(),r=Hj.exec(e);if(r!==null)return r[2];let n=qj.exec(e);return n!==null?n[0]:null}function Ds(t,e){let r=t.split(`
1837
1843
  `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=Yu(r[i]),l=Ku.exec(a);if(l===null)continue;let c=l[1].trim();if(Vu.test(c))continue;let u=Qg(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=Yu(r[i]),l=Ku.exec(a);if(l===null)break;let c=Vu.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function ey(t){let e=t.split(`
1838
- `),r=null;for(let n=0;n<e.length;n+=1){let s=Yu(e[n]),o=Ku.exec(s);if(o===null)continue;let i=o[1].trim();if(Vu.test(i))continue;let a=Qg(i);if(a===null||!en(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var Wj,Bj,Ku,Vu,Hj,qj,zu=E(()=>{"use strict";cs();Wj=/^#{1,6}\s+/,Bj=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Ku=/^STANCE:\s+(.+)$/,Vu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,Hj=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,qj=/^[A-Za-z0-9_-]+/});function ty(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 ry=E(()=>{"use strict"});import{readFileSync as Jj}from"node:fs";import{dirname as Xj,join as Gj}from"node:path";import{fileURLToPath as Kj}from"node:url";function zj(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function tO(t){let e=[],r=[];for(let n of t)Vj.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function rO(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&Yj.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 nO(t,e){if(t.length===0)return{matched:!1};let r=tO(t);for(let n of r){let s=rO(n,e);if(s.matched)return s}return{matched:!1}}function Zu(t){return nO(t,eO)}function sO(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 Qu(t){return sO(t).split(" ").filter(e=>e.length>0)}var Vj,Yj,Zj,Qj,eO,ny=E(()=>{"use strict";Vj=new Set(["&&","||",";","|",">",">>","<","<<"]),Yj=/^[A-Za-z_][A-Za-z0-9_]*=/;Zj=Xj(Kj(import.meta.url)),Qj=JSON.parse(Jj(Gj(Zj,"side_effect_classifier.json"),"utf-8")),eO=zj(Qj)});function na(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 sy(t,e){try{return await Wr(ed(t)??t,na(e))===!0}catch{return!1}}async function sa(t,e){try{return await Wr(ed(t)??t,na(e))}catch{return}}async function oy(t,e){if(typeof t!="string")return t;let r=ed(t);if(r===null)return t;try{return await Wr(r,na(e))}catch{return}}async function iy(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+=oO(await Wr(a,na(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function ed(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function oO(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Ps=E(()=>{"use strict";Sn()});import{existsSync as ay,readdirSync as ly,readFileSync as iO,statSync as cy}from"node:fs";import{join as ia}from"node:path";function uy(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function st(t,e,r,n,s={}){let o=P(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Fs}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=en(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Io,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:aO(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function aO(t){return t.length>8e3?`${t.slice(0,8e3)}
1839
- \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 dy(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=wr(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function ze(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=wr(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=wr(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=lO(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return iy(n,e)}function lO(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function wr(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function Us(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=ty(e.dal,e.run_id,()=>o),c=td(e,r),u={violation:null},d=S=>{if(l(S),u.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let w=Qu(S.summary),b=Zu(w);b.matched&&!c&&(u.violation={summary:S.summary,kind:b.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=S=>{d(S),cO(S,(w,b)=>{m+=w,p+=b})},g=await cn({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ae(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),uO(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&&rd(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function cO(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=oa(s.input_tokens),a=oa(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=oa(o.input_tokens),a=oa(o.output_tokens);(i>0||a>0)&&e(i,a)}}function oa(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function zt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await Us({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 Rn(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=X(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(sp(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await ze(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1844
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=Yu(e[n]),o=Ku.exec(s);if(o===null)continue;let i=o[1].trim();if(Vu.test(i))continue;let a=Qg(i);if(a===null||!en(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var Wj,Bj,Ku,Vu,Hj,qj,zu=E(()=>{"use strict";cs();Wj=/^#{1,6}\s+/,Bj=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Ku=/^STANCE:\s+(.+)$/,Vu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,Hj=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,qj=/^[A-Za-z0-9_-]+/});function ty(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 ry=E(()=>{"use strict"});import{readFileSync as Jj}from"node:fs";import{dirname as Xj,join as Gj}from"node:path";import{fileURLToPath as Kj}from"node:url";function zj(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function tO(t){let e=[],r=[];for(let n of t)Vj.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function rO(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&Yj.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 nO(t,e){if(t.length===0)return{matched:!1};let r=tO(t);for(let n of r){let s=rO(n,e);if(s.matched)return s}return{matched:!1}}function Zu(t){return nO(t,eO)}function sO(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 Qu(t){return sO(t).split(" ").filter(e=>e.length>0)}var Vj,Yj,Zj,Qj,eO,ny=E(()=>{"use strict";Vj=new Set(["&&","||",";","|",">",">>","<","<<"]),Yj=/^[A-Za-z_][A-Za-z0-9_]*=/;Zj=Xj(Kj(import.meta.url)),Qj=JSON.parse(Jj(Gj(Zj,"side_effect_classifier.json"),"utf-8")),eO=zj(Qj)});function sa(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 sy(t,e){try{return await Wr(ed(t)??t,sa(e))===!0}catch{return!1}}async function oa(t,e){try{return await Wr(ed(t)??t,sa(e))}catch{return}}async function oy(t,e){if(typeof t!="string")return t;let r=ed(t);if(r===null)return t;try{return await Wr(r,sa(e))}catch{return}}async function iy(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+=oO(await Wr(a,sa(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function ed(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function oO(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Ps=E(()=>{"use strict";Sn()});import{existsSync as ay,readdirSync as ly,readFileSync as iO,statSync as cy}from"node:fs";import{join as aa}from"node:path";function uy(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function st(t,e,r,n,s={}){let o=P(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Fs}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=en(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:No,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:aO(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function aO(t){return t.length>8e3?`${t.slice(0,8e3)}
1845
+ \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 dy(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=wr(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function ze(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=wr(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=wr(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=lO(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return iy(n,e)}function lO(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function wr(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function Us(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=ty(e.dal,e.run_id,()=>o),c=td(e,r),u={violation:null},d=S=>{if(l(S),u.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let w=Qu(S.summary),b=Zu(w);b.matched&&!c&&(u.violation={summary:S.summary,kind:b.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=S=>{d(S),cO(S,(w,b)=>{m+=w,p+=b})},g=await cn({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ae(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),uO(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&&rd(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function cO(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=ia(s.input_tokens),a=ia(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=ia(o.input_tokens),a=ia(o.output_tokens);(i>0||a>0)&&e(i,a)}}function ia(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function zt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await Us({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 Rn(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=X(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(sp(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await ze(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1840
1846
 
1841
1847
  `);try{let p=await Us({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=Ds(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 Ne?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function $n(t,e){return(e?.length??0)>0?zg(t.project.local_path,e):null}function fy(t){return Zu(Qu(t))}function td(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1842
1848
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1843
- 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 rd(t,e){if(!ay(t))return!1;let r=ia(t,"durable-memory");function n(s){let o;try{o=ly(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=ia(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(cy(a).mtime>e)return!0}catch{}}return!1}return n(t)}function uO(t,e,r){let n=ia(t.local_path,"durable-memory");if(!ay(n))return;let s;try{s=ly(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=ia(n,o),a;try{a=cy(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=iO(i,"utf8")}catch{continue}let c=fO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1849
+ 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 rd(t,e){if(!ay(t))return!1;let r=aa(t,"durable-memory");function n(s){let o;try{o=ly(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=aa(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(cy(a).mtime>e)return!0}catch{}}return!1}return n(t)}function uO(t,e,r){let n=aa(t.local_path,"durable-memory");if(!ay(n))return;let s;try{s=ly(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=aa(n,o),a;try{a=cy(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=iO(i,"utf8")}catch{continue}let c=fO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1844
1850
  `);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 fO(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||!dO.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var Fs,dO,Je=E(()=>{"use strict";We();vn();ws();Zg();zu();cs();ry();ny();Ps();Fs="__paused__:";dO=new Set(["user","feedback","project","reference"])});import{spawnSync as my}from"node:child_process";function mO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=my("git",["diff","--quiet"],{cwd:o}).status!==0,a=my("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,vu),{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 py,hy=E(()=>{"use strict";Je();py={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=>mO(t,t.state)}});async function pO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await sy(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 _y,gy=E(()=>{"use strict";Je();Ps();_y={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=>pO(t,t.state)}});async function hO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=$n(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 Rn(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??""}
1845
1851
  ${m}`:null).filter(m=>m!==null).join(`
1846
1852
 
1847
- `),c=`${n}:consolidator`,u=await Rn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Y(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Y(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await zt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var yy,wy=E(()=>{"use strict";Je();yy={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=>hO(t,t.state)}});async function _O(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await sa(e.items_from,t),a=EO(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 yO(t,e,s.id,a,l):await gO(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 gO(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await Ty(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 yO(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 Ty(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function Ty(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__":wO(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 wO(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function EO(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 Ey,by=E(()=>{"use strict";Je();Ps();Ey={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=>_O(t,t.state)}});async function TO(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=$n(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,r);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[n]="done",e.write_back_durable_memory&&await zt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),Y(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=a.last_operator_input??"";try{let m=await Us({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),Y(t,r,n,"done"),e.write_back_durable_memory&&await zt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Sy({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ne?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}}return{kind:"paused"}}let l=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await ze(e.agent.initial_prompt_template,t,n),d=i?`${i}
1853
+ `),c=`${n}:consolidator`,u=await Rn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Y(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Y(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await zt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var yy,wy=E(()=>{"use strict";Je();yy={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=>hO(t,t.state)}});async function _O(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await oa(e.items_from,t),a=EO(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 yO(t,e,s.id,a,l):await gO(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 gO(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await Ty(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 yO(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 Ty(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function Ty(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__":wO(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 wO(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function EO(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 Ey,by=E(()=>{"use strict";Je();Ps();Ey={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=>_O(t,t.state)}});async function TO(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=$n(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,r);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[n]="done",e.write_back_durable_memory&&await zt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),Y(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=a.last_operator_input??"";try{let m=await Us({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),Y(t,r,n,"done"),e.write_back_durable_memory&&await zt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Sy({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ne?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}}return{kind:"paused"}}let l=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await ze(e.agent.initial_prompt_template,t,n),d=i?`${i}
1848
1854
 
1849
- ${u}`:u;try{let f=await Us({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await zt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Sy({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ne?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function Sy(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=P();e.dal.setRunPausedState(e.run_id,`${Fs}${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(bO({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function bO(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=SO(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:vO(o,3),paused_at:i,created_run_inputs:wr(e.job.payload)}}function SO(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 vO(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 vy,ky=E(()=>{"use strict";ws();Je();vy={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=>TO(t,t.state)}});async function kO(t,e){let r=t.stateId,n=t.displayName,s=dy(t,e.over);if(s===null){let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=IO(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),Y(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function IO(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var Iy,Ny=E(()=>{"use strict";Je();Iy={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>kO(t,t.state)}});import{createHash as NO}from"node:crypto";import{existsSync as xO,mkdirSync as AO,readFileSync as RO,writeFileSync as $O}from"node:fs";import{dirname as LO,isAbsolute as Ay,normalize as jO,resolve as Ws}from"node:path";import{Document as OO,ExternalHyperlink as CO,HeadingLevel as Ln,LevelFormat as MO,Packer as DO,Paragraph as gt,Table as PO,TableCell as FO,TableRow as UO,TextRun as yt,WidthType as WO}from"docx";import{marked as BO}from"marked";async function HO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await qO(t,e,n),i=await JO(t,e),a=await XO(t,e.title),l=await zO(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return AO(LO(i),{recursive:!0}),$O(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:NO("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 qO(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await ze(e.markdown_source,t,r)).trim(),o=(n.length===0?YO(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=KO(t.project.local_path,o);if(i!==null){if(!xO(i))throw new Error(`markdown_source file not found: ${i}`);return aa(RO(i,"utf8"))}return aa(o)}async function JO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await ze(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=GO(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function XO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await ze(e,t,t.stateId)).trim();return r.length===0?null:r}function GO(t,e){let r=Ws(t);return jO(Ay(e)?Ws(e):Ws(r,e))}function KO(t,e){return VO(e)?Ay(e)?Ws(e):Ws(t,e):null}function VO(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function YO(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 aa(s);let o=t.dal.query(`SELECT sa.content
1855
+ ${u}`:u;try{let f=await Us({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await zt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Sy({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ne?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function Sy(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=P();e.dal.setRunPausedState(e.run_id,`${Fs}${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(bO({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function bO(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=SO(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:vO(o,3),paused_at:i,created_run_inputs:wr(e.job.payload)}}function SO(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 vO(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 vy,ky=E(()=>{"use strict";ws();Je();vy={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=>TO(t,t.state)}});async function kO(t,e){let r=t.stateId,n=t.displayName,s=dy(t,e.over);if(s===null){let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=IO(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),Y(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function IO(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var Iy,Ny=E(()=>{"use strict";Je();Iy={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>kO(t,t.state)}});import{createHash as NO}from"node:crypto";import{existsSync as xO,mkdirSync as AO,readFileSync as RO,writeFileSync as $O}from"node:fs";import{dirname as LO,isAbsolute as Ay,normalize as jO,resolve as Ws}from"node:path";import{Document as OO,ExternalHyperlink as CO,HeadingLevel as Ln,LevelFormat as MO,Packer as DO,Paragraph as gt,Table as PO,TableCell as FO,TableRow as UO,TextRun as yt,WidthType as WO}from"docx";import{marked as BO}from"marked";async function HO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await qO(t,e,n),i=await JO(t,e),a=await XO(t,e.title),l=await zO(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return AO(LO(i),{recursive:!0}),$O(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:NO("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 qO(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await ze(e.markdown_source,t,r)).trim(),o=(n.length===0?YO(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=KO(t.project.local_path,o);if(i!==null){if(!xO(i))throw new Error(`markdown_source file not found: ${i}`);return la(RO(i,"utf8"))}return la(o)}async function JO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await ze(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=GO(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function XO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await ze(e,t,t.stateId)).trim();return r.length===0?null:r}function GO(t,e){let r=Ws(t);return jO(Ay(e)?Ws(e):Ws(r,e))}function KO(t,e){return VO(e)?Ay(e)?Ws(e):Ws(t,e):null}function VO(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function YO(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 la(s);let o=t.dal.query(`SELECT sa.content
1850
1856
  FROM step_artifact sa
1851
1857
  JOIN step s ON s.id = sa.step_id
1852
1858
  WHERE s.run_id = ?
1853
1859
  AND s.state_name LIKE ?
1854
1860
  AND sa.content IS NOT NULL
1855
1861
  ORDER BY sa.id DESC
1856
- LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:aa(o[0].content)}function aa(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function zO(t,e){let r=$y(BO.lexer(t,{gfm:!0})),n=new OO({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:MO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new gt("")]:r}]});return DO.toBuffer(n)}function $y(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new gt({heading:sC(r.depth),children:Tr(Er(r))}));break;case"paragraph":e.push(new gt({children:Tr(Er(r))}));break;case"text":e.push(new gt({children:Er(r).length===0?[new yt(r.text)]:Tr(Er(r))}));break;case"blockquote":e.push(...$y(Er(r)).map(n=>n instanceof gt?n:new gt({children:[new yt(r.text)]})));break;case"list":tC(r)&&e.push(...ZO(r));break;case"table":rC(r)&&e.push(QO(r));break;case"code":nC(r)&&e.push(...eC(r));break;case"hr":e.push(new gt(""));break;case"html":r.text.trim().length>0&&e.push(new gt({children:[new yt(r.text)]}));break;default:break}return e}function Tr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new yt({text:n.text,...nd(e)}));break;case"strong":r.push(...Tr(Er(n),{...e,bold:!0}));break;case"em":r.push(...Tr(Er(n),{...e,italics:!0}));break;case"codespan":r.push(new yt({text:n.text,...nd({...e,code:!0})}));break;case"link":r.push(new CO({link:n.href,children:Tr(Er(n),{...e})}));break;case"br":r.push(new yt({text:"",break:1}));break;case"image":r.push(new yt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new yt({text:n.text,strike:!0}));break;default:r.push(new yt({text:n.raw,...nd(e)}));break}return r.length===0?[new yt("")]:r}function nd(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function ZO(t){return t.items.map(e=>new gt({children:Tr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:xy(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:xy(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function xy(t){return t.task?`[${t.checked?"x":" "}] `:""}function QO(t){let e=[t.header,...t.rows].map(r=>new UO({children:r.map(n=>new FO({children:[new gt({children:Tr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new PO({width:{size:100,type:WO.PERCENTAGE},rows:e})}function eC(t){return t.text.split(`
1857
- `).map(r=>new gt({children:[new yt({text:r.length===0?" ":r,font:"Courier New"})]}))}function Er(t){let e=t.tokens;return Array.isArray(e)?e:[]}function tC(t){return t.type==="list"&&Array.isArray(t.items)}function rC(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function nC(t){return t.type==="code"&&typeof t.text=="string"}function sC(t){switch(t){case 1:return Ln.HEADING_1;case 2:return Ln.HEADING_2;case 3:return Ln.HEADING_3;case 4:return Ln.HEADING_4;case 5:return Ln.HEADING_5;default:return Ln.HEADING_6}}var Ry,Ly=E(()=>{"use strict";Je();Ry={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=>HO(t,t.state)}});import{createHash as oC}from"node:crypto";import{existsSync as iC,mkdirSync as aC,readFileSync as jy,statSync as lC}from"node:fs";import{dirname as cC,isAbsolute as Oy,normalize as uC,resolve as Bs}from"node:path";import{marked as dC}from"marked";import fC from"write-excel-file/node";async function mC(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await pC(t,e),i=hC(e.input_format),a=await _C(t,e),l=await gC(t,e.title),c=i==="markdown"?IC(o):TC(o);await NC({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=lC(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=oC("sha256").update(jy(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 pC(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await ze(e.source,t,t.stateId)).trim(),n=wC(t.project.local_path,r);if(n!==null){if(!iC(n))throw new Error(`source file not found: ${n}`);return jy(n,"utf8")}return r}function hC(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function _C(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await ze(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=yC(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function gC(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await ze(e,t,t.stateId)).trim();return r.length===0?null:r}function yC(t,e){let r=Bs(t);return uC(Oy(e)?Bs(e):Bs(r,e))}function wC(t,e){return EC(e)?Oy(e)?Bs(e):Bs(t,e):null}function EC(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function TC(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(!la(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>bC(r,n))}function bC(t,e){if(!la(t))throw new Error(`sheets[${e}] must be an object`);let r=SC(t.headers,`sheets[${e}].headers`),n=vC(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:kC(t.styles)}}function SC(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 vC(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 kC(t){if(!la(t)||!la(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 IC(t){let e=dC.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(OC(s)){n=s.text;continue}CC(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 NC(t){aC(cC(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:$C(n.name,e),data:xC(n),columns:RC(n)}));await fC(r).toFile(t.outputPath)}function xC(t){let e=[];if(t.headers.length>0){let r=jC(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(AC));return e.length===0?[[{}]]:e}function AC(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function RC(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 $C(t,e){let r=LC(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 LC(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function jC(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function OC(t){return t.type==="heading"&&typeof t.text=="string"}function CC(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function la(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Cy,My=E(()=>{"use strict";Je();Cy={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=>mC(t,t.state)}});import{spawnSync as MC}from"node:child_process";async function PC(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(MC("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Y(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?K(t.workflow,h):{kind:"terminal",terminal:ee(t.workflow)}}let o=$n(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 Rn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1862
+ LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:la(o[0].content)}function la(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function zO(t,e){let r=$y(BO.lexer(t,{gfm:!0})),n=new OO({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:MO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new gt("")]:r}]});return DO.toBuffer(n)}function $y(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new gt({heading:sC(r.depth),children:Tr(Er(r))}));break;case"paragraph":e.push(new gt({children:Tr(Er(r))}));break;case"text":e.push(new gt({children:Er(r).length===0?[new yt(r.text)]:Tr(Er(r))}));break;case"blockquote":e.push(...$y(Er(r)).map(n=>n instanceof gt?n:new gt({children:[new yt(r.text)]})));break;case"list":tC(r)&&e.push(...ZO(r));break;case"table":rC(r)&&e.push(QO(r));break;case"code":nC(r)&&e.push(...eC(r));break;case"hr":e.push(new gt(""));break;case"html":r.text.trim().length>0&&e.push(new gt({children:[new yt(r.text)]}));break;default:break}return e}function Tr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new yt({text:n.text,...nd(e)}));break;case"strong":r.push(...Tr(Er(n),{...e,bold:!0}));break;case"em":r.push(...Tr(Er(n),{...e,italics:!0}));break;case"codespan":r.push(new yt({text:n.text,...nd({...e,code:!0})}));break;case"link":r.push(new CO({link:n.href,children:Tr(Er(n),{...e})}));break;case"br":r.push(new yt({text:"",break:1}));break;case"image":r.push(new yt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new yt({text:n.text,strike:!0}));break;default:r.push(new yt({text:n.raw,...nd(e)}));break}return r.length===0?[new yt("")]:r}function nd(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function ZO(t){return t.items.map(e=>new gt({children:Tr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:xy(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:xy(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function xy(t){return t.task?`[${t.checked?"x":" "}] `:""}function QO(t){let e=[t.header,...t.rows].map(r=>new UO({children:r.map(n=>new FO({children:[new gt({children:Tr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new PO({width:{size:100,type:WO.PERCENTAGE},rows:e})}function eC(t){return t.text.split(`
1863
+ `).map(r=>new gt({children:[new yt({text:r.length===0?" ":r,font:"Courier New"})]}))}function Er(t){let e=t.tokens;return Array.isArray(e)?e:[]}function tC(t){return t.type==="list"&&Array.isArray(t.items)}function rC(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function nC(t){return t.type==="code"&&typeof t.text=="string"}function sC(t){switch(t){case 1:return Ln.HEADING_1;case 2:return Ln.HEADING_2;case 3:return Ln.HEADING_3;case 4:return Ln.HEADING_4;case 5:return Ln.HEADING_5;default:return Ln.HEADING_6}}var Ry,Ly=E(()=>{"use strict";Je();Ry={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=>HO(t,t.state)}});import{createHash as oC}from"node:crypto";import{existsSync as iC,mkdirSync as aC,readFileSync as jy,statSync as lC}from"node:fs";import{dirname as cC,isAbsolute as Oy,normalize as uC,resolve as Bs}from"node:path";import{marked as dC}from"marked";import fC from"write-excel-file/node";async function mC(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await pC(t,e),i=hC(e.input_format),a=await _C(t,e),l=await gC(t,e.title),c=i==="markdown"?IC(o):TC(o);await NC({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=lC(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=oC("sha256").update(jy(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 pC(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await ze(e.source,t,t.stateId)).trim(),n=wC(t.project.local_path,r);if(n!==null){if(!iC(n))throw new Error(`source file not found: ${n}`);return jy(n,"utf8")}return r}function hC(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function _C(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await ze(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=yC(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function gC(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await ze(e,t,t.stateId)).trim();return r.length===0?null:r}function yC(t,e){let r=Bs(t);return uC(Oy(e)?Bs(e):Bs(r,e))}function wC(t,e){return EC(e)?Oy(e)?Bs(e):Bs(t,e):null}function EC(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function TC(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(!ca(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>bC(r,n))}function bC(t,e){if(!ca(t))throw new Error(`sheets[${e}] must be an object`);let r=SC(t.headers,`sheets[${e}].headers`),n=vC(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:kC(t.styles)}}function SC(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 vC(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 kC(t){if(!ca(t)||!ca(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 IC(t){let e=dC.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(OC(s)){n=s.text;continue}CC(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 NC(t){aC(cC(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:$C(n.name,e),data:xC(n),columns:RC(n)}));await fC(r).toFile(t.outputPath)}function xC(t){let e=[];if(t.headers.length>0){let r=jC(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(AC));return e.length===0?[[{}]]:e}function AC(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function RC(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 $C(t,e){let r=LC(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 LC(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function jC(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function OC(t){return t.type==="heading"&&typeof t.text=="string"}function CC(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ca(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Cy,My=E(()=>{"use strict";Je();Cy={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=>mC(t,t.state)}});import{spawnSync as MC}from"node:child_process";async function PC(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(MC("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Y(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?K(t.workflow,h):{kind:"terminal",terminal:ee(t.workflow)}}let o=$n(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 Rn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1858
1864
  ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=ey(p.text);if(g!==null){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let S=Object.keys(e.outcomes_from_stance),w=Ds(p.text,S);if(w.outcome===null){let x=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(x.id,null,`unhandled_stance:${w.reason}`),{kind:"escalate",token:"",reason:`no_stance:${w.reason}`}}let b=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(b.id,w.outcome,"outcomes_from_stance"),Y(t,r,n,w.outcome),K(t.workflow,e.outcomes_from_stance[w.outcome])}let g=Ds(p.text,DC);if(g.outcome!==null){let S=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(S.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),Y(t,r,n,"approve"),e.write_back_durable_memory){let S=t.membersByAlias.get(e.coder.alias);S!==void 0&&await zt(t,n,S,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>Rn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1859
1865
  ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),Y(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await zt(t,n,_,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1860
1866
 
1861
- `),e.loop_feedback_artifact!==void 0){let g=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var DC,Dy,Py=E(()=>{"use strict";zu();Je();DC=["blocked","failed","aborted"],Dy={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=>PC(t,t.state)}});import{spawnSync as FC}from"node:child_process";async function UC(t,e){let r=t.stateId,n=t.displayName,s=await ze(e.command,t,n),o=td(t,n),i=fy(s);if(i.matched&&!o){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=FC("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&rd(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 Fy,Uy=E(()=>{"use strict";Je();Fy={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=>UC(t,t.state)}});async function WC(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:ee(t.workflow)};let i=De(o.definition),a=await BC(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,HC(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 BC(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await oy(s,t);r[n]=o===s?await sa(s,t):o}return r}function HC(t,e,r){let n={};for(let s of r)n[s.name]=qC(t,e,s);return n}function qC(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=JC(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 JC(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 Wy,By=E(()=>{"use strict";Nn();Je();Ps();Wy={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async t=>WC(t,t.state)}});function XC(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var Hy,qy=E(()=>{"use strict";Je();Hy={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=>XC(t,t.state)}});async function GC(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=KC(t.cursor),a=o.filter(VC).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 KC(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function VC(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 Jy,Xy=E(()=>{"use strict";Jy={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=>GC(t)}});async function YC(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var Gy,Ky=E(()=>{"use strict";Gy={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async t=>YC(t)}});function Vy(t){t.register(py),t.register(Dy),t.register(yy),t.register(vy),t.register(Iy),t.register(Ry),t.register(Cy),t.register(Fy),t.register(_y),t.register(Ey),t.register(Wy),t.register(Hy),t.register(Gy),t.register(Jy)}var Yy=E(()=>{"use strict";hy();gy();wy();by();ky();Ny();Ly();My();Py();Uy();By();qy();Xy();Ky()});function ua(){return ca===null&&(ca=new sd,Vy(ca)),ca}var zC,sd,ca,od=E(()=>{"use strict";Yy();zC={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"},sd=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:zC[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ca=null});async function Qy(t){sw(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=QC(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=Gg(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Hs(n)){let m=id({dal:t.dal,workflow:fa(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:wr(t.job.payload)??{},team_id:t.team.id}),p=await tw(n,m,i.current_state??n.entry_step_id);return Zy(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=id({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:wr(t.job.payload)??{},team_id:t.team.id}),f=await ew(d,i.current_state??n.start_at);return Zy(t.dal,r.id,i.id,n.name,f),f}function Zy(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 id(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 ad(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{sw(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=id({dal:t.dal,workflow:Hs(n)?fa(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Hs(n)?tw(n,a,i.current_state??n.entry_step_id):ew(a,i.current_state??n.start_at)}};return e}async function ew(t,e){let r=e;if(r.startsWith(Fs))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Zt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=da(t,ee(t.workflow));if(l.kind==="paused")return Pe(t);if(l.kind==="escalate")return st(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Pe(t);if(l.kind==="terminal")return Zt(t,l.terminal);r=l.state;continue}let i,a=nw(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,r,r,a),a===ls)return Zt(t,Xl);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):st(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await ad(t,r,o);if(i.kind==="paused")return Pe(t);if(i.kind==="escalate")return st(t,{id:r,name:r,type:o.type},i.token,i.reason),Pe(t);if(i.kind==="terminal"){let l=da(t,i.terminal);if(l.kind==="paused")return Pe(t);if(l.kind==="escalate")return st(t,{id:r,name:r,type:o.type},l.token,l.reason),Pe(t);if(l.kind==="terminal")return Zt(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=da(t,ee(t.workflow));return n.kind==="terminal"?Zt(t,n.terminal):Zt(t,ee(t.workflow))}async function tw(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return st(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Pe(e);let l=nw(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===ls)return Zt(e,Xl);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 st(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Pe(e);o=h;continue}let c=await ZC(e,t,a);if(c.kind==="paused")return Pe(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return st(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Pe(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=fa(t,a);try{let p=da(e,d);if(p.kind==="paused")return Pe(e);if(p.kind==="escalate")return st(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Pe(e);if(p.kind==="terminal")return Zt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return st(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Pe(e);o=h.id;continue}finally{e.workflow=m}}if(en(d))return st(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Pe(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return st(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Pe(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})}),Zt(e,"aborted")}async function ZC(t,e,r){let n=rw(e,r),s=t.workflow;t.workflow=fa(e,r);try{return await ad(t,r.id,n,r.name)}finally{t.workflow=s}}function rw(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 ad(t,e,r,n){let s=ua().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?rM(t,s):void 0,t.progress_step_id=null;try{return await s.execute(uy(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function QC(t,e){try{let r=JSON.parse(t);if(tM(r)&&r.definition_schema_version===3)return xt.parse(r)}catch{return e}return e}function Hs(t){return t.definition_schema_version===3}function fa(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]=rw(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:eM(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 eM(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function tM(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function rM(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 Zt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Hg(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Pe(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function nw(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 da(t,e){if(!nM(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&&sM(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function nM(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function sM(t,e,r){let n=oM(t),s=r.capture_evidence&&n!==null?iM(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 oM(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 iM(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 sw(t){if(!zy.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${zy.join(", ")}`)}var zy,ow=E(()=>{"use strict";kn();qg();Kg();Je();od();cs();zy=[1,2,3]});import{readFileSync as aM,readdirSync as lM}from"node:fs";import{basename as cM,join as uM,resolve as dM}from"node:path";function lw(t={}){let e=dM(t.workflowsDir??"workflows"),r=lM(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=>fM(uM(e,n)))}}function fM(t){let e=cM(t);try{let r=aM(t,"utf8"),n=De(r);return dw(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:fw(r)}}}function cw(t,e){try{let r=De(e);return dw(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:fw(r)}}}function uw(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(`
1867
+ `),e.loop_feedback_artifact!==void 0){let g=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var DC,Dy,Py=E(()=>{"use strict";zu();Je();DC=["blocked","failed","aborted"],Dy={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=>PC(t,t.state)}});import{spawnSync as FC}from"node:child_process";async function UC(t,e){let r=t.stateId,n=t.displayName,s=await ze(e.command,t,n),o=td(t,n),i=fy(s);if(i.matched&&!o){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=FC("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&rd(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 Fy,Uy=E(()=>{"use strict";Je();Fy={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=>UC(t,t.state)}});async function WC(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:ee(t.workflow)};let i=De(o.definition),a=await BC(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,HC(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 BC(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await oy(s,t);r[n]=o===s?await oa(s,t):o}return r}function HC(t,e,r){let n={};for(let s of r)n[s.name]=qC(t,e,s);return n}function qC(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=JC(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 JC(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 Wy,By=E(()=>{"use strict";Nn();Je();Ps();Wy={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async t=>WC(t,t.state)}});function XC(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var Hy,qy=E(()=>{"use strict";Je();Hy={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=>XC(t,t.state)}});async function GC(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=KC(t.cursor),a=o.filter(VC).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 KC(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function VC(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 Jy,Xy=E(()=>{"use strict";Jy={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=>GC(t)}});async function YC(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var Gy,Ky=E(()=>{"use strict";Gy={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async t=>YC(t)}});function Vy(t){t.register(py),t.register(Dy),t.register(yy),t.register(vy),t.register(Iy),t.register(Ry),t.register(Cy),t.register(Fy),t.register(_y),t.register(Ey),t.register(Wy),t.register(Hy),t.register(Gy),t.register(Jy)}var Yy=E(()=>{"use strict";hy();gy();wy();by();ky();Ny();Ly();My();Py();Uy();By();qy();Xy();Ky()});function da(){return ua===null&&(ua=new sd,Vy(ua)),ua}var zC,sd,ua,od=E(()=>{"use strict";Yy();zC={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"},sd=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:zC[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ua=null});async function Qy(t){sw(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=QC(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=Gg(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Hs(n)){let m=id({dal:t.dal,workflow:ma(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:wr(t.job.payload)??{},team_id:t.team.id}),p=await tw(n,m,i.current_state??n.entry_step_id);return Zy(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=id({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:wr(t.job.payload)??{},team_id:t.team.id}),f=await ew(d,i.current_state??n.start_at);return Zy(t.dal,r.id,i.id,n.name,f),f}function Zy(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 id(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 ad(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{sw(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=id({dal:t.dal,workflow:Hs(n)?ma(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Hs(n)?tw(n,a,i.current_state??n.entry_step_id):ew(a,i.current_state??n.start_at)}};return e}async function ew(t,e){let r=e;if(r.startsWith(Fs))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Zt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=fa(t,ee(t.workflow));if(l.kind==="paused")return Pe(t);if(l.kind==="escalate")return st(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Pe(t);if(l.kind==="terminal")return Zt(t,l.terminal);r=l.state;continue}let i,a=nw(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,r,r,a),a===ls)return Zt(t,Xl);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):st(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await ad(t,r,o);if(i.kind==="paused")return Pe(t);if(i.kind==="escalate")return st(t,{id:r,name:r,type:o.type},i.token,i.reason),Pe(t);if(i.kind==="terminal"){let l=fa(t,i.terminal);if(l.kind==="paused")return Pe(t);if(l.kind==="escalate")return st(t,{id:r,name:r,type:o.type},l.token,l.reason),Pe(t);if(l.kind==="terminal")return Zt(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=fa(t,ee(t.workflow));return n.kind==="terminal"?Zt(t,n.terminal):Zt(t,ee(t.workflow))}async function tw(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return st(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Pe(e);let l=nw(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===ls)return Zt(e,Xl);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 st(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Pe(e);o=h;continue}let c=await ZC(e,t,a);if(c.kind==="paused")return Pe(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return st(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Pe(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=ma(t,a);try{let p=fa(e,d);if(p.kind==="paused")return Pe(e);if(p.kind==="escalate")return st(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Pe(e);if(p.kind==="terminal")return Zt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return st(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Pe(e);o=h.id;continue}finally{e.workflow=m}}if(en(d))return st(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Pe(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return st(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Pe(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})}),Zt(e,"aborted")}async function ZC(t,e,r){let n=rw(e,r),s=t.workflow;t.workflow=ma(e,r);try{return await ad(t,r.id,n,r.name)}finally{t.workflow=s}}function rw(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 ad(t,e,r,n){let s=da().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?rM(t,s):void 0,t.progress_step_id=null;try{return await s.execute(uy(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function QC(t,e){try{let r=JSON.parse(t);if(tM(r)&&r.definition_schema_version===3)return xt.parse(r)}catch{return e}return e}function Hs(t){return t.definition_schema_version===3}function ma(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]=rw(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:eM(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 eM(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function tM(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function rM(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 Zt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Hg(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Pe(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function nw(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 fa(t,e){if(!nM(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&&sM(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function nM(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function sM(t,e,r){let n=oM(t),s=r.capture_evidence&&n!==null?iM(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 oM(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 iM(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 sw(t){if(!zy.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${zy.join(", ")}`)}var zy,ow=E(()=>{"use strict";kn();qg();Kg();Je();od();cs();zy=[1,2,3]});import{readFileSync as aM,readdirSync as lM}from"node:fs";import{basename as cM,join as uM,resolve as dM}from"node:path";function lw(t={}){let e=dM(t.workflowsDir??"workflows"),r=lM(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=>fM(uM(e,n)))}}function fM(t){let e=cM(t);try{let r=aM(t,"utf8"),n=De(r);return dw(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:fw(r)}}}function cw(t,e){try{let r=De(e);return dw(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:fw(r)}}}function uw(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(`
1862
1868
  `)}
1863
- `}function dw(t,e){let r=pM(e),n=hM(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=mM(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 mM(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function pM(t){return ld(t)?t.entry_step_id:t.start_at}function hM(t){return ld(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function ld(t){return t.definition_schema_version===3}function fw(t){return t instanceof Yt?t.issues.map(e=>`${e.path}: ${e.message}`).join("; "):t instanceof SyntaxError?`JSON parse failed: ${t.message}`:t instanceof Error?t.message:String(t)}function mw(t){let e=new Set;if(ld(t))for(let r of t.steps){let n=r.members??{};iw(n,e)}else for(let r of Object.values(t.states))iw(r,e);return[...e].sort()}function iw(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=aw(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=aw(i);a!==null&&e.add(a)}}}function aw(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var ma=E(()=>{"use strict";Nn()});function _M({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,pa)[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}=gM(t,r,i);if(a<20)continue;let c=i??"initial",u=`${qs}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:pa,source_ref:qs,payload:JSON.stringify({kind:qs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function gM(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1869
+ `}function dw(t,e){let r=pM(e),n=hM(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=mM(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 mM(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function pM(t){return ld(t)?t.entry_step_id:t.start_at}function hM(t){return ld(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function ld(t){return t.definition_schema_version===3}function fw(t){return t instanceof Yt?t.issues.map(e=>`${e.path}: ${e.message}`).join("; "):t instanceof SyntaxError?`JSON parse failed: ${t.message}`:t instanceof Error?t.message:String(t)}function mw(t){let e=new Set;if(ld(t))for(let r of t.steps){let n=r.members??{};iw(n,e)}else for(let r of Object.values(t.states))iw(r,e);return[...e].sort()}function iw(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=aw(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=aw(i);a!==null&&e.add(a)}}}function aw(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var pa=E(()=>{"use strict";Nn()});function _M({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,ha)[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}=gM(t,r,i);if(a<20)continue;let c=i??"initial",u=`${qs}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:ha,source_ref:qs,payload:JSON.stringify({kind:qs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function gM(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1864
1870
  FROM run r
1865
1871
  JOIN job j ON j.id = r.job_id
1866
1872
  WHERE j.project_id = ?
1867
1873
  AND r.terminal_state IS NOT NULL
1868
- ${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 pw(t){for(let e of yM)try{e(t)}catch{}}var pa,qs,yM,cd=E(()=>{"use strict";pa="memory_policy",qs="memory_consolidation_request";yM=[_M]});var Ew={};ne(Ew,{getOrInsertConsolidationWorkflow:()=>_w,runJobById:()=>Js,runOnce:()=>qr,startWorker:()=>SM});import{createHash as wM}from"node:crypto";import{readFileSync as EM}from"node:fs";import{pathToFileURL as TM}from"node:url";function _w(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Ii({swallow:!0});let n=Ni(e);if(n===null)return null;let s=EM(n,"utf8"),o=De(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:TM(n).href,source_sha256:wM("sha256").update(s).digest("hex")})}catch{return null}}async function qr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??hw,evaluator:n=>yw(t.dal,n)}),r===null?null:await gw(t.dal,r,e)}catch(n){if(r!==null)return br(t.dal,r,"worker_run_failed",Hr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:ha(Hr(n))})})}catch{}return null}finally{t.max_concurrent}}async function Js(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??hw,evaluator:s=>yw(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await gw(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...br(t.dal,r,"worker_run_failed",Hr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:ha(Hr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function gw(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return br(t,e,"worker_project_missing","project_not_found",r);let s=e.source===pa&&e.source_ref===qs,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=_w(t):i=ww(t,e,n),i===null)return br(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 br(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=De(i.definition)}catch(d){return br(t,e,"worker_workflow_invalid",Hr(d),r,n)}let u=vM(c,l);if(u.length>0)return br(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await Qy({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 br(t,e,"worker_run_failed",Hr(d),r,n,a)}}function yw(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=ww(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=De(n.definition)}catch{s=null}return Gi({workflow:s,job:e,project:r})}function ww(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function SM(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await qr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:ha(Hr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??bM))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function br(t,e,r,n,s,o,i){let a=ha(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 Hr(t){return t instanceof Error?t.message:String(t)}function ha(t){return t.length>4096?t.slice(0,4096):t}function vM(t,e){let r=mw(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var hw,bM,Xs=E(()=>{"use strict";xi();ow();Nn();ma();Lu();cd();hw=6e5,bM=5e3});import{existsSync as kM,readFileSync as IM}from"node:fs";import{marked as NM}from"marked";function vw(t,e){t.get("/layman",r=>r.html(Le("Layman Home",xM(e.dal)))),t.get("/api/layman",r=>r.json(xw(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Sw(r);return n===null?r.notFound():r.html(Le(`Start ${jn(n)}`,$M(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Sw(r);return n===null?r.notFound():n==="newspaper"?Tw(r,e.dal):LM(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Dr(e.dal,_a(r,"id"));return n===null?r.notFound():r.html(Le(`Run ${n.id}`,CM(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Dr(e.dal,_a(r,"id"));return n===null?r.notFound():r.json(XM(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>DM(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Le("Newspaper Subscriptions",qM(e.dal)))),t.post("/layman/newspaper",r=>Tw(r,e.dal)),t.delete("/layman/newspaper/:id",r=>bw(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>bw(r,e.dal))}function xM(t){let e=xw(t);return`<section class="layman-home">
1874
+ ${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 pw(t){for(let e of yM)try{e(t)}catch{}}var ha,qs,yM,cd=E(()=>{"use strict";ha="memory_policy",qs="memory_consolidation_request";yM=[_M]});var Ew={};ne(Ew,{getOrInsertConsolidationWorkflow:()=>_w,runJobById:()=>Js,runOnce:()=>qr,startWorker:()=>SM});import{createHash as wM}from"node:crypto";import{readFileSync as EM}from"node:fs";import{pathToFileURL as TM}from"node:url";function _w(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Ni({swallow:!0});let n=xi(e);if(n===null)return null;let s=EM(n,"utf8"),o=De(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:TM(n).href,source_sha256:wM("sha256").update(s).digest("hex")})}catch{return null}}async function qr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??hw,evaluator:n=>yw(t.dal,n)}),r===null?null:await gw(t.dal,r,e)}catch(n){if(r!==null)return br(t.dal,r,"worker_run_failed",Hr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:_a(Hr(n))})})}catch{}return null}finally{t.max_concurrent}}async function Js(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??hw,evaluator:s=>yw(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await gw(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...br(t.dal,r,"worker_run_failed",Hr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:_a(Hr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function gw(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return br(t,e,"worker_project_missing","project_not_found",r);let s=e.source===ha&&e.source_ref===qs,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=_w(t):i=ww(t,e,n),i===null)return br(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 br(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=De(i.definition)}catch(d){return br(t,e,"worker_workflow_invalid",Hr(d),r,n)}let u=vM(c,l);if(u.length>0)return br(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await Qy({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 br(t,e,"worker_run_failed",Hr(d),r,n,a)}}function yw(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=ww(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=De(n.definition)}catch{s=null}return Ki({workflow:s,job:e,project:r})}function ww(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function SM(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await qr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:_a(Hr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??bM))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function br(t,e,r,n,s,o,i){let a=_a(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 Hr(t){return t instanceof Error?t.message:String(t)}function _a(t){return t.length>4096?t.slice(0,4096):t}function vM(t,e){let r=mw(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var hw,bM,Xs=E(()=>{"use strict";Ai();ow();Nn();pa();Lu();cd();hw=6e5,bM=5e3});import{existsSync as kM,readFileSync as IM}from"node:fs";import{marked as NM}from"marked";function vw(t,e){t.get("/layman",r=>r.html(Le("Layman Home",xM(e.dal)))),t.get("/api/layman",r=>r.json(xw(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Sw(r);return n===null?r.notFound():r.html(Le(`Start ${jn(n)}`,$M(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Sw(r);return n===null?r.notFound():n==="newspaper"?Tw(r,e.dal):LM(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Dr(e.dal,ga(r,"id"));return n===null?r.notFound():r.html(Le(`Run ${n.id}`,CM(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Dr(e.dal,ga(r,"id"));return n===null?r.notFound():r.json(XM(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>DM(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Le("Newspaper Subscriptions",qM(e.dal)))),t.post("/layman/newspaper",r=>Tw(r,e.dal)),t.delete("/layman/newspaper/:id",r=>bw(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>bw(r,e.dal))}function xM(t){let e=xw(t);return`<section class="layman-home">
1869
1875
  <h1>Welcome</h1>
1870
1876
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1871
- <div class="grid">${ga.map(AM).join("")}</div>
1877
+ <div class="grid">${ya.map(AM).join("")}</div>
1872
1878
  <h2>Recent Activity</h2>
1873
1879
  ${RM(e.recent_runs)}
1874
1880
  <section class="metric">
@@ -1909,7 +1915,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1909
1915
  <button type="submit" name="done" value="false">Send response</button>
1910
1916
  <button type="submit" name="done" value="true">Done with this stage</button>
1911
1917
  </form>
1912
- </section>`}async function DM(t,e){let r=_a(t,"id"),n=await t.req.parseBody(),s=Number(Ze(n.step_id)),o=Ze(n.input),i=Ze(n.done)==="true";if(!Number.isInteger(s))return t.html(Le("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(PM(e,a.run.id),await qr({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Le("Interactive response",`<p class="error">Could not submit response: ${v(a.reason)}</p>`),400)}function PM(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(!dd(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>dd(i)&&i.name===r.current_state&&typeof i.id=="string");dd(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function FM(t,e,r){let n=YM(e.terminal_state);return`<section class="metric terminal-run">
1918
+ </section>`}async function DM(t,e){let r=ga(t,"id"),n=await t.req.parseBody(),s=Number(Ze(n.step_id)),o=Ze(n.input),i=Ze(n.done)==="true";if(!Number.isInteger(s))return t.html(Le("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(PM(e,a.run.id),await qr({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Le("Interactive response",`<p class="error">Could not submit response: ${v(a.reason)}</p>`),400)}function PM(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(!dd(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>dd(i)&&i.name===r.current_state&&typeof i.id=="string");dd(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function FM(t,e,r){let n=YM(e.terminal_state);return`<section class="metric terminal-run">
1913
1919
  <h2>${n?"Complete":"Stopped"}</h2>
1914
1920
  <p>Status: <strong>${v(e.terminal_state)}</strong></p>
1915
1921
  ${n?UM(t,e,r):BM(e)}
@@ -1932,7 +1938,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1932
1938
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1933
1939
  <label>Output directory<input name="output_dir" value="digests"></label>
1934
1940
  <button type="submit">Create subscription</button>
1935
- </form>`}async function Tw(t,e){let r=await t.req.parseBody(),n=$w(e,r);if(n===null)return t.html(Le("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Le("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ze(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(Le("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ze(r.output_dir).trim()||"digests",schedule:KM(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 bw(t,e){let r=_a(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function JM(t){return he(["id","project","topics","status","action"],t.map(e=>{let r=eD(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[v(e.id),v(e.project_name),v(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function xw(t){let e=Aw(t);return{workflows:ga,recent_runs:GM(t),newspaper_subscriptions:e.length}}function XM(t,e){let r=Rw(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 GM(t){return t.query(`SELECT r.*, w.name AS workflow_name
1941
+ </form>`}async function Tw(t,e){let r=await t.req.parseBody(),n=$w(e,r);if(n===null)return t.html(Le("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Le("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ze(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(Le("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ze(r.output_dir).trim()||"digests",schedule:KM(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 bw(t,e){let r=ga(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function JM(t){return he(["id","project","topics","status","action"],t.map(e=>{let r=eD(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[v(e.id),v(e.project_name),v(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function xw(t){let e=Aw(t);return{workflows:ya,recent_runs:GM(t),newspaper_subscriptions:e.length}}function XM(t,e){let r=Rw(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 GM(t){return t.query(`SELECT r.*, w.name AS workflow_name
1936
1942
  FROM run r
1937
1943
  JOIN workflow w ON w.id = r.workflow_id
1938
1944
  WHERE w.name IN (${fd.map(()=>"?").join(",")})
@@ -1942,21 +1948,21 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1942
1948
  JOIN workflow w ON w.id = pw.workflow_id
1943
1949
  JOIN project p ON p.id = pw.project_id
1944
1950
  WHERE w.name = ?
1945
- ORDER BY pw.id DESC`,"newspaper")}function Rw(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function $w(t,e){let r=Number(Ze(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function KM(t){let e=Ze(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ze(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Sw(t){let e=t.req.param("workflow");return fd.includes(e)?e:null}function jn(t){return ga.find(e=>e.name===t)?.title??t}function VM(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function pd(t){return NM.parse(t,{async:!1})}function YM(t){return t==="done"||t==="pr_ready"||t==="merged"}function zM(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function ZM(t,e){return t.split(`
1951
+ ORDER BY pw.id DESC`,"newspaper")}function Rw(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function $w(t,e){let r=Number(Ze(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function KM(t){let e=Ze(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ze(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Sw(t){let e=t.req.param("workflow");return fd.includes(e)?e:null}function jn(t){return ya.find(e=>e.name===t)?.title??t}function VM(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function pd(t){return NM.parse(t,{async:!1})}function YM(t){return t==="done"||t==="pr_ready"||t==="merged"}function zM(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function ZM(t,e){return t.split(`
1946
1952
  `).slice(0,e).join(`
1947
- `)}function QM(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ze(t){return typeof t=="string"?t:""}function eD(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 dd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function _a(t,e){return Number(t.req.param(e))}var ga,fd,Lw=E(()=>{"use strict";Xs();Xt();Xu();ga=[{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."}],fd=ga.map(t=>t.name)});function rD(t){return t.replace(/^\/+/,"")}function jw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function On(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=rD(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 jw(t.userId)&&jw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${tD}/${t.identityId}/`}function sD(t){return String(Math.max(0,Math.floor(t))).padStart(nD,"0")}function hd(t,e,r){return`${t}${e}${sD(r)}.json`}function ya(t,e){return`${t}${e}`}function wa(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 tD,nD,Ea=E(()=>{"use strict";tD="mailbox";nD=12});function Qt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Ta[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=Ta[a&15]+i,a=a>>4;let l=Ta[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Ta[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 Ta,ba=E(()=>{"use strict";Ta="0123456789abcdef"});function gd(t,e){return!Number.isFinite(t)||t<=0?e:t}function yd(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 Pw(t){return t.conversation_id===Dw&&aD(t.payload)}function aD(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function lD(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Pw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Ow,Cw,Mw,oD,Dw,iD,_d,Jr,Sa=E(()=>{"use strict";Ea();ba();Ow=3e3,Cw=1e4,Mw=12e3,oD=1e3,Dw="__lmctl_heartbeat__",iD={kind:"heartbeat"},_d={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Jr=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=On({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=gd(e.readIntervalMs??e.pollIntervalMs??Ow,Ow),this.heartbeatIdleMs=gd(e.heartbeatIdleMs??Cw,Cw),this.backoffReadIntervalMs=gd(e.backoffReadIntervalMs??e.pollIntervalMs??Mw,Mw)}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??_d;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=ya(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:oD,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=wa(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:Qt(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=hd(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??_d;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=hd(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(yd(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),Pw(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=lD(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??_d;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(Dw,iD)}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 cD}from"@hono/node-server/conninfo";function Fw(t,e){let r=e.bucket??uD,n=e.remoteAddressOf??(o=>fD(o)),s=o=>{let i=n(o);return mD(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=wd(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 yd(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Ed(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=wd(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:Ed(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=wd(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=dD(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:Ed(d)},500)}})}function wd(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 dD(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function fD(t){try{return cD(t).remote.address}catch{return}}function mD(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Ed(t){return t instanceof Error?t.message:String(t)}var uD,Uw=E(()=>{"use strict";Sa();uD="local"});function Ww(t,e){t.get("/mailbox/workspace",r=>_D(r,e)),t.get("/mailbox/projects",r=>gD(r,e)),t.get("/mailbox/projects/:id",r=>yD(r,e)),t.post("/mailbox/projects",r=>wD(r,e)),t.patch("/mailbox/projects/:id",r=>ED(r,e)),t.delete("/mailbox/projects/:id",r=>TD(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>bD(r,e)),t.get("/mailbox/prompts/:id",r=>SD(r,e))}function _D(t,e){e.dal.ensureWorkspace({id:Mn,name:Td});let r=Bw(e.dal),n={id:Mn,name:Td,created_at:hD,projects:r};return t.json({workspace:n})}function gD(t,e){return t.json({projects:Bw(e.dal)})}function yD(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(Cn)){let s=bd(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Ia(s)})}let n=qw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Hw(n)})}async function wD(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:Mn,name:Td});let s=e.dal.insertWebProject({workspace_id:Mn,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:Ia(s)},201)}async function ED(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(Cn)){let o=bd(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:Ia(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function TD(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(Cn)){let n=bd(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 bD(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=qw(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=`${pD}${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 vD({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:`${ka}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function SD(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=kD(e.dal,r);return t.json({result:n})}function Bw(t){let e=t.listProjects().map(Hw),r=t.listWebProjectsActive(Mn).map(Ia);return[...e,...r].sort(CD)}function Hw(t){return{id:`${ka}${t.id}`,workspace_id:Mn,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 Ia(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:`${Cn}${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 bd(t,e){if(!e.startsWith(Cn))return null;let r=e.slice(Cn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function qw(t,e){if(e.startsWith(ka)){let n=e.slice(ka.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 vD(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Ou(),gg));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function kD(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=LD(t,o?.team_id??null),a=$D(s),l=jD(n,a,i.length>0),c=OD(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:ID(t,o.workflow_name),d=u.totalEstimatedMs,f=Jw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:ND(t,s.id),g=xD(s,a,h,u.perStep,i),_=AD(h,u.perStep),S=RD(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,...va(d,f),...S},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...va(d,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...va(d,f),...S},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...va(d,f),...S},errors_json:null,duration_ms:c}}function ID(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 ND(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function xD(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=Jw(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function AD(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function RD(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 Jw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function va(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function $D(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 LD(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 jD(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 OD(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 CD(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 ka,Cn,pD,Mn,Td,hD,Xw=E(()=>{"use strict";ka="project:",Cn="web_project:",pD="prompt:",Mn="default",Td="Default workspace",hD=new Date(0).toISOString()});import{Buffer as Gw}from"node:buffer";function Kw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Vw(t){return PD[t]}function Yw(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 MD,DD,Na,PD,Sd=E(()=>{"use strict";MD=1e4,DD=256*1024,Na=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Kw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,MD),this.pushByteCap=Kw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,DD),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=Gw.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${r} bytes=${Gw.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1953
+ `)}function QM(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ze(t){return typeof t=="string"?t:""}function eD(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 dd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ga(t,e){return Number(t.req.param(e))}var ya,fd,Lw=E(()=>{"use strict";Xs();Xt();Xu();ya=[{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."}],fd=ya.map(t=>t.name)});function rD(t){return t.replace(/^\/+/,"")}function jw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function On(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=rD(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 jw(t.userId)&&jw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${tD}/${t.identityId}/`}function sD(t){return String(Math.max(0,Math.floor(t))).padStart(nD,"0")}function hd(t,e,r){return`${t}${e}${sD(r)}.json`}function wa(t,e){return`${t}${e}`}function Ea(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 tD,nD,Ta=E(()=>{"use strict";tD="mailbox";nD=12});function Qt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=ba[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=ba[a&15]+i,a=a>>4;let l=ba[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=ba[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 ba,Sa=E(()=>{"use strict";ba="0123456789abcdef"});function gd(t,e){return!Number.isFinite(t)||t<=0?e:t}function yd(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 Pw(t){return t.conversation_id===Dw&&aD(t.payload)}function aD(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function lD(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Pw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Ow,Cw,Mw,oD,Dw,iD,_d,Jr,va=E(()=>{"use strict";Ta();Sa();Ow=3e3,Cw=1e4,Mw=12e3,oD=1e3,Dw="__lmctl_heartbeat__",iD={kind:"heartbeat"},_d={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Jr=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=On({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=gd(e.readIntervalMs??e.pollIntervalMs??Ow,Ow),this.heartbeatIdleMs=gd(e.heartbeatIdleMs??Cw,Cw),this.backoffReadIntervalMs=gd(e.backoffReadIntervalMs??e.pollIntervalMs??Mw,Mw)}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??_d;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=wa(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:oD,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Ea(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:Qt(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=hd(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??_d;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=hd(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(yd(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),Pw(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=lD(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??_d;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(Dw,iD)}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 cD}from"@hono/node-server/conninfo";function Fw(t,e){let r=e.bucket??uD,n=e.remoteAddressOf??(o=>fD(o)),s=o=>{let i=n(o);return mD(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=wd(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 yd(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Ed(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=wd(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:Ed(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=wd(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=dD(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:Ed(d)},500)}})}function wd(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 dD(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function fD(t){try{return cD(t).remote.address}catch{return}}function mD(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Ed(t){return t instanceof Error?t.message:String(t)}var uD,Uw=E(()=>{"use strict";va();uD="local"});function Ww(t,e){t.get("/mailbox/workspace",r=>_D(r,e)),t.get("/mailbox/projects",r=>gD(r,e)),t.get("/mailbox/projects/:id",r=>yD(r,e)),t.post("/mailbox/projects",r=>wD(r,e)),t.patch("/mailbox/projects/:id",r=>ED(r,e)),t.delete("/mailbox/projects/:id",r=>TD(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>bD(r,e)),t.get("/mailbox/prompts/:id",r=>SD(r,e))}function _D(t,e){e.dal.ensureWorkspace({id:Mn,name:Td});let r=Bw(e.dal),n={id:Mn,name:Td,created_at:hD,projects:r};return t.json({workspace:n})}function gD(t,e){return t.json({projects:Bw(e.dal)})}function yD(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(Cn)){let s=bd(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Na(s)})}let n=qw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Hw(n)})}async function wD(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:Mn,name:Td});let s=e.dal.insertWebProject({workspace_id:Mn,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:Na(s)},201)}async function ED(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(Cn)){let o=bd(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:Na(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function TD(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(Cn)){let n=bd(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 bD(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=qw(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=`${pD}${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 vD({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:`${Ia}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function SD(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=kD(e.dal,r);return t.json({result:n})}function Bw(t){let e=t.listProjects().map(Hw),r=t.listWebProjectsActive(Mn).map(Na);return[...e,...r].sort(CD)}function Hw(t){return{id:`${Ia}${t.id}`,workspace_id:Mn,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 Na(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:`${Cn}${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 bd(t,e){if(!e.startsWith(Cn))return null;let r=e.slice(Cn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function qw(t,e){if(e.startsWith(Ia)){let n=e.slice(Ia.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function vD(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Ou(),gg));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function kD(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=LD(t,o?.team_id??null),a=$D(s),l=jD(n,a,i.length>0),c=OD(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:ID(t,o.workflow_name),d=u.totalEstimatedMs,f=Jw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:ND(t,s.id),g=xD(s,a,h,u.perStep,i),_=AD(h,u.perStep),S=RD(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,...ka(d,f),...S},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...ka(d,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...ka(d,f),...S},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...ka(d,f),...S},errors_json:null,duration_ms:c}}function ID(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 ND(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function xD(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=Jw(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function AD(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function RD(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 Jw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function ka(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function $D(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 LD(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 jD(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 OD(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 CD(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var Ia,Cn,pD,Mn,Td,hD,Xw=E(()=>{"use strict";Ia="project:",Cn="web_project:",pD="prompt:",Mn="default",Td="Default workspace",hD=new Date(0).toISOString()});import{Buffer as Gw}from"node:buffer";function Kw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Vw(t){return PD[t]}function Yw(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 MD,DD,xa,PD,Sd=E(()=>{"use strict";MD=1e4,DD=256*1024,xa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Kw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,MD),this.pushByteCap=Kw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,DD),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=Gw.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${r} bytes=${Gw.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1948
1954
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1949
- `,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)}};PD={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 Zw(t,e){t.post("/mailbox/terminal/launch",r=>FD(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>UD(r,e)),t.get("/mailbox/terminal/sessions",r=>WD(r,e))}async function FD(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"||!zw.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=Yw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Vw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no 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 UD(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||!zw.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function WD(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var zw,Qw=E(()=>{"use strict";Sd();zw=/^[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 BD}from"node:buffer";function JD(t){try{return BD.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function eE(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 tE(t){return XD[t]}function rE(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 HD,qD,xa,XD,vd=E(()=>{"use strict";HD=2e3,qD=64*1024,xa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=eE(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,HD),this.pushByteCap=eE(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,qD),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=JD(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")))})}};XD={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 sE(t,e){t.post("/mailbox/chat/launch",r=>GD(r,e)),t.post("/mailbox/chat/end/:session_id",r=>KD(r,e)),t.get("/mailbox/chat/sessions",r=>VD(r,e))}async function GD(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"||!nE.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=rE(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=tE(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 KD(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||!nE.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 VD(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 nE,oE=E(()=>{"use strict";vd();nE=/^[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 YD}from"node:fs";function aE(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return iE(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=YD(e.path,{encoding:"utf8"});return iE(r)}catch{return[]}}function iE(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 lE=E(()=>{"use strict"});function cE(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 Aa(t,e){let r=t.query(`SELECT id, kind FROM attention
1955
+ `,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)}};PD={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 Zw(t,e){t.post("/mailbox/terminal/launch",r=>FD(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>UD(r,e)),t.get("/mailbox/terminal/sessions",r=>WD(r,e))}async function FD(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"||!zw.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=Yw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Vw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no 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 UD(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||!zw.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function WD(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var zw,Qw=E(()=>{"use strict";Sd();zw=/^[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 BD}from"node:buffer";function JD(t){try{return BD.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function eE(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 tE(t){return XD[t]}function rE(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 HD,qD,Aa,XD,vd=E(()=>{"use strict";HD=2e3,qD=64*1024,Aa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=eE(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,HD),this.pushByteCap=eE(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,qD),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=JD(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")))})}};XD={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 sE(t,e){t.post("/mailbox/chat/launch",r=>GD(r,e)),t.post("/mailbox/chat/end/:session_id",r=>KD(r,e)),t.get("/mailbox/chat/sessions",r=>VD(r,e))}async function GD(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"||!nE.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=rE(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=tE(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 KD(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||!nE.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 VD(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 nE,oE=E(()=>{"use strict";vd();nE=/^[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 YD}from"node:fs";function aE(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return iE(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=YD(e.path,{encoding:"utf8"});return iE(r)}catch{return[]}}function iE(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 lE=E(()=>{"use strict"});function cE(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
1950
1956
  WHERE run_id = ?
1951
1957
  AND acknowledged_at IS NULL
1952
1958
  AND requires_user = 1
1953
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Ra=E(()=>{"use strict"});function wE(t,e){t.all("/runtime/*",r=>zD(r.req.raw,e))}async function zD(t,e){try{return Response.json(await ZD(t,e))}catch(r){if(r instanceof ie)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function ZD(t,e){let r=new URL(t.url),n=oP(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return kd(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return $a(t,n.id,s[2]),QD(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){$a(t,n.id,s[2]);let o=dE(e.dal,s[4]);return uE(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return kd(t),e.dal.listTeams().map(o=>sP(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=fE(e.dal,mE(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead chat body does not match route team");return hE(t,n.id,i.context),pE(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=fE(e.dal,mE(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead message body does not match route team");hE(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime lead message requires draft.body");return pE(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){$a(t,n.id,s[2]);let o=dE(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new ie(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime workflow message requires draft.body");return rP(e.dal,o,a),uE(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Gs(t,n.id),e.dal.listWorkflows().map(o=>iP(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Gs(t,n.id);let o=lP(e.dal,s[2]);return aP(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Gs(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new ie(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return cP(e.dal,o,i).map(l=>gE(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Gs(t,n.id);let o=_E(e.dal,s[2]);return gE(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Gs(t,n.id);let o=_E(e.dal,s[2]),i=dP(e.dal,o);return{runId:Rd(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new ie(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function QD(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>EE(t,e,r))}}function uE(t,e,r){let n=EE(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:eP(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:tP(t,r)}}function EE(t,e,r){let n=TE(t,r.id),s=Nd(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 eP(t,e){let r=TE(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:Nd(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 tP(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 rP(t,e,r){let n=nP(t,e.id);if(n!==null){let s=Aa(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new ie(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=It(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new ie(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new ie(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function TE(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 nP(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 Nd(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 dE(t,e){let r=t.findProjectByName(e);if(r===null)throw new ie(404,`project not found: ${e}`);return r}function fE(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ie(404,`team not found: ${e}`);return r}function mE(t){return t.startsWith("team:")?t.slice(5):t}function sP(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function pE(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??yE}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function oP(t){let e=t.workspaceName??Zn()??Rr.default;return{id:e,name:e}}function kd(t){if(t.headers.get("x-lmctl-workspace-id")!==yE)throw new ie(400,"runtime request requires global-admin workspace identity")}function $a(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ie(400,"runtime workspace identity does not match route")}function Gs(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e)throw new ie(400,"runtime workspace identity does not match server workspace")}function hE(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ie(400,"workspace manager context requires workspace identity");$a(t,e,r.workspaceId);return}kd(t)}function xd(t){return`${Dn}${Ad(t.name)}`}function Ad(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Rd(t){return`${Id}${t.id}`}function iP(t){let e=La(t.definition);return{id:xd(t),name:t.name,...e.description===null?{}:{description:e.description}}}function aP(t){let e=La(t.definition);return{id:xd(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function La(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 lP(t,e){if(!e.startsWith(Dn))throw new ie(404,`template not found: ${e}`);let r=e.slice(Dn.length),n=t.listWorkflows().filter(s=>Ad(s.name)===r);if(n.length===0)throw new ie(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new ie(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function _E(t,e){if(!e.startsWith(Id))throw new ie(404,`run not found: ${e}`);let r=e.slice(Id.length);if(!/^[1-9]\d*$/.test(r))throw new ie(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ie(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ie(404,`run not found: ${e}`);return s}function cP(t,e,r){if(r!==null){if(!r.startsWith(Dn))return[];let s=r.slice(Dn.length),o=t.listWorkflows().filter(a=>Ad(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 gE(t,e){let r=t.getWorkflow(e.workflow_id),n=Nd(e),s=uP(r,e);return{id:Rd(e),templateId:r===null?`${Dn}unknown`:xd(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 uP(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]:[La(t.definition).nameToId.get(r)??r]}function dP(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:La(r.definition),s=c=>n.nameToId.get(c)??c,o=Rd(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=fP(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 fP(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 yE,Dn,Id,ie,bE=E(()=>{"use strict";Ke();Ra();Xt();yE="global-admin";Dn="template:",Id="run:";ie=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as mP,writeFileSync as pP}from"node:fs";import{randomUUID as SE}from"node:crypto";import{dirname as hP,resolve as ja,sep as vE}from"node:path";async function IE(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(!EP(n))return t.text("missing image file",400);if(n.size>_P)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=TP(s);if(o===null||!(o in kE))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=gP(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?ja(wP()):ja(i.local_path),l=ja(a,"uploads",SE()),c=ja(l,`${SE()}${kE[o]}`);if(!yP(c,a))return t.text("invalid upload path",400);mP(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);pP(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function gP(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function yP(t,e){let r=e.endsWith(vE)?e:`${e}${vE}`;return t.startsWith(r)}function wP(){return hP(le())}function EP(t){return typeof File<"u"&&t instanceof File}function TP(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 _P,kE,NE=E(()=>{"use strict";Ke();_P=10*1024*1024,kE={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Oa}from"node:fs";import{basename as bP,dirname as SP,extname as vP,isAbsolute as kP,join as IP,relative as NP}from"node:path";import{fileURLToPath as xP}from"node:url";import{Hono as AP}from"hono";import{serveStatic as At}from"@hono/node-server/serve-static";function OE(t){let e=new AP,r=[],n=t.localWebui!==void 0?Ld(t.localWebui.webuiDir):RP();if(t.localWebui!==void 0&&Fw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=$P();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,At({root:n})),e.use("/vendor/*",s,At({root:n})),e.use("/src/*",s,At({root:n})),e.get("/",s,At({root:n,path:"index.html"})),e.get("/admin",s,At({root:n,path:"index.html"})),e.get("/admin/*",s,At({root:n,path:"index.html"})),e.get("/terminal",s,At({root:n,path:"index.html"})),e.get("/terminal/*",s,At({root:n,path:"index.html"})),e.get("/chat",s,At({root:n,path:"index.html"})),e.get("/chat/*",s,At({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("*",vg()),e.get("/login",s=>s.html(Le("Login",`
1959
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var $a=E(()=>{"use strict"});function wE(t,e){t.all("/runtime/*",r=>zD(r.req.raw,e))}async function zD(t,e){try{return Response.json(await ZD(t,e))}catch(r){if(r instanceof ie)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function ZD(t,e){let r=new URL(t.url),n=oP(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return kd(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return La(t,n.id,s[2]),QD(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){La(t,n.id,s[2]);let o=dE(e.dal,s[4]);return uE(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return kd(t),e.dal.listTeams().map(o=>sP(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=fE(e.dal,mE(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead chat body does not match route team");return hE(t,n.id,i.context),pE(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=fE(e.dal,mE(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead message body does not match route team");hE(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime lead message requires draft.body");return pE(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){La(t,n.id,s[2]);let o=dE(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new ie(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime workflow message requires draft.body");return rP(e.dal,o,a),uE(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Gs(t,n.id),e.dal.listWorkflows().map(o=>iP(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Gs(t,n.id);let o=lP(e.dal,s[2]);return aP(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Gs(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new ie(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return cP(e.dal,o,i).map(l=>gE(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Gs(t,n.id);let o=_E(e.dal,s[2]);return gE(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Gs(t,n.id);let o=_E(e.dal,s[2]),i=dP(e.dal,o);return{runId:Rd(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new ie(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function QD(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>EE(t,e,r))}}function uE(t,e,r){let n=EE(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:eP(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:tP(t,r)}}function EE(t,e,r){let n=TE(t,r.id),s=Nd(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 eP(t,e){let r=TE(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:Nd(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 tP(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 rP(t,e,r){let n=nP(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 ie(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=It(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new ie(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new ie(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function TE(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 nP(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 Nd(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 dE(t,e){let r=t.findProjectByName(e);if(r===null)throw new ie(404,`project not found: ${e}`);return r}function fE(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ie(404,`team not found: ${e}`);return r}function mE(t){return t.startsWith("team:")?t.slice(5):t}function sP(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function pE(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??yE}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function oP(t){let e=t.workspaceName??Zn()??Rr.default;return{id:e,name:e}}function kd(t){if(t.headers.get("x-lmctl-workspace-id")!==yE)throw new ie(400,"runtime request requires global-admin workspace identity")}function La(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ie(400,"runtime workspace identity does not match route")}function Gs(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e)throw new ie(400,"runtime workspace identity does not match server workspace")}function hE(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ie(400,"workspace manager context requires workspace identity");La(t,e,r.workspaceId);return}kd(t)}function xd(t){return`${Dn}${Ad(t.name)}`}function Ad(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Rd(t){return`${Id}${t.id}`}function iP(t){let e=ja(t.definition);return{id:xd(t),name:t.name,...e.description===null?{}:{description:e.description}}}function aP(t){let e=ja(t.definition);return{id:xd(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ja(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 lP(t,e){if(!e.startsWith(Dn))throw new ie(404,`template not found: ${e}`);let r=e.slice(Dn.length),n=t.listWorkflows().filter(s=>Ad(s.name)===r);if(n.length===0)throw new ie(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new ie(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function _E(t,e){if(!e.startsWith(Id))throw new ie(404,`run not found: ${e}`);let r=e.slice(Id.length);if(!/^[1-9]\d*$/.test(r))throw new ie(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ie(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ie(404,`run not found: ${e}`);return s}function cP(t,e,r){if(r!==null){if(!r.startsWith(Dn))return[];let s=r.slice(Dn.length),o=t.listWorkflows().filter(a=>Ad(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 gE(t,e){let r=t.getWorkflow(e.workflow_id),n=Nd(e),s=uP(r,e);return{id:Rd(e),templateId:r===null?`${Dn}unknown`:xd(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 uP(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]:[ja(t.definition).nameToId.get(r)??r]}function dP(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ja(r.definition),s=c=>n.nameToId.get(c)??c,o=Rd(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=fP(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 fP(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 yE,Dn,Id,ie,bE=E(()=>{"use strict";Ke();$a();Xt();yE="global-admin";Dn="template:",Id="run:";ie=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as mP,writeFileSync as pP}from"node:fs";import{randomUUID as SE}from"node:crypto";import{dirname as hP,resolve as Oa,sep as vE}from"node:path";async function IE(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(!EP(n))return t.text("missing image file",400);if(n.size>_P)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=TP(s);if(o===null||!(o in kE))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=gP(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Oa(wP()):Oa(i.local_path),l=Oa(a,"uploads",SE()),c=Oa(l,`${SE()}${kE[o]}`);if(!yP(c,a))return t.text("invalid upload path",400);mP(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);pP(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function gP(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function yP(t,e){let r=e.endsWith(vE)?e:`${e}${vE}`;return t.startsWith(r)}function wP(){return hP(le())}function EP(t){return typeof File<"u"&&t instanceof File}function TP(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 _P,kE,NE=E(()=>{"use strict";Ke();_P=10*1024*1024,kE={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Ca}from"node:fs";import{basename as bP,dirname as SP,extname as vP,isAbsolute as kP,join as IP,relative as NP}from"node:path";import{fileURLToPath as xP}from"node:url";import{Hono as AP}from"hono";import{serveStatic as At}from"@hono/node-server/serve-static";function OE(t){let e=new AP,r=[],n=t.localWebui!==void 0?Ld(t.localWebui.webuiDir):RP();if(t.localWebui!==void 0&&Fw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=$P();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,At({root:n})),e.use("/vendor/*",s,At({root:n})),e.use("/src/*",s,At({root:n})),e.get("/",s,At({root:n,path:"index.html"})),e.get("/admin",s,At({root:n,path:"index.html"})),e.get("/admin/*",s,At({root:n,path:"index.html"})),e.get("/terminal",s,At({root:n,path:"index.html"})),e.get("/terminal/*",s,At({root:n,path:"index.html"})),e.get("/chat",s,At({root:n,path:"index.html"})),e.get("/chat/*",s,At({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("*",vg()),e.get("/login",s=>s.html(Le("Login",`
1954
1960
  <h1>Login</h1>
1955
1961
  <form method="post" action="/login">
1956
1962
  <label>Token <input name="token" type="password"></label>
1957
1963
  <button type="submit">Login</button>
1958
1964
  </form>
1959
- `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return Ig(i)?(Uu(s,i),s.redirect("/",302)):s.html(Le("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Ng(s),s.redirect("/login",302))),vw(e,{dal:t.dal}),wE(e,{dal:t.dal}),Ww(e,{dal:t.dal}),Zw(e,{terminalSessionManager:t.terminalSessionManager}),sE(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Ts(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 qc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return H(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${v(f.team)}: seeded [${f.seeded.map(m=>v(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${v(m.alias)}: ${v(m.error)}`).join(", ")}]`:""}</p>`)}),Og(e,{dal:t.dal}),Wg(e,{dal:t.dal}),e.get("/api/status",s=>H(s,ii(t.dal),PP)),e.get("/api/projects",s=>H(s,ai(t.dal),FP)),e.get("/api/teams",s=>H(s,Oh(t.dal),BP)),e.get("/api/workflows",s=>H(s,li(t.dal),HP)),e.get("/api/workflows/verify",s=>{let o=lw();return s.req.header("accept")?.includes("text/plain")?s.text(uw(o)):s.json(o)}),e.get("/api/jobs",s=>H(s,Ch(t.dal,{status:s.req.query("status")}),qP)),e.post("/api/uploads",s=>IE(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=ci(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,de)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return H(s,d,de)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Xs(),Ew)),i=ci(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():H(s,o,de)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():H(s,t.dal.listProjectWorkflows(o.id),UP)}),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 Pn(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{gr(u)}catch{return s.text("invalid condition",400)}let d=OP(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return H(s,m,de)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():H(s,o,de)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?H(s,{removed:!0},de):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():H(s,o,de)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():H(s,o,de)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=AE(s.req.query("status"),CP);if(typeof i=="string")return s.text(i,400);let a=AE(s.req.query("severity"),ME);return typeof a=="string"?s.text(a,400):H(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),WP)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Pn(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=MP(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=DP(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return H(s,d,de)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():H(s,o,de)}),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 Pn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):H(s,c,de)}),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 Pn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):H(s,l,de)}),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 Pn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return H(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),de)}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 Pn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return H(s,t.dal.reopenIssue(re(s,"id"),a),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return H(s,{...o,owner:a,repo:l},de)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=Pr(t.dal,o,i);return H(s,a,de)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=Pr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):H(s,l,de);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=LP(l.path);if(jP(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=bP(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return H(s,l,de)}return H(s,l,de)}),e.get("/api/runs",s=>H(s,dn(t.dal,{limit:$d(s,"limit")??100}),JP)),e.get("/api/runs/:id",s=>{let o=Dr(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,XP)}),e.get("/api/runs/:id/where",s=>{let o=fn(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(di(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=fi(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(mi(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),H(s,i,RE)):H(s,i,RE,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=>xE(s,t.dal,o=>H(s,o,KP))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Fh(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():CE(s)?s.html(`<pre>${v(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=>xE(s,t.dal,o=>{let i=aE(o);return H(s,i,a=>he(["role","text"],a.map(l=>[v(l.role),v(l.text)])))})),e.get("/api/external-objects",s=>H(s,Uh(t.dal,{type:s.req.query("type")}),VP)),e.get("/api/external-signals",s=>H(s,Wh(t.dal,{unhandled:s.req.query("unhandled")==="true"}),YP)),e.get("/api/attentions",s=>H(s,mr(t.dal,{unacked:s.req.query("unacked")==="true"}),zP)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():H(s,o,i=>`<p>acknowledged attention ${v(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=ui(t.dal,l);return H(s,c,u=>`<h1>Escalations</h1>${he(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[v(d.attention_id),v(d.project),v(d.run_id),v(d.workflow_name),v(d.state_name),v((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=It(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,de)}),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=It(t.dal,o);if(c===null)return s.notFound();let u=mr(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=mr(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=Mh(t.dal,{status:i,pr_url:o});return H(s,a,ZP)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Dh(t.dal,o);return i===null?s.notFound():H(s,i,QP)}),e.get("/api/sessions",s=>H(s,t.dal.latestSessionSizes(),$E)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Ts(s.req.param("team_name"));return H(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),$E)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Ts(s.req.param("team_name"));try{let i=await Nh(t.dal,o,s.req.param("alias"));return H(s,i,a=>LE("compacted",a.row))}catch(i){if(i instanceof Es)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Ts(s.req.param("team_name")),i=await qc(t.dal,o,s.req.param("alias"));return H(s,i,a=>LE(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>H(s,r,jE)),e.post("/api/intake/scan",async s=>(r=await xn(t.dal),H(s,r,jE))),e.get("/api/stats/run-throughput",s=>H(s,qh(t.dal),e1)),e.get("/api/daemon/state",s=>H(s,t.daemon?.state??null,t1)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return H(s,{disabled:!0},de);let o=await t.daemon.runCycle();return H(s,{state:t.daemon.state,result:o},de)}),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=zc(t.dal,o),l=Zc(t.dal,{project_id:o});return s.html(Le(`Metrics \u2014 ${i.name}`,r1(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=$d(s,"since_days");return s.json(zc(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=$d(s,"since_days");return s.json(Zc(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(re(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function xE(t,e,r){let n=Yc(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 H(t,e,r,n=200){return CE(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 CE(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function RP(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Oa(`${t}/index.html`)?Ld(t):null;let e="src/serve/webui-dist";if(Oa(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Oa(`${r}/index.html`))return r;let n=IP(SP(xP(import.meta.url)),"webui-dist");return Oa(`${n}/index.html`)?Ld(n):null}function Ld(t){if(!kP(t))return t;let e=NP(process.cwd(),t);return e.length===0?".":e}function $P(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function $d(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 LP(t){switch(vP(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 jP(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Pn(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 OP(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 AE(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 MP(t){if(t!=null)return typeof t=="string"&&ME.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function DP(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 PP(t){return`<h1>Status</h1><div class="grid">
1965
+ `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return Ig(i)?(Uu(s,i),s.redirect("/",302)):s.html(Le("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Ng(s),s.redirect("/login",302))),vw(e,{dal:t.dal}),wE(e,{dal:t.dal}),Ww(e,{dal:t.dal}),Zw(e,{terminalSessionManager:t.terminalSessionManager}),sE(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Ts(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 qc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return H(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${v(f.team)}: seeded [${f.seeded.map(m=>v(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${v(m.alias)}: ${v(m.error)}`).join(", ")}]`:""}</p>`)}),Og(e,{dal:t.dal}),Wg(e,{dal:t.dal}),e.get("/api/status",s=>H(s,ai(t.dal),PP)),e.get("/api/projects",s=>H(s,li(t.dal),FP)),e.get("/api/teams",s=>H(s,Oh(t.dal),BP)),e.get("/api/workflows",s=>H(s,ci(t.dal),HP)),e.get("/api/workflows/verify",s=>{let o=lw();return s.req.header("accept")?.includes("text/plain")?s.text(uw(o)):s.json(o)}),e.get("/api/jobs",s=>H(s,Ch(t.dal,{status:s.req.query("status")}),qP)),e.post("/api/uploads",s=>IE(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=ui(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,de)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return H(s,d,de)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Xs(),Ew)),i=ui(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():H(s,o,de)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():H(s,t.dal.listProjectWorkflows(o.id),UP)}),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 Pn(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{gr(u)}catch{return s.text("invalid condition",400)}let d=OP(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return H(s,m,de)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():H(s,o,de)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?H(s,{removed:!0},de):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():H(s,o,de)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():H(s,o,de)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=AE(s.req.query("status"),CP);if(typeof i=="string")return s.text(i,400);let a=AE(s.req.query("severity"),ME);return typeof a=="string"?s.text(a,400):H(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),WP)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Pn(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=MP(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=DP(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return H(s,d,de)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():H(s,o,de)}),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 Pn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):H(s,c,de)}),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 Pn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):H(s,l,de)}),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 Pn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return H(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),de)}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 Pn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return H(s,t.dal.reopenIssue(re(s,"id"),a),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return H(s,{...o,owner:a,repo:l},de)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=Pr(t.dal,o,i);return H(s,a,de)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=Pr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):H(s,l,de);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=LP(l.path);if(jP(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=bP(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return H(s,l,de)}return H(s,l,de)}),e.get("/api/runs",s=>H(s,dn(t.dal,{limit:$d(s,"limit")??100}),JP)),e.get("/api/runs/:id",s=>{let o=Dr(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,XP)}),e.get("/api/runs/:id/where",s=>{let o=fn(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(fi(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=mi(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(pi(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?(Ma(t.daemon),H(s,i,RE)):H(s,i,RE,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?(Ma(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=>xE(s,t.dal,o=>H(s,o,KP))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Fh(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():CE(s)?s.html(`<pre>${v(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=>xE(s,t.dal,o=>{let i=aE(o);return H(s,i,a=>he(["role","text"],a.map(l=>[v(l.role),v(l.text)])))})),e.get("/api/external-objects",s=>H(s,Uh(t.dal,{type:s.req.query("type")}),VP)),e.get("/api/external-signals",s=>H(s,Wh(t.dal,{unhandled:s.req.query("unhandled")==="true"}),YP)),e.get("/api/attentions",s=>H(s,mr(t.dal,{unacked:s.req.query("unacked")==="true"}),zP)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():H(s,o,i=>`<p>acknowledged attention ${v(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=di(t.dal,l);return H(s,c,u=>`<h1>Escalations</h1>${he(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[v(d.attention_id),v(d.project),v(d.run_id),v(d.workflow_name),v(d.state_name),v((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=It(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,de)}),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=It(t.dal,o);if(c===null)return s.notFound();let u=mr(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);Ma(t.daemon);let p=mr(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 Ma(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=Mh(t.dal,{status:i,pr_url:o});return H(s,a,ZP)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Dh(t.dal,o);return i===null?s.notFound():H(s,i,QP)}),e.get("/api/sessions",s=>H(s,t.dal.latestSessionSizes(),$E)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Ts(s.req.param("team_name"));return H(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),$E)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Ts(s.req.param("team_name"));try{let i=await Nh(t.dal,o,s.req.param("alias"));return H(s,i,a=>LE("compacted",a.row))}catch(i){if(i instanceof Es)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Ts(s.req.param("team_name")),i=await qc(t.dal,o,s.req.param("alias"));return H(s,i,a=>LE(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>H(s,r,jE)),e.post("/api/intake/scan",async s=>(r=await xn(t.dal),H(s,r,jE))),e.get("/api/stats/run-throughput",s=>H(s,qh(t.dal),e1)),e.get("/api/daemon/state",s=>H(s,t.daemon?.state??null,t1)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return H(s,{disabled:!0},de);let o=await t.daemon.runCycle();return H(s,{state:t.daemon.state,result:o},de)}),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=zc(t.dal,o),l=Zc(t.dal,{project_id:o});return s.html(Le(`Metrics \u2014 ${i.name}`,r1(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=$d(s,"since_days");return s.json(zc(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=$d(s,"since_days");return s.json(Zc(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(re(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function xE(t,e,r){let n=Yc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function Ma(t){t!==void 0&&t.runCycle().catch(()=>{})}function H(t,e,r,n=200){return CE(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 CE(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function RP(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Ca(`${t}/index.html`)?Ld(t):null;let e="src/serve/webui-dist";if(Ca(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Ca(`${r}/index.html`))return r;let n=IP(SP(xP(import.meta.url)),"webui-dist");return Ca(`${n}/index.html`)?Ld(n):null}function Ld(t){if(!kP(t))return t;let e=NP(process.cwd(),t);return e.length===0?".":e}function $P(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function $d(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 LP(t){switch(vP(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 jP(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Pn(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 OP(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 AE(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 MP(t){if(t!=null)return typeof t=="string"&&ME.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function DP(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 PP(t){return`<h1>Status</h1><div class="grid">
1960
1966
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
1961
1967
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
1962
1968
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
@@ -1990,7 +1996,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1990
1996
  <dt>submitted_at</dt><dd>${v(t.submitted_at)}</dd>
1991
1997
  <dt>last_scanned_at</dt><dd>${v(t.last_scanned_at??"\u2014")}</dd>
1992
1998
  <dt>last_known_state</dt><dd>${v(t.last_known_state??"\u2014")}</dd>
1993
- </dl>`}function $E(t){return`<h1>Sessions</h1>${he(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=ti(e.team_name),n=encodeURIComponent(e.alias);return[v(e.team_name),v(e.alias),v(e.sessionid),v(e.input_tokens),v(e.cache_tokens),v(e.output_tokens),v(e.total_tokens),v(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 LE(t,e){return e===null?`<span>${v(t)}</span>`:`<span>${v(t)} ${v(e.team_name)}/${v(e.alias)}</span>`}function e1(t){return`<h1>Run Throughput</h1>${he(["workflow","terminal","count"],t.map(e=>[v(e.workflow_name),v(e.terminal_state),v(e.count)]))}`}function jE(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${he(["project","scanned","new jobs","error"],t.map(e=>[v(e.project_name),v(e.scanned),v(e.new_jobs),v(e.error)]))}`}function t1(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${de(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function r1(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[v(l.state_name),v(l.total),v(l.request_changes),v(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[v(l.state_name),v(l.lt_5min),v(l.btw_5_15min),v(l.btw_15_60min),v(l.gt_60min),v(l.no_end)]),i=e.retry_counts.map(l=>[v(l.state_name),v(l.retried_runs),v(l.avg_retries)]),a=r.map(l=>[v(l.tool_name),v(l.invocations),v(l.successes),v(l.hit_rate_pct),v(l.avg_latency_ms??"n/a"),v(l.p50_latency_ms??"n/a"),v(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${v(t)}</h1>
1999
+ </dl>`}function $E(t){return`<h1>Sessions</h1>${he(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=ri(e.team_name),n=encodeURIComponent(e.alias);return[v(e.team_name),v(e.alias),v(e.sessionid),v(e.input_tokens),v(e.cache_tokens),v(e.output_tokens),v(e.total_tokens),v(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 LE(t,e){return e===null?`<span>${v(t)}</span>`:`<span>${v(t)} ${v(e.team_name)}/${v(e.alias)}</span>`}function e1(t){return`<h1>Run Throughput</h1>${he(["workflow","terminal","count"],t.map(e=>[v(e.workflow_name),v(e.terminal_state),v(e.count)]))}`}function jE(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${he(["project","scanned","new jobs","error"],t.map(e=>[v(e.project_name),v(e.scanned),v(e.new_jobs),v(e.error)]))}`}function t1(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${de(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function r1(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[v(l.state_name),v(l.total),v(l.request_changes),v(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[v(l.state_name),v(l.lt_5min),v(l.btw_5_15min),v(l.btw_15_60min),v(l.gt_60min),v(l.no_end)]),i=e.retry_counts.map(l=>[v(l.state_name),v(l.retried_runs),v(l.avg_retries)]),a=r.map(l=>[v(l.tool_name),v(l.invocations),v(l.successes),v(l.hit_rate_pct),v(l.avg_latency_ms??"n/a"),v(l.p50_latency_ms??"n/a"),v(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${v(t)}</h1>
1994
2000
  <h2>Request-changes rate</h2>
1995
2001
  <p>Total: ${v(n.request_changes)} of ${v(n.total)} steps (${v(n.rate_pct)})</p>
1996
2002
  ${he(["state","total steps","request_changes","rate"],s)}
@@ -1999,30 +2005,30 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1999
2005
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
2000
2006
  ${he(["state","retried runs","avg attempts"],i)}
2001
2007
  <h2>Tool efficacy</h2>
2002
- ${he(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var CP,ME,DE=E(()=>{"use strict";Yi();Sn();Ag();Cg();Bg();Xt();Xu();Lw();Uw();Xw();Qw();oE();lE();bE();ri();NE();ma();CP=["open","assigned","closed","reopened"],ME=["low","medium","high","critical"]});function n1(t){return Math.floor(t/6e4)*6e4}function s1(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)o1(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function o1(t,e){let r=Date.now(),n=n1(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 PE(t,e=250){let r=setInterval(()=>{try{s1(t)}catch{}},e);return{stop(){clearInterval(r)}}}var FE=E(()=>{"use strict"});function a1({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
2008
+ ${he(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var CP,ME,DE=E(()=>{"use strict";zi();Sn();Ag();Cg();Bg();Xt();Xu();Lw();Uw();Xw();Qw();oE();lE();bE();ni();NE();pa();CP=["open","assigned","closed","reopened"],ME=["low","medium","high","critical"]});function n1(t){return Math.floor(t/6e4)*6e4}function s1(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)o1(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function o1(t,e){let r=Date.now(),n=n1(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 PE(t,e=250){let r=setInterval(()=>{try{s1(t)}catch{}},e);return{stop(){clearInterval(r)}}}var FE=E(()=>{"use strict"});function a1({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
2003
2009
  FROM run r
2004
2010
  JOIN job j ON j.id = r.job_id
2005
2011
  WHERE j.project_id = ?
2006
2012
  AND r.terminal_state IS NOT NULL
2007
2013
  ORDER BY r.id DESC
2008
- 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,i1).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,UE)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:UE,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function WE(t){for(let e of l1)try{e(t)}catch{}}var i1,UE,l1,BE=E(()=>{"use strict";i1="request_changes",UE="reviewer_rejection_rate_high";l1=[a1]});function Ks(){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 HE(t){let e=t.intervalMs??Ks(),r=t.runOnceFn??qr,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??PE)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=qE(t.dal,t.monitorSessionActivityFn??Jc,e,n).finally(()=>{a=null})),a.finally(()=>u(Xc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=c1(t.dal,r,t.collectSessionSizesFn??Ih,t.scanIntakeFn??xn,t.monitorSessionActivityFn??Jc,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 c1(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(pw({dal:t}),WE({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 qE(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 qE(t,e,r,n){let s=Xc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var jd=E(()=>{"use strict";Yi();Xs();cd();ri();FE();BE();Gc()});function JE(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 XE=E(()=>{"use strict"});import{mkdirSync as u1,readFileSync as d1,readdirSync as f1,statSync as m1,writeFileSync as p1}from"node:fs";import{dirname as h1,join as KE,sep as GE}from"node:path";function Ma(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case VE:return _1(t,s.input);case YE:return g1(t,s.input);case zE:return y1(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Md,GetObjectCommand:Cd,PutObjectCommand:Od}}}function _1(t,e){let r=ZE(t,e.Key);return u1(h1(r),{recursive:!0}),p1(r,e.Body),{}}function g1(t,e){let r=ZE(t,e.Key),n;try{n=d1(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 y1(t,e){let r=e.Prefix??"";QE(r);let s=w1(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 ZE(t,e){return QE(e),KE(t,e)}function QE(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function w1(t){let e=[],r=(n,s)=>{let o;try{o=f1(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=KE(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=GE==="/"?a:a.split(GE).join("/");e.push({key:c,lastModified:m1(l).mtime})}}};return r(t,""),e}var VE,YE,zE,Od,Cd,Md,Dd=E(()=>{"use strict";VE="localfs-put",YE="localfs-get",zE="localfs-list",Od=class{input;_localfsTag=VE;constructor(e){this.input=e}},Cd=class{input;_localfsTag=YE;constructor(e){this.input=e}},Md=class{input;_localfsTag=zE;constructor(e){this.input=e}}});function eT(){return{put:0,get:0,list:0}}function Pd(t,e=E1){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Fd(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var E1,Da,Ud=E(()=>{"use strict";E1={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Da=class{counts=eT();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=eT(),e}estimateCostUsd(e){return Pd(this.counts,e)}}});function tT(t){let e=t.now??Date.now,r=t.timers??T1,n=null,s=null;async function o(){let l=e(),c=Fd(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=Pd(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===Fd(e())}}}var T1,rT=E(()=>{"use strict";Ud();T1={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Wd=E(()=>{"use strict";Ea();ba();ba()});function b1(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 S1(t){return t.reply_to!==void 0&&t.response!==void 0}function v1(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function nT(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 Pa,Vs,sT=E(()=>{"use strict";Wd();Pa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Vs=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 Pa("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Qt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let 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(nT(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(nT(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 Pa;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=b1(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(S1(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??v1(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:Qt(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 Bd(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 oT=E(()=>{"use strict"});function Hd(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 iT=E(()=>{"use strict"});function Jd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var qd,aT=E(()=>{"use strict";qd="daemon:events"});function cT(t){return{kind:"prompt",prompt_id:t.prompt_id??Qt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Xd(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 lT,Gd=E(()=>{"use strict";Wd();lT="prompt:root"});function Ys(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(dT(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function k1(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(dT(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function uT(t,e=60){if(typeof t!="string"||t==="")return!0;let r=k1(t);return r===null?!0:Date.now()/1e3>=r-e}function dT(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 Kd=E(()=>{"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":I1},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 I1,Vd=E(()=>{"use strict";I1="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as fT,mkdirSync as mT,readFileSync as pT,writeFileSync as hT}from"node:fs";import{homedir as _T}from"node:os";import{dirname as gT,join as yT}from"node:path";function zs(){return process.env.LMCTL_DEVICE_AUTH_PATH??yT(_T(),".lmctl","device-auth.json")}function wT(){return process.env.LMCTL_TOKEN_PATH??yT(_T(),".lmctl","cli-tokens.json")}function Yd(t=zs()){try{let e=JSON.parse(pT(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 ET(t,e=zs()){mT(gT(e),{recursive:!0,mode:448}),hT(e,JSON.stringify(t,null,2));try{fT(e,384)}catch{}}function zd(t,e=wT()){let r={};try{r=JSON.parse(pT(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};mT(gT(e),{recursive:!0,mode:448}),hT(e,JSON.stringify(s,null,2));try{fT(e,384)}catch{}}async function TT(t){let e=t.deviceAuthPath??zs(),r=Yd(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 zd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??wT()),{idToken:n.idToken,userId:r.userId}}var Zd=E(()=>{"use strict";Vd()});function bT(t){if(t.length===0||!t.startsWith("---"))throw new Rt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
2009
- `);if(e[0]!=="---")throw new Rt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Rt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!N1.has(c))throw new Rt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Ua.join(", ")}`);r[c]=u}if(n===-1)throw new Rt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Ua)if(r[i]===void 0)throw new Rt(`missing required frontmatter key "${i}" \u2014 required: ${Ua.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 Ua,N1,Rt,ST=E(()=>{"use strict";Ua=["title","description","members"],N1=new Set(Ua),Rt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as x1,writeFileSync as u5,renameSync as d5,existsSync as kT}from"node:fs";import{basename as A1,resolve as Fn,dirname as Qd}from"node:path";function $1(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 L1(t){return/^\s*_MEMBER_\s+\S/.test(t)}function j1(t){return/^\s*_SESSION_\s+\S/.test(t)}function O1(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Wa(t){let e=A1(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Fe(t){let e=x1(t,"utf-8"),r=Qd(Fn(t)),n=tf(e,Wa(t),{baseDir:r,sourcePath:Fn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Fn(r,s.sessiondir));return n}function tf(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
2014
+ 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,i1).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,UE)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:UE,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function WE(t){for(let e of l1)try{e(t)}catch{}}var i1,UE,l1,BE=E(()=>{"use strict";i1="request_changes",UE="reviewer_rejection_rate_high";l1=[a1]});function Ks(){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 HE(t){let e=t.intervalMs??Ks(),r=t.runOnceFn??qr,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??PE)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=qE(t.dal,t.monitorSessionActivityFn??Jc,e,n).finally(()=>{a=null})),a.finally(()=>u(Xc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=c1(t.dal,r,t.collectSessionSizesFn??Ih,t.scanIntakeFn??xn,t.monitorSessionActivityFn??Jc,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 c1(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(pw({dal:t}),WE({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 qE(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 qE(t,e,r,n){let s=Xc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var jd=E(()=>{"use strict";zi();Xs();cd();ni();FE();BE();Gc()});function JE(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 XE=E(()=>{"use strict"});import{mkdirSync as u1,readFileSync as d1,readdirSync as f1,statSync as m1,writeFileSync as p1}from"node:fs";import{dirname as h1,join as KE,sep as GE}from"node:path";function Da(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case VE:return _1(t,s.input);case YE:return g1(t,s.input);case zE:return y1(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Md,GetObjectCommand:Cd,PutObjectCommand:Od}}}function _1(t,e){let r=ZE(t,e.Key);return u1(h1(r),{recursive:!0}),p1(r,e.Body),{}}function g1(t,e){let r=ZE(t,e.Key),n;try{n=d1(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 y1(t,e){let r=e.Prefix??"";QE(r);let s=w1(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 ZE(t,e){return QE(e),KE(t,e)}function QE(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function w1(t){let e=[],r=(n,s)=>{let o;try{o=f1(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=KE(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=GE==="/"?a:a.split(GE).join("/");e.push({key:c,lastModified:m1(l).mtime})}}};return r(t,""),e}var VE,YE,zE,Od,Cd,Md,Dd=E(()=>{"use strict";VE="localfs-put",YE="localfs-get",zE="localfs-list",Od=class{input;_localfsTag=VE;constructor(e){this.input=e}},Cd=class{input;_localfsTag=YE;constructor(e){this.input=e}},Md=class{input;_localfsTag=zE;constructor(e){this.input=e}}});function eT(){return{put:0,get:0,list:0}}function Pd(t,e=E1){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Fd(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var E1,Pa,Ud=E(()=>{"use strict";E1={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Pa=class{counts=eT();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=eT(),e}estimateCostUsd(e){return Pd(this.counts,e)}}});function tT(t){let e=t.now??Date.now,r=t.timers??T1,n=null,s=null;async function o(){let l=e(),c=Fd(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=Pd(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===Fd(e())}}}var T1,rT=E(()=>{"use strict";Ud();T1={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Wd=E(()=>{"use strict";Ta();Sa();Sa()});function b1(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 S1(t){return t.reply_to!==void 0&&t.response!==void 0}function v1(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function nT(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,Vs,sT=E(()=>{"use strict";Wd();Fa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Vs=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=Qt(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(nT(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(nT(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=b1(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(S1(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??v1(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:Qt(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 Bd(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 oT=E(()=>{"use strict"});function Hd(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 iT=E(()=>{"use strict"});function Jd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var qd,aT=E(()=>{"use strict";qd="daemon:events"});function cT(t){return{kind:"prompt",prompt_id:t.prompt_id??Qt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Xd(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 lT,Gd=E(()=>{"use strict";Wd();lT="prompt:root"});function Ys(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(dT(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function k1(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(dT(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function uT(t,e=60){if(typeof t!="string"||t==="")return!0;let r=k1(t);return r===null?!0:Date.now()/1e3>=r-e}function dT(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 Kd=E(()=>{"use strict"});async function Ua(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":I1},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 I1,Vd=E(()=>{"use strict";I1="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as fT,mkdirSync as mT,readFileSync as pT,writeFileSync as hT}from"node:fs";import{homedir as _T}from"node:os";import{dirname as gT,join as yT}from"node:path";function zs(){return process.env.LMCTL_DEVICE_AUTH_PATH??yT(_T(),".lmctl","device-auth.json")}function wT(){return process.env.LMCTL_TOKEN_PATH??yT(_T(),".lmctl","cli-tokens.json")}function Yd(t=zs()){try{let e=JSON.parse(pT(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 ET(t,e=zs()){mT(gT(e),{recursive:!0,mode:448}),hT(e,JSON.stringify(t,null,2));try{fT(e,384)}catch{}}function zd(t,e=wT()){let r={};try{r=JSON.parse(pT(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};mT(gT(e),{recursive:!0,mode:448}),hT(e,JSON.stringify(s,null,2));try{fT(e,384)}catch{}}async function TT(t){let e=t.deviceAuthPath??zs(),r=Yd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Ua({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return zd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??wT()),{idToken:n.idToken,userId:r.userId}}var Zd=E(()=>{"use strict";Vd()});function bT(t){if(t.length===0||!t.startsWith("---"))throw new Rt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
2015
+ `);if(e[0]!=="---")throw new Rt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Rt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!N1.has(c))throw new Rt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Wa.join(", ")}`);r[c]=u}if(n===-1)throw new Rt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Wa)if(r[i]===void 0)throw new Rt(`missing required frontmatter key "${i}" \u2014 required: ${Wa.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 Wa,N1,Rt,ST=E(()=>{"use strict";Wa=["title","description","members"],N1=new Set(Wa),Rt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as x1,writeFileSync as u5,renameSync as d5,existsSync as kT}from"node:fs";import{basename as A1,resolve as Fn,dirname as Qd}from"node:path";function $1(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 L1(t){return/^\s*_MEMBER_\s+\S/.test(t)}function j1(t){return/^\s*_SESSION_\s+\S/.test(t)}function O1(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Ba(t){let e=A1(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Fe(t){let e=x1(t,"utf-8"),r=Qd(Fn(t)),n=tf(e,Ba(t),{baseDir:r,sourcePath:Fn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Fn(r,s.sessiondir));return n}function tf(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
2010
2016
  `);o=l>=0?o.slice(l+1):""}let i=null;if(o.startsWith("---"))try{i=bT(o)}catch(l){if(l instanceof Rt)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
2011
2017
  `);for(let l=0;l<a.length;l++){let c=a[l],u=l+1;if(j1(c))throw new Error(`line ${u}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(O1(c)||!L1(c))continue;let d=$1(c);for(let p of Object.keys(d))if(!vT.includes(p))throw new Error(`line ${u}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2012
- allowed keys: ${vT.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${n.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:i}}function rf(t,e){let r=[];for(let o of t.parseErrors)r.push({field:"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===ef.toLowerCase());n.length>1&&r.push({field:ef,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?Fn(e,o.teamfile):Fn(o.teamfile);if(!kT(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Fe(a),c=$t(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 R1.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 $t(t){return t.members.find(e=>e.alias.toLowerCase()===ef.toLowerCase())}function nf(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=Fn(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),!kT(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Fe(o),l=$t(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return nf(l,Qd(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||Qd(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Ba(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var ef,R1,vT,er=E(()=>{"use strict";ST();ef="Lead",R1=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);vT=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{hostname as C1}from"node:os";function Sr(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},o=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),i=o===null||o.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...i?{stale_before:n}:{},force:e.force});if(a.acquired){let c=o===null?null:e.force===!0?"force":o.holder_pid===null&&o.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:o,reclaimReason:c}}if(!xT(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function Un(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&M1(n))return!0;let s=t.getAgentInflight(e,r);if(s===null)return!1;let o=new Date(Date.now()-D1()).toISOString();return!xT(s,o)}function M1(t){if(t.holder_host===C1())return ir(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=P1():!1}function xT(t,e){return t.holder_pid===null?t.started_at<e:!ir(t.holder_pid)}function D1(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return IT;let r=Number(e);return!Number.isFinite(r)||r<=0?IT:r}function P1(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return NT;let r=Number(e);return!Number.isFinite(r)||r<=0?NT:r}var IT,NT,Wn=E(()=>{"use strict";vo();IT=8*60*60*1e3,NT=12e4});import{existsSync as F1,realpathSync as U1}from"node:fs";import{dirname as W1}from"node:path";function sf(t){B1(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function B1(t){let e=t.payload.root_teamfile;try{e=U1(t.payload.root_teamfile)}catch(s){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Bn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=H1(e);if("error"in r)return await Bn(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=Sr(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:X1(t.env??process.env)});if(!n.acquired){let s=J1(r.alias,n.current);return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let o=await(t.chat??Jt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),i=o.status==="stalled",a=!i&&o.text.trim()==="",l=i?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=i||a?"error":"ok";return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:c==="error"?null:o.text,status:c,error_detail:l,log:t.log}),{status:c,response:c==="error"?null:o.text,error_detail:l}}catch(s){let o=s instanceof Error?s.message:String(s);return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function H1(t){if(!F1(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Fe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=$t(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??W1(t)}}async function Bn(t,e){let r=$T(e.message),n=e.response===null?null:$T(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function $T(t){return t.length<=AT?{text:t,truncated:!1}:{text:t.slice(0,AT),truncated:!0}}function q1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function J1(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:q1(t,e)}function X1(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return RT;let r=Number(e);return!Number.isFinite(r)||r<=0?RT:r}var AT,RT,LT=E(()=>{"use strict";kt();er();Wn();AT=256*1024,RT=30*60*1e3});import{chmodSync as PT,existsSync as G1,mkdirSync as FT,readFileSync as Xa,writeFileSync as UT}from"node:fs";import{dirname as of,resolve as Ha,join as WT}from"node:path";import{fileURLToPath as K1}from"node:url";import{homedir as BT}from"node:os";import{CognitoIdentityClient as V1,GetIdCommand as Y1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as jT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as z1,ListObjectsV2Command as Z1,PutObjectCommand as Q1,S3Client as OT}from"@aws-sdk/client-s3";function Qs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:sF(t.selfUrl),n={},s;for(let x of r)if(G1(x)){n=nF(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)??eF,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??tF,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??rF,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)??Ga,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=Ja(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Ja(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Ja(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=Ja(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=o(e.LMCTL_MAILBOX_KEY),b=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...w!==void 0?{mailboxKey:w}:{},...b!==void 0?{tokenPath:b}:{}},f}function nF(t){try{let e=Xa(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 sF(t){let e=of(K1(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 Ja(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function oF(t){let e=iF(t.intervalMs)??HT,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 iF(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function qT(t){let e=t.tokenPath??WT(BT(),".lmctl","cli-tokens.json"),r=MT(t.tokenPath);if(uT(r.cognito?.idToken)&&Yd()!==null)try{await TT({region:t.region,clientId:t.cognitoClientId??Ga,cliTokensPath:e}),r=MT(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch($){let Z=$ instanceof Error?$.message:String($);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Z}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await DT({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=jT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new OT({region:t.region,credentials:a}),c={ListObjectsV2Command:Z1,GetObjectCommand:z1,PutObjectCommand:Q1},u=Ys(n),d=u??o,f=t.deviceId,m=On({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let $=p.loadMailboxCursor(d,m);if($!==null)h=$.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let Z=!1,J=0;for(;!Z&&J<2;){J+=1;try{let I=ya(m,"web"),N=0,O;do{let q=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let B of q.Contents??[]){let F=wa(B.Key??"",m,"web");F!==void 0&&F>N&&(N=F)}O=q.IsTruncated===!0?q.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),Z=!0}catch(I){let N=I instanceof Error?I.message:String(I);if(i&&J===1&&cF(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),lF(e),i=!1,o=await DT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=jT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new OT({region:t.region,credentials:a}),m=On({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,S=t.persistentSessionManager,w=t.promptTriggerStore,b=new Da,x=new Jr({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:$=>b.record($),onMessage:async $=>{if(_!==void 0&&Bd($.payload)){_.onInbound($.payload);return}if(S!==void 0&&Hd($.payload)){await S.onInbound($.payload);return}if(!Jd($.payload)){if(w!==void 0&&Xd($.payload)){sf({store:w,payload:$.payload,log:t.log});return}g!==null&&await g.handleIncoming($.payload,$)}},...p!==void 0?{onCursorAdvance:$=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:$,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Vs({client:x,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async $=>x.putMessage({conversation_id:`terminal:${$.session_id}`,payload:$})),S!==void 0&&S.setPublish(async $=>x.putMessage({conversation_id:`provider:${$.session_id}`,payload:$}));let k=$=>x.putMessage({conversation_id:qd,payload:$});x.start();let j=t.chatLogTailStore===void 0?void 0:oF({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??HT,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let V=t.deviceId??o,W=`${d}/usage/`,M;return M=t.usageStore===void 0?void 0:tT({meter:b,store:t.usageStore,userId:d,deviceId:V,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:$,costUsd:Z,ceilingUsd:J})=>{t.log?.(`[usage] month ${$} cost $${Z.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),x.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async($,Z)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${W}${V}-${$}.json`,Body:JSON.stringify({...Z,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async $=>{let Z={put:0,get:0,list:0},J;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:W,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let N of I.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${$}.json`))try{let q=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(q.Body===void 0)continue;let B=JSON.parse(await q.Body.transformToString("utf-8"));Z.put+=B.put??0,Z.get+=B.get??0,Z.list+=B.list??0}catch{}}J=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(J!==void 0);return Z},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:x,fetchClient:g,publishDaemonEvent:k,async stop(){j?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await x.stop().catch(()=>{})}}}async function JT(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Ma(t.rootDir),r=On({identityId:Zs,userId:Zs,deviceId:CT}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Jr({bucket:"local",identityId:Zs,userId:Zs,deviceId:CT,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Bd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Hd(c.payload)){await o.onInbound(c.payload);return}if(!Jd(c.payload)){if(i!==void 0&&Xd(c.payload)){sf({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??qa,readIntervalMs:t.readIntervalMs??qa,heartbeatIdleMs:t.heartbeatIdleMs??qa,backoffReadIntervalMs:t.backoffReadIntervalMs??qa});n=new Vs({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:qd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Zs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function MT(t){let e=t??WT(BT(),".lmctl","cli-tokens.json");try{let r=Xa(e,"utf8");return JSON.parse(r)}catch{return{}}}function aF(t,e){if(e===void 0||e==="")return;let r={};try{let s=Xa(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};FT(of(t),{recursive:!0,mode:448}),UT(t,JSON.stringify(n,null,2));try{PT(t,384)}catch{}}function lF(t){let e={};try{let n=Xa(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,FT(of(t),{recursive:!0,mode:448}),UT(t,JSON.stringify(r,null,2));try{PT(t,384)}catch{}}async function DT(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new V1({region:t.region}).send(new Y1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{aF(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 cF(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 HT,qa,Ga,eF,tF,rF,Zs,CT,af=E(()=>{"use strict";Sa();Dd();Ud();rT();sT();oT();iT();aT();Gd();Ea();Kd();Zd();LT();HT=3e3,qa=1e3,Ga="79u5jhkk46qofog661c9i0bdcs",eF="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",tF="us-east-1_4iUdFggDn",rF="lmctl-next-preview-mailbox-254332045686";Zs="local",CT="local"});import{spawn as df}from"node:child_process";import{createInterface as XT}from"node:readline";var lf,cf,uf,GT,KT=E(()=>{"use strict";Do();ve();lf=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=df(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=XT({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+`
2018
+ allowed keys: ${vT.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${n.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:i}}function rf(t,e){let r=[];for(let o of t.parseErrors)r.push({field:"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===ef.toLowerCase());n.length>1&&r.push({field:ef,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?Fn(e,o.teamfile):Fn(o.teamfile);if(!kT(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Fe(a),c=$t(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 R1.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 $t(t){return t.members.find(e=>e.alias.toLowerCase()===ef.toLowerCase())}function nf(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=Fn(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),!kT(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Fe(o),l=$t(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return nf(l,Qd(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||Qd(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 ef,R1,vT,er=E(()=>{"use strict";ST();ef="Lead",R1=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);vT=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{hostname as C1}from"node:os";function Sr(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},o=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),i=o===null||o.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...i?{stale_before:n}:{},force:e.force});if(a.acquired){let c=o===null?null:e.force===!0?"force":o.holder_pid===null&&o.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:o,reclaimReason:c}}if(!xT(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function Un(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&M1(n))return!0;let s=t.getAgentInflight(e,r);if(s===null)return!1;let o=new Date(Date.now()-D1()).toISOString();return!xT(s,o)}function M1(t){if(t.holder_host===C1())return ir(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=P1():!1}function xT(t,e){return t.holder_pid===null?t.started_at<e:!ir(t.holder_pid)}function D1(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return IT;let r=Number(e);return!Number.isFinite(r)||r<=0?IT:r}function P1(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return NT;let r=Number(e);return!Number.isFinite(r)||r<=0?NT:r}var IT,NT,Wn=E(()=>{"use strict";ko();IT=8*60*60*1e3,NT=12e4});import{existsSync as F1,realpathSync as U1}from"node:fs";import{dirname as W1}from"node:path";function sf(t){B1(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function B1(t){let e=t.payload.root_teamfile;try{e=U1(t.payload.root_teamfile)}catch(s){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Bn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=H1(e);if("error"in r)return await Bn(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=Sr(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:X1(t.env??process.env)});if(!n.acquired){let s=J1(r.alias,n.current);return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let o=await(t.chat??Jt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),i=o.status==="stalled",a=!i&&o.text.trim()==="",l=i?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=i||a?"error":"ok";return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:c==="error"?null:o.text,status:c,error_detail:l,log:t.log}),{status:c,response:c==="error"?null:o.text,error_detail:l}}catch(s){let o=s instanceof Error?s.message:String(s);return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function H1(t){if(!F1(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Fe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=$t(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??W1(t)}}async function Bn(t,e){let r=$T(e.message),n=e.response===null?null:$T(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function $T(t){return t.length<=AT?{text:t,truncated:!1}:{text:t.slice(0,AT),truncated:!0}}function q1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function J1(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:q1(t,e)}function X1(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return RT;let r=Number(e);return!Number.isFinite(r)||r<=0?RT:r}var AT,RT,LT=E(()=>{"use strict";kt();er();Wn();AT=256*1024,RT=30*60*1e3});import{chmodSync as PT,existsSync as G1,mkdirSync as FT,readFileSync as Ga,writeFileSync as UT}from"node:fs";import{dirname as of,resolve as qa,join as WT}from"node:path";import{fileURLToPath as K1}from"node:url";import{homedir as BT}from"node:os";import{CognitoIdentityClient as V1,GetIdCommand as Y1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as jT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as z1,ListObjectsV2Command as Z1,PutObjectCommand as Q1,S3Client as OT}from"@aws-sdk/client-s3";function Qs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:sF(t.selfUrl),n={},s;for(let x of r)if(G1(x)){n=nF(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)??eF,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??tF,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??rF,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)??Ka,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=Xa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Xa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Xa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=Xa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=o(e.LMCTL_MAILBOX_KEY),b=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...w!==void 0?{mailboxKey:w}:{},...b!==void 0?{tokenPath:b}:{}},f}function nF(t){try{let e=Ga(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 sF(t){let e=of(K1(t??import.meta.url));return[qa(e,"..","..","..","..","infra","terraform","terraform.tfstate"),qa(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),qa(e,"..","..","..","infra","terraform","terraform.tfstate"),qa(e,"..","..","infra","terraform","terraform.tfstate")]}function Xa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function oF(t){let e=iF(t.intervalMs)??HT,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 iF(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function qT(t){let e=t.tokenPath??WT(BT(),".lmctl","cli-tokens.json"),r=MT(t.tokenPath);if(uT(r.cognito?.idToken)&&Yd()!==null)try{await TT({region:t.region,clientId:t.cognitoClientId??Ka,cliTokensPath:e}),r=MT(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch($){let Z=$ instanceof Error?$.message:String($);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Z}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await DT({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=jT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new OT({region:t.region,credentials:a}),c={ListObjectsV2Command:Z1,GetObjectCommand:z1,PutObjectCommand:Q1},u=Ys(n),d=u??o,f=t.deviceId,m=On({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let $=p.loadMailboxCursor(d,m);if($!==null)h=$.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let Z=!1,J=0;for(;!Z&&J<2;){J+=1;try{let I=wa(m,"web"),N=0,O;do{let q=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let B of q.Contents??[]){let F=Ea(B.Key??"",m,"web");F!==void 0&&F>N&&(N=F)}O=q.IsTruncated===!0?q.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),Z=!0}catch(I){let N=I instanceof Error?I.message:String(I);if(i&&J===1&&cF(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),lF(e),i=!1,o=await DT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=jT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new OT({region:t.region,credentials:a}),m=On({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,S=t.persistentSessionManager,w=t.promptTriggerStore,b=new Pa,x=new Jr({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:$=>b.record($),onMessage:async $=>{if(_!==void 0&&Bd($.payload)){_.onInbound($.payload);return}if(S!==void 0&&Hd($.payload)){await S.onInbound($.payload);return}if(!Jd($.payload)){if(w!==void 0&&Xd($.payload)){sf({store:w,payload:$.payload,log:t.log});return}g!==null&&await g.handleIncoming($.payload,$)}},...p!==void 0?{onCursorAdvance:$=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:$,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Vs({client:x,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async $=>x.putMessage({conversation_id:`terminal:${$.session_id}`,payload:$})),S!==void 0&&S.setPublish(async $=>x.putMessage({conversation_id:`provider:${$.session_id}`,payload:$}));let k=$=>x.putMessage({conversation_id:qd,payload:$});x.start();let j=t.chatLogTailStore===void 0?void 0:oF({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??HT,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let V=t.deviceId??o,W=`${d}/usage/`,M;return M=t.usageStore===void 0?void 0:tT({meter:b,store:t.usageStore,userId:d,deviceId:V,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:$,costUsd:Z,ceilingUsd:J})=>{t.log?.(`[usage] month ${$} cost $${Z.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),x.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async($,Z)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${W}${V}-${$}.json`,Body:JSON.stringify({...Z,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async $=>{let Z={put:0,get:0,list:0},J;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:W,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let N of I.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${$}.json`))try{let q=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(q.Body===void 0)continue;let B=JSON.parse(await q.Body.transformToString("utf-8"));Z.put+=B.put??0,Z.get+=B.get??0,Z.list+=B.list??0}catch{}}J=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(J!==void 0);return Z},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:x,fetchClient:g,publishDaemonEvent:k,async stop(){j?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await x.stop().catch(()=>{})}}}async function JT(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Da(t.rootDir),r=On({identityId:Zs,userId:Zs,deviceId:CT}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Jr({bucket:"local",identityId:Zs,userId:Zs,deviceId:CT,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Bd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Hd(c.payload)){await o.onInbound(c.payload);return}if(!Jd(c.payload)){if(i!==void 0&&Xd(c.payload)){sf({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Ja,readIntervalMs:t.readIntervalMs??Ja,heartbeatIdleMs:t.heartbeatIdleMs??Ja,backoffReadIntervalMs:t.backoffReadIntervalMs??Ja});n=new Vs({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:qd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Zs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function MT(t){let e=t??WT(BT(),".lmctl","cli-tokens.json");try{let r=Ga(e,"utf8");return JSON.parse(r)}catch{return{}}}function aF(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ga(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};FT(of(t),{recursive:!0,mode:448}),UT(t,JSON.stringify(n,null,2));try{PT(t,384)}catch{}}function lF(t){let e={};try{let n=Ga(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,FT(of(t),{recursive:!0,mode:448}),UT(t,JSON.stringify(r,null,2));try{PT(t,384)}catch{}}async function DT(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new V1({region:t.region}).send(new Y1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{aF(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 cF(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 HT,Ja,Ka,eF,tF,rF,Zs,CT,af=E(()=>{"use strict";va();Dd();Ud();rT();sT();oT();iT();aT();Gd();Ta();Kd();Zd();LT();HT=3e3,Ja=1e3,Ka="79u5jhkk46qofog661c9i0bdcs",eF="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",tF="us-east-1_4iUdFggDn",rF="lmctl-next-preview-mailbox-254332045686";Zs="local",CT="local"});import{spawn as df}from"node:child_process";import{createInterface as XT}from"node:readline";var lf,cf,uf,GT,KT=E(()=>{"use strict";Po();ve();lf=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=df(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=XT({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+`
2013
2019
  `)}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+`
2014
2020
  `)}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}}}},cf=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=df(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(`
2015
2021
  `);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+`
2016
- `)}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}})}},uf=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{Mo(n)}catch(a){z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=df(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=XT({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+`
2022
+ `)}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}})}},uf=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{Do(n)}catch(a){z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=df(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=XT({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+`
2017
2023
  `)}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+`
2018
2024
  `)}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+`
2019
- `)}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}})}}},GT=t=>{switch(t){case"codex":return new lf;case"claude":case"qwen":return new cf;case"gemini":case"copilot":case"opencode":return new uf;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as uF}from"node:crypto";import{existsSync as Z5,mkdirSync as dF,readFileSync as fF,writeFileSync as mF}from"node:fs";import{homedir as pF}from"node:os";import{dirname as hF,join as _F}from"node:path";function Ka(){return process.env.LMCTL_DEVICE_FILE??_F(pF(),".lmctl","device.json")}function Xr(t=Ka()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(fF(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 ff(t=Ka()){let e=Xr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:uF(),created_at:new Date().toISOString()};return dF(hF(t),{recursive:!0}),mF(t,`${JSON.stringify(r,null,2)}
2020
- `,{encoding:"utf8",mode:384}),r}var mf=E(()=>{"use strict"});import*as VT from"node:child_process";function yF(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function pf(t,e={}){let r=e.spawnSync===void 0&&process.env[wF]==="1",n=e.spawnSync??VT.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Va[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=yF(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function YT(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Va).join(", ")})`;let e=gF[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 Va,gF,wF,zT=E(()=>{"use strict";Va={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},gF={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",lmplayer:"Install lmplayer and ensure the lmplayer binary is on PATH.",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};wF="LMCTL_SKIP_BINARY_CHECK"});var ab={};ne(ab,{ProviderBinaryPreflightError:()=>Ya,__setProviderBinaryCheckForTest:()=>xF,bootstrapAgentRestMailbox:()=>eb,publishRegisteredWorkflowsOnStart:()=>QT,resolveLocalMailboxDir:()=>ob,resolveLocalWebuiDir:()=>sb,resolveServeConfig:()=>tb,runProviderBinaryPreflight:()=>nb,runServe:()=>vF,validateServeArgs:()=>ib});import{randomBytes as EF}from"node:crypto";import{existsSync as TF}from"node:fs";import{homedir as bF}from"node:os";import{isAbsolute as ZT,resolve as hf}from"node:path";async function vF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(SF),0;let r=ib(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
2025
+ `)}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}})}}},GT=t=>{switch(t){case"codex":return new lf;case"claude":case"qwen":return new cf;case"gemini":case"copilot":case"opencode":return new uf;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as uF}from"node:crypto";import{existsSync as Z5,mkdirSync as dF,readFileSync as fF,writeFileSync as mF}from"node:fs";import{homedir as pF}from"node:os";import{dirname as hF,join as _F}from"node:path";function Va(){return process.env.LMCTL_DEVICE_FILE??_F(pF(),".lmctl","device.json")}function Xr(t=Va()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(fF(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 ff(t=Va()){let e=Xr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:uF(),created_at:new Date().toISOString()};return dF(hF(t),{recursive:!0}),mF(t,`${JSON.stringify(r,null,2)}
2026
+ `,{encoding:"utf8",mode:384}),r}var mf=E(()=>{"use strict"});import*as VT from"node:child_process";function yF(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function pf(t,e={}){let r=e.spawnSync===void 0&&process.env[wF]==="1",n=e.spawnSync??VT.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ya[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=yF(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function YT(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ya).join(", ")})`;let e=gF[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 Ya,gF,wF,zT=E(()=>{"use strict";Ya={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},gF={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",lmplayer:"Install lmplayer and ensure the lmplayer binary is on PATH.",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};wF="LMCTL_SKIP_BINARY_CHECK"});var ab={};ne(ab,{ProviderBinaryPreflightError:()=>za,__setProviderBinaryCheckForTest:()=>xF,bootstrapAgentRestMailbox:()=>eb,publishRegisteredWorkflowsOnStart:()=>QT,resolveLocalMailboxDir:()=>ob,resolveLocalWebuiDir:()=>sb,resolveServeConfig:()=>tb,runProviderBinaryPreflight:()=>nb,runServe:()=>vF,validateServeArgs:()=>ib});import{randomBytes as EF}from"node:crypto";import{existsSync as TF}from"node:fs";import{homedir as bF}from"node:os";import{isAbsolute as ZT,resolve as hf}from"node:path";async function vF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(SF),0;let r=ib(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
2021
2027
  `),2;try{nb(e)}catch(w){return 1}let n=ge({path:le()}),s={portCli:AF(t)},o;try{o=tb({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(w){return n.close(),e.stderr.write(`error: ${w instanceof Error?w.message:String(w)}
2022
- `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),JE(n);let i;if(r.localWebui!==void 0){let w=sb(r.localWebui.dir,process.env);if(w===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let b=ob(process.env),{s3:x,commands:k}=Ma(b);i={webuiDir:w,rootDir:b,s3:x,commands:k},e.stdout.write(`local webui: serving SPA from ${w}; mailbox store ${b}
2028
+ `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),JE(n);let i;if(r.localWebui!==void 0){let w=sb(r.localWebui.dir,process.env);if(w===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let b=ob(process.env),{s3:x,commands:k}=Da(b);i={webuiDir:w,rootDir:b,s3:x,commands:k},e.stdout.write(`local webui: serving SPA from ${w}; mailbox store ${b}
2023
2029
  `)}let a=r.noDaemon?void 0:HE({dal:n,intervalMs:Ks()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Qs({env:process.env});l.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${l.missing.join(", ")}; running without cloud sync`+(l.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${l.tfstateCandidatesChecked.length} candidate path${l.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${l.tfstatePathUsed} did not supply the missing fields)`)+`
2024
2030
  `);let c=await NF({log:w=>e.stderr.write(`${w}
2025
- `)}),u=new xa({adapterFactory:GT,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:w=>e.stderr.write(`${w}
2031
+ `)}),u=new Aa({adapterFactory:GT,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:w=>e.stderr.write(`${w}
2026
2032
  `)}),d=Xr()?.device_id,f=OE({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:kF(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 eb({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 QT({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),S=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
2027
2033
  `),await new Promise(w=>{let b=()=>{(async()=>(a!==void 0&&await a.stop(),S.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),w()))()};process.once("SIGTERM",b),process.once("SIGINT",b)}),0}function kF(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 QT(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)}
2028
2034
  `)}}async function eb(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await JT({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
@@ -2031,10 +2037,10 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2031
2037
  `)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
2032
2038
  `)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
2033
2039
  `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function tb(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=EF(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: ${IF(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
2034
- `);return{port:a,apiUrl:d,apiToken:c}}function IF(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 NF(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 Na({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 xF(t){rb=t??pf}function nb(t){let e=Object.keys(Va),r=rb(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${YT(o)}
2040
+ `);return{port:a,apiUrl:d,apiToken:c}}function IF(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 NF(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 xa({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 xF(t){rb=t??pf}function nb(t){let e=Object.keys(Ya),r=rb(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${YT(o)}
2035
2041
  `);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
2036
- `),new Ya(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
2037
- `)}function sb(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=ZT(r)?r:hf(process.cwd(),r);return TF(`${n}/index.html`)?n:null}function ob(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?ZT(e)?e:hf(process.cwd(),e):hf(bF(),".lmctl","local-mailbox")}function AF(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 ib(t,e=process.env){let r=RF(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 RF(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 SF,Ya,rb,lb=E(()=>{"use strict";We();DE();jd();XE();Pu();af();Dd();Sd();vd();KT();mf();zT();Ke();SF=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2042
+ `),new za(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
2043
+ `)}function sb(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=ZT(r)?r:hf(process.cwd(),r);return TF(`${n}/index.html`)?n:null}function ob(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?ZT(e)?e:hf(process.cwd(),e):hf(bF(),".lmctl","local-mailbox")}function AF(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 ib(t,e=process.env){let r=RF(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 RF(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 SF,za,rb,lb=E(()=>{"use strict";We();DE();jd();XE();Pu();af();Dd();Sd();vd();KT();mf();zT();Ke();SF=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2038
2044
 
2039
2045
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
2040
2046
  services. Help exits before any port binding or daemon startup.
@@ -2044,40 +2050,40 @@ services. Help exits before any port binding or daemon startup.
2044
2050
  against the local filesystem (no S3, no Cognito) with a fixed
2045
2051
  local identity. Mailbox store defaults to
2046
2052
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
2047
- `;Ya=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}},rb=pf});var cb={};ne(cb,{runIntake:()=>LF});async function LF(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write($F),0):r==="scan"?jF(n,e):r==="config"?OF(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
2048
- `),1)}async function jF(t,e){let r=D(t,["--project"],["--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=A(r,"--project");return R(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return y(e,`project not found: ${n}`);let i=await Mu({dal:s,project:o});return U(e,{project_id:o.id,project_name:o.name,...i}),0}return U(e,await xn(s)),0})}async function OF(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return y(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=D(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return y(e,s.error);let o=A(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return y(e,"missing or invalid --scan-github-issues true|false");let i=A(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return y(e,"invalid --state: expected open, closed, or all");let a=A(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return R(e,c=>{let u=c.findProjectByName(r);if(u===null)return y(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return U(e,d),0})}var $F,ub=E(()=>{"use strict";Yi();pe();$F=`usage: lmctl intake scan [--project NAME] [--json]
2053
+ `;za=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}},rb=pf});var cb={};ne(cb,{runIntake:()=>LF});async function LF(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write($F),0):r==="scan"?jF(n,e):r==="config"?OF(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
2054
+ `),1)}async function jF(t,e){let r=D(t,["--project"],["--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=A(r,"--project");return R(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return y(e,`project not found: ${n}`);let i=await Mu({dal:s,project:o});return U(e,{project_id:o.id,project_name:o.name,...i}),0}return U(e,await xn(s)),0})}async function OF(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return y(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=D(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return y(e,s.error);let o=A(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return y(e,"missing or invalid --scan-github-issues true|false");let i=A(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return y(e,"invalid --state: expected open, closed, or all");let a=A(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return R(e,c=>{let u=c.findProjectByName(r);if(u===null)return y(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return U(e,d),0})}var $F,ub=E(()=>{"use strict";zi();pe();$F=`usage: lmctl intake scan [--project NAME] [--json]
2049
2055
  lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all] [--json]
2050
2056
 
2051
2057
  Scan configured project GitHub issues into lmctl, or update per-project
2052
2058
  intake settings such as enabled state, labels, and issue state filters.
2053
2059
  scan writes JSON output; --project limits the scan to one project.
2054
- `});import{createHash as CF}from"node:crypto";import{existsSync as eo,mkdirSync as MF,readFileSync as mb,realpathSync as DF,writeFileSync as PF}from"node:fs";import{basename as db,dirname as pb,resolve as hb}from"node:path";function we(t,e){let r=hb(t);if(eo(r))return DF(r);if(e!==void 0){let n=WF(t,r,e);if(n!==null)return n}return r}function fb(t,e){let r=pb(e),n=tf(t,Wa(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=hb(r,s.sessiondir));return n}function ot(t,e){let r=we(t,UF(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!eo(r)&&"upsertRootTeam"in e&&(MF(pb(r),{recursive:!0}),PF(r,n.raw_text,"utf8")),fb(n.raw_text,r);if(eo(r)){let s=mb(r,"utf8"),o=fb(s,r);return"upsertRootTeam"in e&&BF(o)&&HF(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!eo(r))throw new Error(`teamfile not found: ${t}`);return Fe(r)}function _b(t,e,r){let n=we(t,e),s=e.getRootTeam(n);s===null||!eo(n)||mb(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 UF(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function WF(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=db(t),o=Wa(t),i=r.listRootTeams().filter(l=>db(l.teamfile_path)===s||l.name===o);if(i.length===0)return null;if(i.length===1)return i[0].teamfile_path;let a=i.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function BF(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=FF)}function HF(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:CF("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var FF,wt=E(()=>{"use strict";er();FF=5});import{existsSync as qF}from"node:fs";import{dirname as gb}from"node:path";function GF(t){return JF.test(t)||XF.test(t)}function yb(t){return za.test(t)}function Gr(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!za.test(n)?null:{teamfile:r,alias:n}}function Xe(t,e,r){if(!t.endsWith(".lmctl"))throw new be(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!yb(e))throw new be(`lmctl: "${e}" is not a valid alias (must match ${za.source}).`);let n=we(t,r);if(r===void 0&&!qF(n))throw new be(`lmctl: teamfile not found: ${t}`);let s;try{s=ot(n,r)}catch(i){throw new be(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new be(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=Ba(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new be(`lmctl: alias "${e}" not found in ${t}.
2060
+ `});import{createHash as CF}from"node:crypto";import{existsSync as eo,mkdirSync as MF,readFileSync as mb,realpathSync as DF,writeFileSync as PF}from"node:fs";import{basename as db,dirname as pb,resolve as hb}from"node:path";function we(t,e){let r=hb(t);if(eo(r))return DF(r);if(e!==void 0){let n=WF(t,r,e);if(n!==null)return n}return r}function fb(t,e){let r=pb(e),n=tf(t,Ba(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=hb(r,s.sessiondir));return n}function ot(t,e){let r=we(t,UF(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!eo(r)&&"upsertRootTeam"in e&&(MF(pb(r),{recursive:!0}),PF(r,n.raw_text,"utf8")),fb(n.raw_text,r);if(eo(r)){let s=mb(r,"utf8"),o=fb(s,r);return"upsertRootTeam"in e&&BF(o)&&HF(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!eo(r))throw new Error(`teamfile not found: ${t}`);return Fe(r)}function _b(t,e,r){let n=we(t,e),s=e.getRootTeam(n);s===null||!eo(n)||mb(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 UF(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function WF(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=db(t),o=Ba(t),i=r.listRootTeams().filter(l=>db(l.teamfile_path)===s||l.name===o);if(i.length===0)return null;if(i.length===1)return i[0].teamfile_path;let a=i.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function BF(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=FF)}function HF(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:CF("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var FF,wt=E(()=>{"use strict";er();FF=5});import{existsSync as qF}from"node:fs";import{dirname as gb}from"node:path";function GF(t){return JF.test(t)||XF.test(t)}function yb(t){return Za.test(t)}function Gr(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Za.test(n)?null:{teamfile:r,alias:n}}function Xe(t,e,r){if(!t.endsWith(".lmctl"))throw new be(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!yb(e))throw new be(`lmctl: "${e}" is not a valid alias (must match ${Za.source}).`);let n=we(t,r);if(r===void 0&&!qF(n))throw new be(`lmctl: teamfile not found: ${t}`);let s;try{s=ot(n,r)}catch(i){throw new be(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new be(`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 be(`lmctl: alias "${e}" not found in ${t}.
2055
2061
  Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=nf(o,gb(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 be(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
2056
- Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??gb(n),isLead:$t(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function vr(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=Gr(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?yb(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${za.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
2062
+ Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??gb(n),isLead:$t(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function vr(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=Gr(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?yb(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Za.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
2057
2063
  Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(GF(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.
2058
2064
  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}".
2059
2065
  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.
2060
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var be,JF,XF,za,Lt=E(()=>{"use strict";er();wt();be=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},JF=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,XF=/^ses_[A-Za-z0-9_-]+$/,za=/^[A-Za-z][A-Za-z0-9_-]*$/});function Tb(t){let e=wb(t.registry,t.fromTeamfile);if(e===void 0)return Hn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Eb(e,t.fromAlias))return Hn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=wb(t.registry,t.toTeamfile);return r===void 0?Hn(`target team is not registered in policy graph: ${t.toTeamfile}`):Eb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Hn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Hn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Hn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function wb(t,e){return t.teams.find(r=>r.teamfile===e)}function Eb(t,e){return t.aliases.some(r=>r===e)}function Hn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var bb=E(()=>{"use strict"});import{basename as KF}from"node:path";function kb(t,e){let r=new Date(e.now.getTime()-kr()).toISOString(),n=xb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=zF(e.sender,n),o=ZF(e.sender,n);o!==null&&o.teamfile===e.root&&!vb(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>vb(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<VF;return{stop:l.length>=1&&u,chain:QF(a)}}function Ib(t,e){let r=new Date(e.now.getTime()-kr()).toISOString(),n=xb(t,r),s=Ab(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 kr(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Sb;let r=Number(e);return!Number.isFinite(r)||r<=0?Sb:r}function Nb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function YF(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function xb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(YF).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function zF(t,e,r={}){let n=new Map;for(let a of e)n.set(Kr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Kr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Kr(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=Kr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function Ab(t,e){let r=Kr(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=Kr(l.sender),u=Kr(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 ZF(t,e){let r=Ab(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function vb(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Kr(t){return`${t.teamfile}\0${t.alias}`}function QF(t){return t.map(e=>`${KF(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var VF,Sb,Za=E(()=>{"use strict";VF=6e4,Sb=8*60*60*1e3});import{randomUUID as eU}from"node:crypto";import{hostname as Rb,networkInterfaces as tU}from"node:os";function $b(t){let e=(t.now??new Date).toISOString();return{lock_id:eU(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??Rb(),holder_ips:t.ips??iU(),started_at:e,last_heartbeat:e}}function Lb(t=process.env){return jb(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,rU)}function sU(t=process.env){return jb(t.LMCTL_TERMINAL_LOCK_STALE_MS,nU)}function _f(t,e={}){let r=e.now??new Date,n=e.localHost??Rb(),s=e.staleMs??sU();if(t.holder_host===n)return(e.isProcessAlive??oU)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(t.last_heartbeat);return Number.isFinite(o)?r.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function gf(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function jb(t,e){if(t===void 0||t.trim()==="")return e;let r=t.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?e:n}function oU(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function iU(){let t=new Set;for(let e of Object.values(tU()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var rU,nU,yf=E(()=>{"use strict";rU=15e3,nU=12e4});function tr(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2066
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var be,JF,XF,Za,Lt=E(()=>{"use strict";er();wt();be=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},JF=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,XF=/^ses_[A-Za-z0-9_-]+$/,Za=/^[A-Za-z][A-Za-z0-9_-]*$/});function Tb(t){let e=wb(t.registry,t.fromTeamfile);if(e===void 0)return Hn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Eb(e,t.fromAlias))return Hn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=wb(t.registry,t.toTeamfile);return r===void 0?Hn(`target team is not registered in policy graph: ${t.toTeamfile}`):Eb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Hn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Hn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Hn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function wb(t,e){return t.teams.find(r=>r.teamfile===e)}function Eb(t,e){return t.aliases.some(r=>r===e)}function Hn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var bb=E(()=>{"use strict"});import{basename as KF}from"node:path";function kb(t,e){let r=new Date(e.now.getTime()-kr()).toISOString(),n=xb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=zF(e.sender,n),o=ZF(e.sender,n);o!==null&&o.teamfile===e.root&&!vb(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>vb(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<VF;return{stop:l.length>=1&&u,chain:QF(a)}}function Ib(t,e){let r=new Date(e.now.getTime()-kr()).toISOString(),n=xb(t,r),s=Ab(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 kr(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Sb;let r=Number(e);return!Number.isFinite(r)||r<=0?Sb:r}function Nb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function YF(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function xb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(YF).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function zF(t,e,r={}){let n=new Map;for(let a of e)n.set(Kr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Kr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Kr(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=Kr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function Ab(t,e){let r=Kr(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=Kr(l.sender),u=Kr(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 ZF(t,e){let r=Ab(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function vb(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Kr(t){return`${t.teamfile}\0${t.alias}`}function QF(t){return t.map(e=>`${KF(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var VF,Sb,Qa=E(()=>{"use strict";VF=6e4,Sb=8*60*60*1e3});import{randomUUID as eU}from"node:crypto";import{hostname as Rb,networkInterfaces as tU}from"node:os";function $b(t){let e=(t.now??new Date).toISOString();return{lock_id:eU(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??Rb(),holder_ips:t.ips??iU(),started_at:e,last_heartbeat:e}}function Lb(t=process.env){return jb(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,rU)}function sU(t=process.env){return jb(t.LMCTL_TERMINAL_LOCK_STALE_MS,nU)}function _f(t,e={}){let r=e.now??new Date,n=e.localHost??Rb(),s=e.staleMs??sU();if(t.holder_host===n)return(e.isProcessAlive??oU)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(t.last_heartbeat);return Number.isFinite(o)?r.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function gf(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function jb(t,e){if(t===void 0||t.trim()==="")return e;let r=t.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?e:n}function oU(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function iU(){let t=new Set;for(let e of Object.values(tU()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var rU,nU,yf=E(()=>{"use strict";rU=15e3,nU=12e4});function tr(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2061
2067
  manually, outside a member session that lmctl started. Running lmctl this way is
2062
2068
  not officially supported.
2063
2069
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function jt(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2064
2070
  The session marker may be stale or the team may not be registered in this lmctl database.
2065
2071
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function wf(t){return`unknown option --from
2066
- ${tr(t)}`}function qn(t,e){let r=[];for(let n of t){if(n==="--from"||n.startsWith("--from="))return{args:t,error:wf(e)};if(n.startsWith("I_am="))return{args:t,error:`unknown argument: ${n}`};r.push(n)}return{args:r}}function Ot(t,e){let r=Ef(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Ef(t,e){let r=t[fs];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let o of e.listRootTeams()){let i=ot(o.teamfile_path,e);for(let a of i.members)a.teamfile===void 0&&a.session===r&&n.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Vr=E(()=>{"use strict";ct();wt()});function rr(t){let e=Gr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var to=E(()=>{"use strict";Lt()});import{hostname as aU}from"node:os";async function Qa(t){await uU(t.io,t.env);let e=await R(t.io,f=>f.listEnqueuedMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)),r=e.length===0?[]:await R(t.io,f=>f.claimMailForDelivery(e.map(m=>m.id),new Date().toISOString(),process.pid,aU())),n=lU(r,t.newMessage);if(n.length===0)throw new Error(`no queued mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let s=!1,o=fe(),i=0,a=0,l=0,c={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:n,permissionMode:t.permissionMode,env:t.env,onDelta:f=>{s=!0,o&&(i+=1,l=Buffer.byteLength(f,"utf8"),a+=l),t.onDelta?.(f)},onProgress:f=>t.onProgress?.(f)};t.receiver.model!==void 0&&(c.model=t.receiver.model),t.receiver.effort!==void 0&&(c.effort=t.receiver.effort),c.alias=t.receiver.alias,c.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(c.timeoutMs=t.idleTimeoutMs);let u;try{u=await Jt(c)}catch(f){throw await Cb(t.io,r.map(m=>m.id)),f}if(o&&Ce(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:s,blockCount:i,streamedBytes:a,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:l,tailPreview:u.text.slice(-200)})),u.status==="stalled")return await Cb(t.io,r.map(f=>f.id)),{status:"stalled",receipt:u.text,prompt:n,queued:r,deliveredIds:[],wroteDelta:s,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let d=r.map(f=>f.id);return await cU(t.io,d,u.text),{status:"ok",receipt:u.text,prompt:n,queued:r,deliveredIds:d,wroteDelta:s,durationMs:u.durationMs}}function lU(t,e){if(t.length===0)return e??"";let r=t.map((n,s)=>[`--- queued message ${s+1} (mail #${n.id}, sent ${n.created_at}) ---`,n.payload].join(`
2072
+ ${tr(t)}`}function qn(t,e){let r=[];for(let n of t){if(n==="--from"||n.startsWith("--from="))return{args:t,error:wf(e)};if(n.startsWith("I_am="))return{args:t,error:`unknown argument: ${n}`};r.push(n)}return{args:r}}function Ot(t,e){let r=Ef(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Ef(t,e){let r=t[fs];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let o of e.listRootTeams()){let i=ot(o.teamfile_path,e);for(let a of i.members)a.teamfile===void 0&&a.session===r&&n.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Vr=E(()=>{"use strict";ct();wt()});function rr(t){let e=Gr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var to=E(()=>{"use strict";Lt()});import{hostname as aU}from"node:os";async function el(t){await uU(t.io,t.env);let e=await R(t.io,f=>f.listEnqueuedMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)),r=e.length===0?[]:await R(t.io,f=>f.claimMailForDelivery(e.map(m=>m.id),new Date().toISOString(),process.pid,aU())),n=lU(r,t.newMessage);if(n.length===0)throw new Error(`no queued mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let s=!1,o=fe(),i=0,a=0,l=0,c={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:n,permissionMode:t.permissionMode,env:t.env,onDelta:f=>{s=!0,o&&(i+=1,l=Buffer.byteLength(f,"utf8"),a+=l),t.onDelta?.(f)},onProgress:f=>t.onProgress?.(f)};t.receiver.model!==void 0&&(c.model=t.receiver.model),t.receiver.effort!==void 0&&(c.effort=t.receiver.effort),c.alias=t.receiver.alias,c.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(c.timeoutMs=t.idleTimeoutMs);let u;try{u=await Jt(c)}catch(f){throw await Cb(t.io,r.map(m=>m.id)),f}if(o&&Ce(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:s,blockCount:i,streamedBytes:a,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:l,tailPreview:u.text.slice(-200)})),u.status==="stalled")return await Cb(t.io,r.map(f=>f.id)),{status:"stalled",receipt:u.text,prompt:n,queued:r,deliveredIds:[],wroteDelta:s,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let d=r.map(f=>f.id);return await cU(t.io,d,u.text),{status:"ok",receipt:u.text,prompt:n,queued:r,deliveredIds:d,wroteDelta:s,durationMs:u.durationMs}}function lU(t,e){if(t.length===0)return e??"";let r=t.map((n,s)=>[`--- queued message ${s+1} (mail #${n.id}, sent ${n.created_at}) ---`,n.payload].join(`
2067
2073
  `));return e!==void 0&&r.push(["--- new message ---",e].join(`
2068
2074
  `)),r.join(`
2069
2075
 
2070
2076
  `)}async function cU(t,e,r){if(e.length!==0)try{await R(t,n=>{n.markMailDelivered(e,r,new Date().toISOString())})}catch(n){t.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${n instanceof Error?n.message:String(n)}
2071
2077
  `)}}async function Cb(t,e){if(e.length!==0)try{await R(t,r=>{r.clearMailDelivery(e)})}catch(r){t.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${r instanceof Error?r.message:String(r)}
2072
- `)}}async function uU(t,e){try{await R(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-dU(e)).toISOString())})}catch{}}function dU(t){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return Ob;let r=Number(e);return!Number.isFinite(r)||r<=0?Ob:r}var Ob,Tf=E(()=>{"use strict";kt();ve();pe();Ob=8*60*60*1e3});async function nl(t){let e=t.onEvent??(()=>{}),r=mU(t.io,e),n=null,s=null,o=null,i,a=null,l=t.prompt;try{let c=await R(r,b=>Xe(t.teamfile,t.alias,b)),u=c.teamfile,d=await R(r,b=>EU(b,t.env??process.env)),f=d.sender,m=await TU(r,{explicitRoot:t.rootFlag,sender:f,receiverTeamfile:u,operatorOrigin:d.origin==="operator"});o=await _U(r,{receiverTeamfile:u,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:t.prompt,origin:d.origin}),i=yU(r,o);let p=f===null?null:await bU(r,{rootTeamfile:m,sender:f,receiverTeamfile:u,receiverAlias:c.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2073
- `});try{En(r,Fe(u),u)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:u,receiver_alias:c.alias,origin:d.origin,policy:p};let h=await Fb(r,u,c.alias);if(h!==null){let b=gf(h);if(f!==null){let k=await bf(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=el(`enqueued mailbox message ${k.id}`,null),Sf(k.id,f,u,c.alias)}let x=await Jn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:b});return a=vf(b,x),{status:"busy",message:b,teamChatLogId:x}}if(await pU(r,u,c.alias)){if(f!==null){let k=await bf(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=el(`enqueued mailbox message ${k.id}`,null),Sf(k.id,f,u,c.alias)}let b=await hU(r,u,c.alias),x=await Jn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:b});return a=vf(b,x),{status:"busy",message:b,teamChatLogId:x}}if(f!==null&&f.teamfile!==u){let b=await R(r,x=>kb(x,{root:m,sender:f,receiverTeamfile:u,receiverAlias:c.alias,now:new Date}));if(b.stop){let x=Nb(b.chain),k=await Jn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:x});return a=tl(x,k),{status:"error",errorKind:"cycle",message:x,teamChatLogId:k}}}let g=await kU(r,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:f?.teamfile??u,sender_alias:f?.alias??"operator"});if(!g.acquired){let b=Ub(u,c.alias,g.current);if(f!==null){let k=await bf(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=el(`enqueued mailbox message ${k.id}`,null),Sf(k.id,f,u,c.alias)}let x=await Jn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:b});return a=vf(b,x),{status:"busy",message:b,teamChatLogId:x}}s=g.lease;let _=await Qa({sender:f??{teamfile:u,alias:"operator"},receiver:{teamfile:u,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:t.prompt,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:b=>e({kind:"delta",chunk:b}),onProgress:b=>e({kind:"progress",alias:c.alias,event:b})});l=_.prompt;let S=_.status==="stalled",w=await Jn(r,{...n,message:l,response:S?null:_.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":S?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:S?`provider stalled${_.stalledAfterMs!==void 0?` after ${_.stalledAfterMs}ms`:""}`:null});return a=S?tl(`provider stalled${_.stalledAfterMs!==void 0?` after ${_.stalledAfterMs}ms`:""}`,w,_.receipt):el(_.receipt,w),{status:S?"stalled":"ok",replyText:_.receipt,wroteDelta:_.wroteDelta,teamChatLogId:w,durationMs:_.durationMs}}catch(c){let u=c instanceof Error?c.message:String(c),d=n===null?null:await Jn(r,{...n,message:l,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${u}`:u});return a=tl(u,d),{status:"error",errorKind:c instanceof be?"target":"provider",message:u,teamChatLogId:d}}finally{i!==void 0&&clearInterval(i),s!==null&&await IU(r,s),o!==null&&await gU(r,o,a??tl("chat turn exited without a terminal outcome",null))}}function mU(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function pU(t,e,r){return await R(t,n=>Un(n,e,r))}async function hU(t,e,r){let n=await Fb(t,e,r);if(n!==null)return gf(n);let s=await R(t,o=>o.getAgentInflight(e,r));return s!==null?Ub(e,r,s):`${r} is busy; wait and retry`}async function bf(t,e){return await R(t,r=>r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,payload:e.payload}))}function Sf(t,e,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:t,message:`mailbox message ${t} enqueued to ${s}`,teamChatLogId:null,sender:`${e.teamfile}:${e.alias}`,receiver:s}}async function _U(t,e){try{return(await R(t,n=>n.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:wU(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return fe()&&Ce(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function gU(t,e,r){try{await R(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){fe()&&Ce(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function yU(t,e){if(e===null)return;let r=setInterval(()=>{R(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{fe()&&Ce(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},fU);return r.unref?.(),r}function el(t,e){return{status:"done",result_summary:rl(t),error:null,team_chat_log_id:e}}function vf(t,e){return{status:"busy",result_summary:rl(t),error:t,team_chat_log_id:e}}function tl(t,e,r){return{status:"error",result_summary:rl(r===void 0?t:r),error:t,team_chat_log_id:e}}function rl(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function wU(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function EU(t,e){let r=Ot(e,t);if(r.ok)return{sender:rr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(jt("chat"))}async function TU(t,e){if(e.explicitRoot!==void 0)return await R(t,n=>we(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await R(t,n=>Ib(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function bU(t,e){return await R(t,r=>Tb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:SU(r,e.sender.teamfile,e.receiverTeamfile)}))}function SU(t,e,r){return{teams:[e,r].map(s=>vU(s,t))}}function vU(t,e){let r=ot(t,e),n=$t(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function kU(t,e){return await R(t,r=>{let n=fe(),s=Sr(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:kr()});return s.acquired?(n&&Ce(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:Db(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Ce(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Db(s.current)})),{acquired:!1,current:s.current})})}async function Fb(t,e,r){return await R(t,n=>{for(let o=0;o<2;o+=1){let i=n.getTerminalLock(e,r);if(i===null)return null;if(_f(i).live)return i;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,i.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(e,r);return s===null?null:_f(s).live?s:null})}function Db(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function IU(t,e){try{await R(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)}
2078
+ `)}}async function uU(t,e){try{await R(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-dU(e)).toISOString())})}catch{}}function dU(t){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return Ob;let r=Number(e);return!Number.isFinite(r)||r<=0?Ob:r}var Ob,Tf=E(()=>{"use strict";kt();ve();pe();Ob=8*60*60*1e3});async function sl(t){let e=t.onEvent??(()=>{}),r=mU(t.io,e),n=null,s=null,o=null,i,a=null,l=t.prompt;try{let c=await R(r,b=>Xe(t.teamfile,t.alias,b)),u=c.teamfile,d=await R(r,b=>EU(b,t.env??process.env)),f=d.sender,m=await TU(r,{explicitRoot:t.rootFlag,sender:f,receiverTeamfile:u,operatorOrigin:d.origin==="operator"});o=await _U(r,{receiverTeamfile:u,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:t.prompt,origin:d.origin}),i=yU(r,o);let p=f===null?null:await bU(r,{rootTeamfile:m,sender:f,receiverTeamfile:u,receiverAlias:c.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2079
+ `});try{En(r,Fe(u),u)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:u,receiver_alias:c.alias,origin:d.origin,policy:p};let h=await Fb(r,u,c.alias);if(h!==null){let b=gf(h);if(f!==null){let k=await bf(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=tl(`enqueued mailbox message ${k.id}`,null),Sf(k.id,f,u,c.alias)}let x=await Jn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:b});return a=vf(b,x),{status:"busy",message:b,teamChatLogId:x}}if(await pU(r,u,c.alias)){if(f!==null){let k=await bf(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=tl(`enqueued mailbox message ${k.id}`,null),Sf(k.id,f,u,c.alias)}let b=await hU(r,u,c.alias),x=await Jn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:b});return a=vf(b,x),{status:"busy",message:b,teamChatLogId:x}}if(f!==null&&f.teamfile!==u){let b=await R(r,x=>kb(x,{root:m,sender:f,receiverTeamfile:u,receiverAlias:c.alias,now:new Date}));if(b.stop){let x=Nb(b.chain),k=await Jn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:x});return a=rl(x,k),{status:"error",errorKind:"cycle",message:x,teamChatLogId:k}}}let g=await kU(r,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:f?.teamfile??u,sender_alias:f?.alias??"operator"});if(!g.acquired){let b=Ub(u,c.alias,g.current);if(f!==null){let k=await bf(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=tl(`enqueued mailbox message ${k.id}`,null),Sf(k.id,f,u,c.alias)}let x=await Jn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:b});return a=vf(b,x),{status:"busy",message:b,teamChatLogId:x}}s=g.lease;let _=await el({sender:f??{teamfile:u,alias:"operator"},receiver:{teamfile:u,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:t.prompt,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:b=>e({kind:"delta",chunk:b}),onProgress:b=>e({kind:"progress",alias:c.alias,event:b})});l=_.prompt;let S=_.status==="stalled",w=await Jn(r,{...n,message:l,response:S?null:_.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":S?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:S?`provider stalled${_.stalledAfterMs!==void 0?` after ${_.stalledAfterMs}ms`:""}`:null});return a=S?rl(`provider stalled${_.stalledAfterMs!==void 0?` after ${_.stalledAfterMs}ms`:""}`,w,_.receipt):tl(_.receipt,w),{status:S?"stalled":"ok",replyText:_.receipt,wroteDelta:_.wroteDelta,teamChatLogId:w,durationMs:_.durationMs}}catch(c){let u=c instanceof Error?c.message:String(c),d=n===null?null:await Jn(r,{...n,message:l,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${u}`:u});return a=rl(u,d),{status:"error",errorKind:c instanceof be?"target":"provider",message:u,teamChatLogId:d}}finally{i!==void 0&&clearInterval(i),s!==null&&await IU(r,s),o!==null&&await gU(r,o,a??rl("chat turn exited without a terminal outcome",null))}}function mU(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function pU(t,e,r){return await R(t,n=>Un(n,e,r))}async function hU(t,e,r){let n=await Fb(t,e,r);if(n!==null)return gf(n);let s=await R(t,o=>o.getAgentInflight(e,r));return s!==null?Ub(e,r,s):`${r} is busy; wait and retry`}async function bf(t,e){return await R(t,r=>r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,payload:e.payload}))}function Sf(t,e,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:t,message:`mailbox message ${t} enqueued to ${s}`,teamChatLogId:null,sender:`${e.teamfile}:${e.alias}`,receiver:s}}async function _U(t,e){try{return(await R(t,n=>n.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:wU(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return fe()&&Ce(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function gU(t,e,r){try{await R(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){fe()&&Ce(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function yU(t,e){if(e===null)return;let r=setInterval(()=>{R(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{fe()&&Ce(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},fU);return r.unref?.(),r}function tl(t,e){return{status:"done",result_summary:nl(t),error:null,team_chat_log_id:e}}function vf(t,e){return{status:"busy",result_summary:nl(t),error:t,team_chat_log_id:e}}function rl(t,e,r){return{status:"error",result_summary:nl(r===void 0?t:r),error:t,team_chat_log_id:e}}function nl(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function wU(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function EU(t,e){let r=Ot(e,t);if(r.ok)return{sender:rr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(jt("chat"))}async function TU(t,e){if(e.explicitRoot!==void 0)return await R(t,n=>we(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await R(t,n=>Ib(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function bU(t,e){return await R(t,r=>Tb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:SU(r,e.sender.teamfile,e.receiverTeamfile)}))}function SU(t,e,r){return{teams:[e,r].map(s=>vU(s,t))}}function vU(t,e){let r=ot(t,e),n=$t(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function kU(t,e){return await R(t,r=>{let n=fe(),s=Sr(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:kr()});return s.acquired?(n&&Ce(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:Db(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Ce(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Db(s.current)})),{acquired:!1,current:s.current})})}async function Fb(t,e,r){return await R(t,n=>{for(let o=0;o<2;o+=1){let i=n.getTerminalLock(e,r);if(i===null)return null;if(_f(i).live)return i;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,i.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(e,r);return s===null?null:_f(s).live?s:null})}function Db(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function IU(t,e){try{await R(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)}
2074
2080
  `)}}function Ub(t,e,r){return`${e} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function Jn(t,e){let r=Pb(e.message),n=e.response===null?null:Pb(e.response);try{return await R(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2075
- `),null}}function Pb(t){return t.length<=Mb?{text:t,truncated:!1}:{text:t.slice(0,Mb),truncated:!0}}var Mb,fU,kf=E(()=>{"use strict";Lt();er();Rs();bb();wt();Za();ve();pe();Wn();yf();Vr();to();Tf();Mb=256*1024,fU=3e4});var qb={};ne(qb,{parseIdleTimeoutMs:()=>Bb,runChat:()=>xU});async function xU(t,e={stdout:process.stdout,stderr:process.stderr}){let r=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Wb}
2081
+ `),null}}function Pb(t){return t.length<=Mb?{text:t,truncated:!1}:{text:t.slice(0,Mb),truncated:!0}}var Mb,fU,kf=E(()=>{"use strict";Lt();er();Rs();bb();wt();Qa();ve();pe();Wn();yf();Vr();to();Tf();Mb=256*1024,fU=3e4});var qb={};ne(qb,{parseIdleTimeoutMs:()=>Bb,runChat:()=>xU});async function xU(t,e={stdout:process.stdout,stderr:process.stderr}){let r=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Wb}
2076
2082
  `),t.length===0?2:0;let n=AU(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
2077
2083
  ${Wb}
2078
2084
  `),2;if(n.runFlag!==void 0){let d=Number.parseInt(n.runFlag,10);return!Number.isFinite(d)||d<=0||String(d)!==n.runFlag?(e.stderr.write(`error: invalid --run "${n.runFlag}" (expected a positive integer run id)
2079
2085
  `),2):await R(e,async f=>{let m=f.getRun(d);if(m===null)return e.stderr.write(`error: run ${d}: not found
2080
- `),1;if(m.terminal_state!==null&&m.terminal_state.length>0)return y(e,`run ${d}: already terminal (${m.terminal_state}); chat --run cannot resume a terminated run`);let p=Aa(f,d);if(p===null)return e.stderr.write(`error: run ${d}: no pending operator-answerable attention (chat --run only resumes paused runs)
2086
+ `),1;if(m.terminal_state!==null&&m.terminal_state.length>0)return y(e,`run ${d}: already terminal (${m.terminal_state}); chat --run cannot resume a terminated run`);let p=Ra(f,d);if(p===null)return e.stderr.write(`error: run ${d}: no pending operator-answerable attention (chat --run only resumes paused runs)
2081
2087
  `),1;if(p.kind==="workflow_escalation"){if(n.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
2082
2088
  `),2;let h=f.resumeEscalation(p.attention_id,n.prompt);return h.resumed===!0?(e.stdout.write(`run ${d}: escalation resumed (decision: ${n.prompt})
2083
2089
  `),0):(e.stderr.write(`error: run ${d}: resumeEscalation failed (${h.reason})
@@ -2088,7 +2094,7 @@ ${Wb}
2088
2094
  `),1})}let s=vr(NU,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return e.stderr.write(`error: ${s.message}
2089
2095
  `),2;if(s.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
2090
2096
  `),2;let o;if(s.mode==="ai-team"){if(s.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
2091
- `),2;let d=await nl({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:e,onEvent:f=>$U(e,f)});return n.json===!0?d.status==="enqueued"?(e.stdout.write(`${JSON.stringify({status:"enqueued",path:"enqueued",id:d.id,sender:d.sender,receiver:d.receiver})}
2097
+ `),2;let d=await sl({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:e,onEvent:f=>$U(e,f)});return n.json===!0?d.status==="enqueued"?(e.stdout.write(`${JSON.stringify({status:"enqueued",path:"enqueued",id:d.id,sender:d.sender,receiver:d.receiver})}
2092
2098
  `),0):d.status==="busy"?(e.stdout.write(`${JSON.stringify({status:"busy",message:d.message,teamChatLogId:d.teamChatLogId})}
2093
2099
  `),1):d.status==="error"?(e.stdout.write(`${JSON.stringify({status:"error",errorKind:d.errorKind,message:d.message,teamChatLogId:d.teamChatLogId})}
2094
2100
  `),1):(e.stdout.write(`${JSON.stringify({status:d.status,replyText:d.replyText,teamChatLogId:d.teamChatLogId})}
@@ -2109,7 +2115,7 @@ ${Wb}
2109
2115
  `),1}}function AU(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c=!1;for(let p=0;p<t.length;p+=1){let h=t[p];if(h==="--permission-mode"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --permission-mode";if(g!=="plan"&&g!=="yolo")return`--permission-mode must be one of plan|yolo (got "${g}")`;r=g;continue}if(h==="--idle-timeout"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --idle-timeout";let _=Bb(g);if(typeof _=="string")return _;n=_;continue}if(h==="--session"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --session";s=g;continue}if(h==="--provider"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --provider";o=g;continue}if(h==="--from"||h.startsWith("--from="))return wf("chat");if(h.startsWith("I_am="))return`unknown argument: ${h}`;if(h==="--root"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --root";i=g;continue}if(h==="--force"||h.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(h==="--json"){c=!0;continue}if(h==="--run"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --run";a=g;continue}if(h==="--done"){l=!0;continue}if(h.startsWith("--"))return`unknown flag: ${h}`;e.push(h)}if(a!==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 --root":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:a,done:l,json:c};let u,d,f;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';f=e[0]}else if(e.length===2)u=e[0],f=e[1];else if(e.length===3)u=e[0],d=e[1],f=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(l)return"--done requires --run";let m={prompt:f,permissionMode:r};return u!==void 0&&(m.target=u),d!==void 0&&(m.alias=d),n!==void 0&&(m.idleTimeoutMs=n),s!==void 0&&(m.sessionFlag=s),o!==void 0&&(m.providerFlag=o),i!==void 0&&(m.rootFlag=i),c&&(m.json=c),m}function Bb(t){if(t==="0")return 0;if(/^\d+$/.test(t))return Number(t);let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function Hb(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
2110
2116
  `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
2111
2117
  `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
2112
- `)}function RU(t,e){return t.slice(-e)}function $U(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Hb(t,e.alias,e.event):t.stderr.write(e.message)}var NU,Wb,Jb=E(()=>{"use strict";kt();pe();Lt();kf();Vr();ve();Ra();Xt();NU={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Wb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2118
+ `)}function RU(t,e){return t.slice(-e)}function $U(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Hb(t,e.alias,e.event):t.stderr.write(e.message)}var NU,Wb,Jb=E(()=>{"use strict";kt();pe();Lt();kf();Vr();ve();$a();Xt();NU={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Wb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2113
2119
  lmctl chat <teamfile> <alias> "<prompt>"
2114
2120
  lmctl chat <sessionid> "<prompt>" --provider <name>
2115
2121
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -2117,14 +2123,14 @@ ${Wb}
2117
2123
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
2118
2124
  [--root <teamfile>] [--json]
2119
2125
 
2120
- Send a prompt to a team member or raw provider session, or answer a paused run.`});var Xb={};ne(Xb,{runCheck:()=>jU});async function jU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(LU),0;let r=qn(t,"check");if(r.error!==void 0)return sl(e,r.error);let n=D(r.args,[],["--json"]);if(n.error!==void 0)return sl(e,n.error);if(n.positionals.length>0)return sl(e,`unexpected positional: ${n.positionals[0]}`);let s=e.env??process.env;try{let o=await R(e,i=>{let a=Ot(s,i);if(a.ok!==!0)throw new Error(a.reason==="unset"?tr("check"):jt("check"));let l=rr(a.identity),c=i.listTrackedInvocations({from:l.value,limit:50}).map(OU),u=CU(l.value,i.listOutboundPendingForSender(l.teamfile,l.alias),(d,f)=>Un(i,d,f));return{identity:l.value,jobs:c,outbound:u}});return C(n,"--json")?U(e,o):MU(e,o),0}catch(o){return sl(e,o instanceof Error?o.message:String(o))}}function OU(t){return{id:t.id,kind:t.kind,status:t.status,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at}}function CU(t,e,r){let n=new Map;for(let s of e){let o=`${s.receiver_teamfile}\0${s.receiver_alias}`,i=n.get(o);i===void 0?n.set(o,[s]):i.push(s)}return[...n.values()].map(s=>{let o=s[0],i=s.map(a=>a.created_at).sort();return{sender:t,receiver:`${o.receiver_teamfile}:${o.receiver_alias}`,pending_count:s.length,busy:r(o.receiver_teamfile,o.receiver_alias),oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:s.map(a=>a.id)}})}function MU(t,e){if(t.stdout.write(`identity: ${e.identity}
2126
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});var Xb={};ne(Xb,{runCheck:()=>jU});async function jU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(LU),0;let r=qn(t,"check");if(r.error!==void 0)return ol(e,r.error);let n=D(r.args,[],["--json"]);if(n.error!==void 0)return ol(e,n.error);if(n.positionals.length>0)return ol(e,`unexpected positional: ${n.positionals[0]}`);let s=e.env??process.env;try{let o=await R(e,i=>{let a=Ot(s,i);if(a.ok!==!0)throw new Error(a.reason==="unset"?tr("check"):jt("check"));let l=rr(a.identity),c=i.listTrackedInvocations({from:l.value,limit:50}).map(OU),u=CU(l.value,i.listOutboundPendingForSender(l.teamfile,l.alias),(d,f)=>Un(i,d,f));return{identity:l.value,jobs:c,outbound:u}});return C(n,"--json")?U(e,o):MU(e,o),0}catch(o){return ol(e,o instanceof Error?o.message:String(o))}}function OU(t){return{id:t.id,kind:t.kind,status:t.status,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at}}function CU(t,e,r){let n=new Map;for(let s of e){let o=`${s.receiver_teamfile}\0${s.receiver_alias}`,i=n.get(o);i===void 0?n.set(o,[s]):i.push(s)}return[...n.values()].map(s=>{let o=s[0],i=s.map(a=>a.created_at).sort();return{sender:t,receiver:`${o.receiver_teamfile}:${o.receiver_alias}`,pending_count:s.length,busy:r(o.receiver_teamfile,o.receiver_alias),oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:s.map(a=>a.id)}})}function MU(t,e){if(t.stdout.write(`identity: ${e.identity}
2121
2127
  `),t.stdout.write(`jobs:
2122
2128
  `),e.jobs.length===0)t.stdout.write(` none
2123
2129
  `);else for(let r of e.jobs)t.stdout.write(` #${r.id} ${r.kind} ${r.status}${r.target===null?"":` -> ${r.target}`} started ${r.started_at}${r.ended_at===null?"":` ended ${r.ended_at}`}
2124
2130
  `);if(t.stdout.write(`outbound queue:
2125
2131
  `),e.outbound.length===0)t.stdout.write(` none
2126
2132
  `);else for(let r of e.outbound)t.stdout.write(` ${r.sender} -> ${r.receiver}: ${r.pending_count} pending, receiver ${r.busy?"busy":"idle"}
2127
- `)}function sl(t,e){return t.stderr.write(`error: ${e}
2133
+ `)}function ol(t,e){return t.stderr.write(`error: ${e}
2128
2134
  `),2}var LU,Gb=E(()=>{"use strict";Wn();pe();to();Vr();LU=`usage: lmctl check [--json]
2129
2135
 
2130
2136
  Show this member's background jobs and outbound queued mail. Read-only: check
@@ -2134,13 +2140,13 @@ never delivers, enqueues, marks, or deletes.
2134
2140
  `):p.status==="skipped-busy"?e.stdout.write(`skipped ${p.receiver}: busy (${p.pending_count} pending)
2135
2141
  `):e.stdout.write(`error ${p.receiver}: ${p.error} (${p.pending_count} pending)
2136
2142
  `);e.stdout.write(`summary: delivered=${f.delivered} skipped_busy=${f.skipped_busy} error=${f.error}
2137
- `)}return m}catch(l){return await zb(e,i,{status:"error",error:l instanceof Error?l.message:String(l),exit_code:2}),If(e,l instanceof Error?l.message:String(l))}finally{a!==void 0&&clearInterval(a),o!==null&&await R(e,l=>l.clearRuntimeProcessLock(Kb,o.key,Vb,o.id)).catch(()=>{})}}async function WU(t,e,r,n){let s=`${n.receiverTeamfile}:${n.receiverAlias}`,o=n.rows.length;if(await R(t,l=>Un(l,n.receiverTeamfile,n.receiverAlias)))return{receiver:s,status:"skipped-busy",pending_count:o};let a=null;try{let l=await R(t,d=>Xe(n.receiverTeamfile,n.receiverAlias,d)),c=await R(t,d=>Sr(d,{receiver_teamfile:n.receiverTeamfile,receiver_alias:n.receiverAlias,sender_teamfile:r.teamfile,sender_alias:r.alias,ttlMs:kr()}));if(!c.acquired)return{receiver:s,status:"skipped-busy",pending_count:o};a=c.lease;let u=await Qa({sender:r,receiver:{teamfile:n.receiverTeamfile,alias:n.receiverAlias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:t,permissionMode:"yolo",env:e});return u.status==="stalled"?{receiver:s,status:"error",pending_count:o,error:"provider stalled"}:{receiver:s,status:"delivered",pending_count:o,delivered_ids:u.deliveredIds,receipt:u.receipt}}catch(l){return{receiver:s,status:"error",pending_count:o,error:l instanceof Error?l.message:String(l)}}finally{a!==null&&await R(t,l=>l.releaseAgentInflight(a)).catch(()=>{})}}function BU(t){let e=new Map;for(let r of t){let n=`${r.receiver_teamfile}\0${r.receiver_alias}`,s=e.get(n);s===void 0?e.set(n,[r]):s.push(r)}return[...e.values()].map(r=>({receiverTeamfile:r[0].receiver_teamfile,receiverAlias:r[0].receiver_alias,rows:r.sort((n,s)=>n.id-s.id)})).sort((r,n)=>r.rows[0].id-n.rows[0].id)}function HU(t){return{delivered:t.filter(e=>e.status==="delivered").length,skipped_busy:t.filter(e=>e.status==="skipped-busy").length,error:t.filter(e=>e.status==="error").length,lanes:t.length}}function qU(t){let e=t.LMCTL_PUSH_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return Yb;let r=Number(e);return!Number.isFinite(r)||r<=0?Yb:r}async function JU(t,e,r,n){try{return(await R(t,o=>o.startTrackedInvocation({kind:"exec",origin:"agent",scope_teamfile:r,from_identity:e,target_teamfile:null,target_alias:null,root_teamfile:r,cwd:process.cwd(),command:["lmctl","push",...n].join(" "),holder_pid:process.pid,holder_host:DU(),meta:JSON.stringify({command:"push"})}))).id}catch{return null}}function XU(t,e){if(e===null)return;let r=setInterval(()=>{R(t,n=>n.heartbeatTrackedInvocation(e)).catch(()=>{})},FU);return r.unref?.(),r}async function zb(t,e,r){if(e!==null)try{await R(t,n=>{n.finishTrackedInvocation(e,r)})}catch{}}function If(t,e){return t.stderr.write(`error: ${e}
2138
- `),2}var PU,Kb,Vb,Yb,FU,Qb=E(()=>{"use strict";Wn();Za();pe();to();Tf();Vr();Lt();PU=`usage: lmctl push [--json]
2143
+ `)}return m}catch(l){return await zb(e,i,{status:"error",error:l instanceof Error?l.message:String(l),exit_code:2}),If(e,l instanceof Error?l.message:String(l))}finally{a!==void 0&&clearInterval(a),o!==null&&await R(e,l=>l.clearRuntimeProcessLock(Kb,o.key,Vb,o.id)).catch(()=>{})}}async function WU(t,e,r,n){let s=`${n.receiverTeamfile}:${n.receiverAlias}`,o=n.rows.length;if(await R(t,l=>Un(l,n.receiverTeamfile,n.receiverAlias)))return{receiver:s,status:"skipped-busy",pending_count:o};let a=null;try{let l=await R(t,d=>Xe(n.receiverTeamfile,n.receiverAlias,d)),c=await R(t,d=>Sr(d,{receiver_teamfile:n.receiverTeamfile,receiver_alias:n.receiverAlias,sender_teamfile:r.teamfile,sender_alias:r.alias,ttlMs:kr()}));if(!c.acquired)return{receiver:s,status:"skipped-busy",pending_count:o};a=c.lease;let u=await el({sender:r,receiver:{teamfile:n.receiverTeamfile,alias:n.receiverAlias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:t,permissionMode:"yolo",env:e});return u.status==="stalled"?{receiver:s,status:"error",pending_count:o,error:"provider stalled"}:{receiver:s,status:"delivered",pending_count:o,delivered_ids:u.deliveredIds,receipt:u.receipt}}catch(l){return{receiver:s,status:"error",pending_count:o,error:l instanceof Error?l.message:String(l)}}finally{a!==null&&await R(t,l=>l.releaseAgentInflight(a)).catch(()=>{})}}function BU(t){let e=new Map;for(let r of t){let n=`${r.receiver_teamfile}\0${r.receiver_alias}`,s=e.get(n);s===void 0?e.set(n,[r]):s.push(r)}return[...e.values()].map(r=>({receiverTeamfile:r[0].receiver_teamfile,receiverAlias:r[0].receiver_alias,rows:r.sort((n,s)=>n.id-s.id)})).sort((r,n)=>r.rows[0].id-n.rows[0].id)}function HU(t){return{delivered:t.filter(e=>e.status==="delivered").length,skipped_busy:t.filter(e=>e.status==="skipped-busy").length,error:t.filter(e=>e.status==="error").length,lanes:t.length}}function qU(t){let e=t.LMCTL_PUSH_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return Yb;let r=Number(e);return!Number.isFinite(r)||r<=0?Yb:r}async function JU(t,e,r,n){try{return(await R(t,o=>o.startTrackedInvocation({kind:"exec",origin:"agent",scope_teamfile:r,from_identity:e,target_teamfile:null,target_alias:null,root_teamfile:r,cwd:process.cwd(),command:["lmctl","push",...n].join(" "),holder_pid:process.pid,holder_host:DU(),meta:JSON.stringify({command:"push"})}))).id}catch{return null}}function XU(t,e){if(e===null)return;let r=setInterval(()=>{R(t,n=>n.heartbeatTrackedInvocation(e)).catch(()=>{})},FU);return r.unref?.(),r}async function zb(t,e,r){if(e!==null)try{await R(t,n=>{n.finishTrackedInvocation(e,r)})}catch{}}function If(t,e){return t.stderr.write(`error: ${e}
2144
+ `),2}var PU,Kb,Vb,Yb,FU,Qb=E(()=>{"use strict";Wn();Qa();pe();to();Tf();Vr();Lt();PU=`usage: lmctl push [--json]
2139
2145
 
2140
2146
  Flush this member's outbound queued mail for idle receivers. Blocking and
2141
2147
  background-able; use lmctl wait as the wake when launched in the background.
2142
- `,Kb="cli:push",Vb="lock",Yb=12e4,FU=3e4});var uS={};ne(uS,{runWait:()=>eW});import{hostname as GU}from"node:os";async function eW(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(KU),0;let n=qn(t,"wait");if(n.error!==void 0)return Xn(e,n.error);let s=D(n.args,["--interval","--timeout"],["--json"]);if(s.error!==void 0)return Xn(e,s.error);if(s.positionals.length>1)return Xn(e,`unexpected positional: ${s.positionals[1]}`);let o=iS(A(s,"--interval"),"--interval",VU);if(typeof o=="string")return Xn(e,o);let i=iS(A(s,"--timeout"),"--timeout",YU);if(typeof i=="string")return Xn(e,i);let a,l;try{a=await tW(e,{teamfile:s.positionals[0]}),l=await rW(e,a)}catch(b){return Xn(e,b instanceof Error?b.message:String(b))}let c=C(s,"--json"),u=r.sleep??(b=>new Promise(x=>setTimeout(x,b))),d=r.now??(()=>Date.now()),f=r.appearanceGraceMs??TW(),m=r.reclaimStaleMs??EW("LMCTL_WAIT_RECLAIM_STALE_MS",ZU),p=d(),h=new Date(p).toISOString(),g=pW(a,h),_=p+i,S=p+f,w=new Set;for(await R(e,b=>lW(b,d(),m)),Oe({event:"wait_start",scope:a,waitStartedAt:h,notifier:g,intervalMs:o,timeoutMs:i,appearanceGraceMs:f,reclaimStaleMs:m,dbPath:le()});;){let b=await R(e,x=>nW(x,{scope:a,snapshotIds:w,nowMs:d(),waitStartedAt:h,notifier:g,reclaimStaleMs:m,mailboxSender:l}));if(b.finished!==null||b.receipts.length>0)return ol(e,{status:"completed",finished:b.finished===null?[]:[hW(b.finished)],in_flight:sS(b.running),receipts:b.receipts.map(_W)},c),0;if(w.size>0||b.hasComingMail){if(d()>=_)return ol(e,{status:"timeout",finished:[],in_flight:sS(b.running),receipts:[]},c),1;await u(aS(d(),o,_));continue}if(d()>=_)return ol(e,{status:"timeout",finished:[],in_flight:[],receipts:[]},c),1;if(d()>=S)return ol(e,{status:"idle",finished:[],in_flight:[],receipts:[]},c),0;await u(aS(d(),o,S,_))}}function Xn(t,e){return t.stderr.write(`error: ${e}
2143
- `),2}async function tW(t,e){if(e.teamfile!==void 0)return await R(t,n=>({kind:"team",teamfile:we(e.teamfile,n)}));let r=t.env??process.env;return await R(t,n=>{let s=Ot(r,n);if(s.ok)return{kind:"from",from:s.identity};throw s.reason==="unset"?new Error(tr("wait")):new Error(jt("wait"))})}async function rW(t,e){if(e.kind==="from")return rr(e.from);let r=t.env??process.env;return await R(t,n=>{try{let s=Ef(r,n);return s.ok?rr(s.identity):null}catch{return null}})}function nW(t,e){let r=new Set(t.reclaimStaleMailboxDeliveries(new Date(e.nowMs-e.reclaimStaleMs).toISOString()).map(l=>l.id)),n=sW(t,e.mailboxSender,e.scope,e.notifier,r),s=rS(t,e);if(s!==null)return{finished:s,running:nS(t,e.scope),receipts:n.receipts,hasComingMail:n.hasComingMail};if(e.snapshotIds.size===0)for(let l of nS(t,e.scope))e.snapshotIds.add(l.id);let i=[...e.snapshotIds].map(l=>cW(t,l,e.nowMs,e.reclaimStaleMs)).filter(l=>l!==null).filter(fW).sort((l,c)=>l.id-c.id);e.snapshotIds.clear();for(let l of i)e.snapshotIds.add(l.id);return{finished:rS(t,e),running:i,receipts:n.receipts,hasComingMail:n.hasComingMail}}function rS(t,e){for(let r of aW(t,e.scope,e.waitStartedAt)){let n=t.claimTrackedInvocationNotification(r.id,e.notifier);if(n!==null)return n}return null}function sW(t,e,r,n,s){if(e===null)return{receipts:[],hasComingMail:!1};let o=new Date().toISOString();t.db.exec("BEGIN IMMEDIATE");try{let i=t.db.prepare(`
2148
+ `,Kb="cli:push",Vb="lock",Yb=12e4,FU=3e4});var uS={};ne(uS,{runWait:()=>eW});import{hostname as GU}from"node:os";async function eW(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(KU),0;let n=qn(t,"wait");if(n.error!==void 0)return Xn(e,n.error);let s=D(n.args,["--interval","--timeout"],["--json"]);if(s.error!==void 0)return Xn(e,s.error);if(s.positionals.length>1)return Xn(e,`unexpected positional: ${s.positionals[1]}`);let o=iS(A(s,"--interval"),"--interval",VU);if(typeof o=="string")return Xn(e,o);let i=iS(A(s,"--timeout"),"--timeout",YU);if(typeof i=="string")return Xn(e,i);let a,l;try{a=await tW(e,{teamfile:s.positionals[0]}),l=await rW(e,a)}catch(b){return Xn(e,b instanceof Error?b.message:String(b))}let c=C(s,"--json"),u=r.sleep??(b=>new Promise(x=>setTimeout(x,b))),d=r.now??(()=>Date.now()),f=r.appearanceGraceMs??TW(),m=r.reclaimStaleMs??EW("LMCTL_WAIT_RECLAIM_STALE_MS",ZU),p=d(),h=new Date(p).toISOString(),g=pW(a,h),_=p+i,S=p+f,w=new Set;for(await R(e,b=>lW(b,d(),m)),Oe({event:"wait_start",scope:a,waitStartedAt:h,notifier:g,intervalMs:o,timeoutMs:i,appearanceGraceMs:f,reclaimStaleMs:m,dbPath:le()});;){let b=await R(e,x=>nW(x,{scope:a,snapshotIds:w,nowMs:d(),waitStartedAt:h,notifier:g,reclaimStaleMs:m,mailboxSender:l}));if(b.finished!==null||b.receipts.length>0)return il(e,{status:"completed",finished:b.finished===null?[]:[hW(b.finished)],in_flight:sS(b.running),receipts:b.receipts.map(_W)},c),0;if(w.size>0||b.hasComingMail){if(d()>=_)return il(e,{status:"timeout",finished:[],in_flight:sS(b.running),receipts:[]},c),1;await u(aS(d(),o,_));continue}if(d()>=_)return il(e,{status:"timeout",finished:[],in_flight:[],receipts:[]},c),1;if(d()>=S)return il(e,{status:"idle",finished:[],in_flight:[],receipts:[]},c),0;await u(aS(d(),o,S,_))}}function Xn(t,e){return t.stderr.write(`error: ${e}
2149
+ `),2}async function tW(t,e){if(e.teamfile!==void 0)return await R(t,n=>({kind:"team",teamfile:we(e.teamfile,n)}));let r=t.env??process.env;return await R(t,n=>{let s=Ot(r,n);if(s.ok)return{kind:"from",from:s.identity};throw s.reason==="unset"?new Error(tr("wait")):new Error(jt("wait"))})}async function rW(t,e){if(e.kind==="from")return rr(e.from);let r=t.env??process.env;return await R(t,n=>{try{let s=Ef(r,n);return s.ok?rr(s.identity):null}catch{return null}})}function nW(t,e){let r=new Set(t.reclaimStaleMailboxDeliveries(new Date(e.nowMs-e.reclaimStaleMs).toISOString()).map(l=>l.id)),n=sW(t,e.mailboxSender,e.scope,e.notifier,r),s=rS(t,e);if(s!==null)return{finished:s,running:nS(t,e.scope),receipts:n.receipts,hasComingMail:n.hasComingMail};if(e.snapshotIds.size===0)for(let l of nS(t,e.scope))e.snapshotIds.add(l.id);let i=[...e.snapshotIds].map(l=>cW(t,l,e.nowMs,e.reclaimStaleMs)).filter(l=>l!==null).filter(fW).sort((l,c)=>l.id-c.id);e.snapshotIds.clear();for(let l of i)e.snapshotIds.add(l.id);return{finished:rS(t,e),running:i,receipts:n.receipts,hasComingMail:n.hasComingMail}}function rS(t,e){for(let r of aW(t,e.scope)){let n=t.claimTrackedInvocationNotification(r.id,e.notifier);if(n!==null)return n}return null}function sW(t,e,r,n,s){if(e===null)return{receipts:[],hasComingMail:!1};let o=new Date().toISOString();t.db.exec("BEGIN IMMEDIATE");try{let i=t.db.prepare(`
2144
2150
  SELECT id FROM agent_mailbox
2145
2151
  WHERE sender_teamfile = ?
2146
2152
  AND sender_alias = ?
@@ -2176,7 +2182,7 @@ background-able; use lmctl wait as the wake when launched in the background.
2176
2182
  WHERE from_identity = ?
2177
2183
  AND status = 'running'
2178
2184
  LIMIT 1
2179
- `).get(e.from)!=null}function nS(t,e){return e.kind==="team"?t.listRunningTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listRunningTrackedInvocations({from:e.from,limit:1e3})}function aW(t,e,r){return e.kind==="team"?t.listClaimableTerminalTrackedInvocations({scope_teamfile:e.teamfile,ended_at_gte:r,limit:1e3}):t.listClaimableTerminalTrackedInvocations({from:e.from,ended_at_gte:r,limit:1e3})}function lW(t,e,r){let n=[];for(let s of t.listAllRunningTrackedInvocations()){if(!cS(s,e,r))continue;let o=lS(t,s);o!==null&&mW(o)&&n.push(o)}return n}function cW(t,e,r,n){let s=t.getTrackedInvocation(e);return s===null||s.status!=="running"||!cS(s,r,n)?s:lS(t,s)??t.getTrackedInvocation(s.id)}function lS(t,e){return t.reclaimTrackedInvocationIfUnchanged(e.id,{holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat_at:e.last_heartbeat_at},{status:"error",error:tS,result_summary:tS})}function cS(t,e,r){return t.holder_host===GU()&&dW(t.holder_pid)?!ir(t.holder_pid):uW(t,e,r)}function uW(t,e,r){let n=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(n)&&e-n>r}function dW(t){return Number.isInteger(t)&&(t??0)>0}function fW(t){return t.status==="running"}function mW(t){return QU.has(t.status)}function pW(t,e){let r=t.kind==="team"?t.teamfile:t.from;return`wait:${process.pid}:${t.kind}:${r}:${e}`}function hW(t){return{id:t.id,kind:t.kind,status:t.status,from_identity:t.from_identity,scope_teamfile:t.scope_teamfile,target_teamfile:t.target_teamfile,target_alias:t.target_alias,result_summary:yW(t)}}function sS(t){return t.sort((e,r)=>e.id-r.id).map(e=>({id:e.id,kind:e.kind,status:"running",from_identity:e.from_identity,target_alias:e.target_alias}))}function _W(t){return{id:t.id,receiver:`${t.receiver_teamfile}:${t.receiver_alias}`,delivered_at:t.delivered_at??t.created_at,receipt:gW(t.receipt??"")}}function gW(t){let e=t.replace(/\s+/g," ").trim();return e.length===0?"(empty)":e.length<=240?e:`${e.slice(0,239)}\u2026`}function yW(t){let r=(t.result_summary??t.error??t.status).replace(/\s+/g," ").trim();return r.length===0?"(empty)":r.length<=240?r:`${r.slice(0,239)}\u2026`}function ol(t,e,r){if(r){U(t,e);return}if(e.status==="idle"){t.stdout.write(`wait: idle (no running tracked invocations or pending receipts)
2185
+ `).get(e.from)!=null}function nS(t,e){return e.kind==="team"?t.listRunningTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listRunningTrackedInvocations({from:e.from,limit:1e3})}function aW(t,e){return e.kind==="team"?t.listClaimableTerminalTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listClaimableTerminalTrackedInvocations({from:e.from,limit:1e3})}function lW(t,e,r){let n=[];for(let s of t.listAllRunningTrackedInvocations()){if(!cS(s,e,r))continue;let o=lS(t,s);o!==null&&mW(o)&&n.push(o)}return n}function cW(t,e,r,n){let s=t.getTrackedInvocation(e);return s===null||s.status!=="running"||!cS(s,r,n)?s:lS(t,s)??t.getTrackedInvocation(s.id)}function lS(t,e){return t.reclaimTrackedInvocationIfUnchanged(e.id,{holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat_at:e.last_heartbeat_at},{status:"error",error:tS,result_summary:tS})}function cS(t,e,r){return t.holder_host===GU()&&dW(t.holder_pid)?!ir(t.holder_pid):uW(t,e,r)}function uW(t,e,r){let n=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(n)&&e-n>r}function dW(t){return Number.isInteger(t)&&(t??0)>0}function fW(t){return t.status==="running"}function mW(t){return QU.has(t.status)}function pW(t,e){let r=t.kind==="team"?t.teamfile:t.from;return`wait:${process.pid}:${t.kind}:${r}:${e}`}function hW(t){return{id:t.id,kind:t.kind,status:t.status,from_identity:t.from_identity,scope_teamfile:t.scope_teamfile,target_teamfile:t.target_teamfile,target_alias:t.target_alias,result_summary:yW(t)}}function sS(t){return t.sort((e,r)=>e.id-r.id).map(e=>({id:e.id,kind:e.kind,status:"running",from_identity:e.from_identity,target_alias:e.target_alias}))}function _W(t){return{id:t.id,receiver:`${t.receiver_teamfile}:${t.receiver_alias}`,delivered_at:t.delivered_at??t.created_at,receipt:gW(t.receipt??"")}}function gW(t){let e=t.replace(/\s+/g," ").trim();return e.length===0?"(empty)":e.length<=240?e:`${e.slice(0,239)}\u2026`}function yW(t){let r=(t.result_summary??t.error??t.status).replace(/\s+/g," ").trim();return r.length===0?"(empty)":r.length<=240?r:`${r.slice(0,239)}\u2026`}function il(t,e,r){if(r){U(t,e);return}if(e.status==="idle"){t.stdout.write(`wait: idle (no running tracked invocations or pending receipts)
2180
2186
  `);return}if(e.status==="timeout"){t.stdout.write(`wait: timeout; ${e.in_flight.length} invocation(s) still running
2181
2187
  `),oS(t,e.in_flight);return}if(e.receipts.length>0){t.stdout.write(`wait: received ${e.receipts.length} delivery receipt(s)
2182
2188
  `);for(let n of e.receipts)t.stdout.write(` receipt ${n.id} to ${n.receiver} at ${n.delivered_at} ${n.receipt}
@@ -2185,7 +2191,7 @@ background-able; use lmctl wait as the wake when launched in the background.
2185
2191
  `)}oS(t,e.in_flight)}function oS(t,e){if(e.length===0){t.stdout.write(`in flight: none
2186
2192
  `);return}t.stdout.write(`in flight:
2187
2193
  `);for(let r of e)t.stdout.write(` ${r.id} ${r.status} ${r.kind} \u2192 ${r.target_alias??"(unknown)"}
2188
- `)}function iS(t,e,r){return t===void 0?r:wW(t,e)}function wW(t,e){let r=Number(t);return!Number.isFinite(r)||r<=0?`${e} must be a positive number of seconds`:Math.max(1,Math.ceil(r*1e3))}function EW(t,e){let r=process.env[t];if(r===void 0||r.trim()==="")return e;let n=Number(r);return!Number.isFinite(n)||n<=0?e:Math.max(1,Math.ceil(n))}function TW(){let t=process.env.LMCTL_WAIT_APPEARANCE_GRACE_MS;if(t===void 0||t.trim()==="")return eS;let e=Number(t);return Number.isFinite(e)?Math.min(zU,Math.max(0,Math.ceil(e))):eS}function aS(t,e,...r){let n=Math.min(...r);return Math.min(e,Math.max(1,n-t))}var KU,VU,YU,eS,zU,ZU,QU,tS,dS=E(()=>{"use strict";vo();pe();Ke();wt();Vr();to();ve();KU=`usage: lmctl wait [teamfile] [--interval <seconds>] [--timeout <seconds>] [--json]
2194
+ `)}function iS(t,e,r){return t===void 0?r:wW(t,e)}function wW(t,e){let r=Number(t);return!Number.isFinite(r)||r<=0?`${e} must be a positive number of seconds`:Math.max(1,Math.ceil(r*1e3))}function EW(t,e){let r=process.env[t];if(r===void 0||r.trim()==="")return e;let n=Number(r);return!Number.isFinite(n)||n<=0?e:Math.max(1,Math.ceil(n))}function TW(){let t=process.env.LMCTL_WAIT_APPEARANCE_GRACE_MS;if(t===void 0||t.trim()==="")return eS;let e=Number(t);return Number.isFinite(e)?Math.min(zU,Math.max(0,Math.ceil(e))):eS}function aS(t,e,...r){let n=Math.min(...r);return Math.min(e,Math.max(1,n-t))}var KU,VU,YU,eS,zU,ZU,QU,tS,dS=E(()=>{"use strict";ko();pe();Ke();wt();Vr();to();ve();KU=`usage: lmctl wait [teamfile] [--interval <seconds>] [--timeout <seconds>] [--json]
2189
2195
 
2190
2196
  Wait for the first tracked invocation in scope to finish or for delivered
2191
2197
  mailbox receipts for the calling member.
@@ -2214,7 +2220,7 @@ Use "lmctl exec -- sh -lc '<command>'" when shell expansion is desired.
2214
2220
  ${xf}`);if(n.positionals.length===0)return y(e,`recover requires a <teamfile>
2215
2221
 
2216
2222
  ${xf}`);if(n.positionals.length>2)return y(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],o=Gr(s),i=o?.teamfile??s,a=n.positionals[1],l=o?.alias??a;if(o!==null&&a!==void 0)return y(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(C(n,"--all")&&l!==void 0)return y(e,"recover --all is mutually exclusive with <alias>");let c;try{c=await VW(e,i,l)}catch(p){if(p instanceof be)return y(e,p.message);throw p}let u=r.now??new Date,d=C(n,"--dry-run"),f=[];for(let p of c)f.push(await YW(e,p,{now:u,dryRun:d}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(C(n,"--json"))U(e,{dryRun:d,now:u.toISOString(),summary:m,members:f});else{for(let p of f)e.stdout.write(zW(p));e.stdout.write(`Recover checked ${m.checked}: ${d?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2217
- `)}return m.errors>0?1:0}async function VW(t,e,r){return await R(t,n=>{let s=we(e,n);if(r!==void 0){let o=ot(s,n);if(o.parseErrors.length>0)throw new be(`lmctl: ${e}: ${o.parseErrors.join("; ")}`);let i=Ba(o,r);return i?.teamfile!==void 0?Af(yS(gS(s),i.teamfile),n,new Set):[Xe(e,r,n)]}return Af(s,n,new Set)})}function Af(t,e,r){let n=we(t,e);if(r.has(n))return[];r.add(n);let s=ot(n,e);if(s.parseErrors.length>0)throw new be(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let o=[];for(let i of s.members){if(i.teamfile!==void 0){o.push(...Af(yS(gS(n),i.teamfile),e,r));continue}i.session!==void 0&&o.push(Xe(n,i.alias,e))}return o}async function YW(t,e,r){let n;try{let a=await Gt(e.sessionid,e.provider);if(a===null)return Ct(e,"session_not_found",null,"session detail not found");n=ro(a.messages)}catch(a){return Ct(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Ct(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Ct(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Ct(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Ct(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let o=await R(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(o!==null)return Ct(e,"busy",n,`in-flight since ${o.started_at}`);if(r.dryRun)return Ct(e,"would_recover",n,null);let i=await nl({teamfile:e.teamfile,alias:e.alias,prompt:GW,permissionMode:"yolo",io:t,env:process.env});return i.status==="ok"||i.status==="stalled"?Ct(e,"recovered",n,null):Ct(e,i.status==="busy"?"busy":"send_error",n,i.message)}function Ct(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function zW(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
2223
+ `)}return m.errors>0?1:0}async function VW(t,e,r){return await R(t,n=>{let s=we(e,n);if(r!==void 0){let o=ot(s,n);if(o.parseErrors.length>0)throw new be(`lmctl: ${e}: ${o.parseErrors.join("; ")}`);let i=Ha(o,r);return i?.teamfile!==void 0?Af(yS(gS(s),i.teamfile),n,new Set):[Xe(e,r,n)]}return Af(s,n,new Set)})}function Af(t,e,r){let n=we(t,e);if(r.has(n))return[];r.add(n);let s=ot(n,e);if(s.parseErrors.length>0)throw new be(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let o=[];for(let i of s.members){if(i.teamfile!==void 0){o.push(...Af(yS(gS(n),i.teamfile),e,r));continue}i.session!==void 0&&o.push(Xe(n,i.alias,e))}return o}async function YW(t,e,r){let n;try{let a=await Gt(e.sessionid,e.provider);if(a===null)return Ct(e,"session_not_found",null,"session detail not found");n=ro(a.messages)}catch(a){return Ct(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Ct(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Ct(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Ct(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Ct(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let o=await R(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(o!==null)return Ct(e,"busy",n,`in-flight since ${o.started_at}`);if(r.dryRun)return Ct(e,"would_recover",n,null);let i=await sl({teamfile:e.teamfile,alias:e.alias,prompt:GW,permissionMode:"yolo",io:t,env:process.env});return i.status==="ok"||i.status==="stalled"?Ct(e,"recovered",n,null):Ct(e,i.status==="busy"?"busy":"send_error",n,i.message)}function Ct(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function zW(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
2218
2224
  `}var GW,xf,ES=E(()=>{"use strict";Nf();Ur();er();wt();Lt();kf();pe();GW="Your session limit reset time has passed. Continue your work from the last actionable point.",xf=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2219
2225
  `)});var no,z7,Rf=E(()=>{"use strict";no=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For batch or long-running shell work, launch it through `lmctl exec -- <command> &` and wait for completion with `lmctl wait`.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],z7=no.length});import{spawn as ZW}from"node:child_process";async function bS(t,e,r){let n=eB.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return tB(n.name,s)}function tB(t,e){return t==="lmctl_chat"?rB(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function rB(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",r,n,e];return fe()&&Ce(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),nB(s,process.cwd())}function nB(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=ZW("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=sB(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){fe()&&Ce(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2220
2226
  `).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 sB(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return TS;let r=Number(e);return!Number.isFinite(r)||r<=0?TS:r}function $f(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:QW),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 QW,TS,eB,Lf=E(()=>{"use strict";Rf();ve();QW="http://127.0.0.1:8787",TS=30*60*1e3,eB=new Map(no.map(t=>[t.name,t]))});async function lB(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(jf({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:oB,capabilities:{tools:{listChanged:!1}},serverInfo:{name:iB,version:aB}}}};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:no.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 bS(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 jf(t){return`${JSON.stringify(t)}
@@ -2237,12 +2243,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
2237
2243
  WHERE r.terminal_state IS NULL
2238
2244
  AND r.paused_at IS NULL
2239
2245
  AND r.started_at <= ?
2240
- `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=so(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(il(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 hB(t,e,r){let n=RS(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
2246
+ `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=so(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(al(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 hB(t,e,r){let n=RS(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
2241
2247
  SELECT id, project_id, source, source_ref, status, enqueued_at
2242
2248
  FROM job
2243
2249
  WHERE status NOT IN ('done', 'failed')
2244
2250
  AND enqueued_at <= ?
2245
- `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=so(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(il(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 _B(t,e,r){let n=$S(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
2251
+ `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=so(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(al(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 _B(t,e,r){let n=$S(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
2246
2252
  SELECT project_id,
2247
2253
  COUNT(*) AS count,
2248
2254
  (SELECT kind FROM attention a2
@@ -2257,7 +2263,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
2257
2263
  AND kind NOT IN ('attentions_overdue', 'issues_overdue')
2258
2264
  AND created_at <= ?
2259
2265
  GROUP BY project_id
2260
- `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=so(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(il(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 gB(t,e,r){let n=$S(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
2266
+ `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=so(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(al(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 gB(t,e,r){let n=$S(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
2261
2267
  SELECT project_id,
2262
2268
  COUNT(*) AS count,
2263
2269
  (SELECT title FROM project_issue i2
@@ -2270,7 +2276,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
2270
2276
  WHERE status IN ('open', 'reopened')
2271
2277
  AND created_at <= ?
2272
2278
  GROUP BY project_id
2273
- `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=so(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: ${EB(i.oldest_title,40)})`;o.push(il(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 il(t,e){let r=yB(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 yB(t,e,r,n){let s=wB(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
2279
+ `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=so(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: ${EB(i.oldest_title,40)})`;o.push(al(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 al(t,e){let r=yB(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 yB(t,e,r,n){let s=wB(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
2274
2280
  SELECT * FROM attention
2275
2281
  WHERE acknowledged_at IS NULL
2276
2282
  AND created_at >= ?
@@ -2283,12 +2289,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
2283
2289
  Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
2284
2290
  issues; emit findings as attentions for the operator/master to handle.
2285
2291
  `});var MS={};ne(MS,{runDevice:()=>OB});import{readFileSync as vB}from"node:fs";import{homedir as kB}from"node:os";import{join as IB}from"node:path";import{CognitoIdentityClient as NB,GetIdCommand as xB}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as AB}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as RB,ListObjectsV2Command as $B,PutObjectCommand as LB,S3Client as jB}from"@aws-sdk/client-s3";async function OB(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(Of),0;if(r==="init"){let n=ff();return e.stdout.write(`${n.device_id}
2286
- `),0}if(r==="id"){let n=Xr();return n===null?(e.stderr.write(`error: no device id initialized at ${Ka()}; run 'lmctl device init'
2292
+ `),0}if(r==="id"){let n=Xr();return n===null?(e.stderr.write(`error: no device id initialized at ${Va()}; run 'lmctl device init'
2287
2293
  `),1):(e.stdout.write(`${n.device_id}
2288
2294
  `),0)}return r==="login"?await CB(t.slice(1),e):r==="prompt"?await DB(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
2289
2295
  `),1)}async function CB(t,e){let r=MB(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2290
2296
  ${Of}`),2;let n=Qs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2291
- `),1;ET({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await Fa({region:n.config.region,clientId:n.config.cognitoClientId??Ga,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}
2297
+ `),1;ET({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await Ua({region:n.config.region,clientId:n.config.cognitoClientId??Ka,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}
2292
2298
  `),1}let a=Ys(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
2293
2299
  `),1;zd({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Xr()??ff();return e.stdout.write(`logged in as ${r.userId}
2294
2300
  device id: ${l.device_id}
@@ -2297,7 +2303,7 @@ access key stored at ${zs()}
2297
2303
  `),0}function MB(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 DB(t,e){let r=PB(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2298
2304
  ${Of}`),2;let n=Qs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2299
2305
  `),1;let s=UB();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 FB({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=AB({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Xr()?.device_id,u=Ys(o)??void 0,d=new Jr({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 jB({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:$B,GetObjectCommand:RB,PutObjectCommand:LB},selfRole:"browser",onMessage:async()=>{}}),f=cT({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:lT,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
2300
- `),0}function PB(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 FB(t){let r=await new NB({region:t.region}).send(new xB({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 UB(t=process.env.LMCTL_TOKEN_PATH??IB(kB(),".lmctl","cli-tokens.json")){try{return JSON.parse(vB(t,"utf8"))}catch{return null}}var Of,DS=E(()=>{"use strict";mf();af();Sa();Gd();Kd();Zd();Vd();Of=`usage: lmctl device <id|init|login|prompt>
2306
+ `),0}function PB(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 FB(t){let r=await new NB({region:t.region}).send(new xB({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 UB(t=process.env.LMCTL_TOKEN_PATH??IB(kB(),".lmctl","cli-tokens.json")){try{return JSON.parse(vB(t,"utf8"))}catch{return null}}var Of,DS=E(()=>{"use strict";mf();af();va();Gd();Kd();Zd();Vd();Of=`usage: lmctl device <id|init|login|prompt>
2301
2307
  lmctl device login --user-id <sub> --access-key <refreshToken>
2302
2308
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
2303
2309
 
@@ -2315,14 +2321,14 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2315
2321
  `:""}`),0}function GB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(C(n,"--json"))U(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
2316
2322
  `);for(let a of i)e.stdout.write(`- ${a.alias} ${Ae(a)} ${a.sessionid??"(unseeded)"}
2317
2323
  `)}return 0}function KB(t,e,r){let n=D(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=A(n,"--alias"),a=A(n,"--provider");if(i===void 0||a===void 0)return y(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:A(n,"--model")??null,role:A(n,"--role")??"agent",sessiondir:A(n,"--sessiondir")??WB(xr(),"sessions",o.name,i)});return C(n,"--json")?U(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
2318
- `),0}async function PS(t,e,r,n){let s=D(t,["--alias"]);if(s.error!==void 0)return y(e,s.error);let[o]=s.positionals;if(o===void 0)return y(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return y(e,`team not found: ${o}`);let a=A(s,"--alias");if(n&&a===void 0)return y(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=VB(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return y(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=cw(f.workflow_name,m.definition);if(p.status==="FAIL")return y(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))yi(f,r),Ei(f);let u=[],d=!1;for(let f of l){let m=await un({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
2324
+ `),0}async function PS(t,e,r,n){let s=D(t,["--alias"]);if(s.error!==void 0)return y(e,s.error);let[o]=s.positionals;if(o===void 0)return y(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return y(e,`team not found: ${o}`);let a=A(s,"--alias");if(n&&a===void 0)return y(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=VB(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return y(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=cw(f.workflow_name,m.definition);if(p.status==="FAIL")return y(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))wi(f,r),Ti(f);let u=[],d=!1;for(let f of l){let m=await un({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
2319
2325
 
2320
2326
  ${pn}`:pn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=hn(Ae(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
2321
2327
  ${_}
2322
- `);try{await Ci({dal:r,member:p,stderr:e.stderr})}catch(S){d=!0,e.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
2328
+ `);try{await Mi({dal:r,member:p,stderr:e.stderr})}catch(S){d=!0,e.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
2323
2329
  `)}}}return C(s,"--json")?U(e,u):e.stdout.write(`seeded ${u.length} member(s)
2324
2330
  `),d?1:0}function VB(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function YB(t,e,r){let n=D(t,["--interpreter","--of"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=A(n,"--interpreter"),a=A(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return y(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return y(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return y(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
2325
- `),0}var BB,US=E(()=>{"use strict";Ke();ei();ks();ru();We();Ur();gu();ma();pe();nu();BB=`usage: lmctl team create <name>
2331
+ `),0}var BB,US=E(()=>{"use strict";Ke();ti();ks();ru();We();Ur();gu();pa();pe();nu();BB=`usage: lmctl team create <name>
2326
2332
  lmctl team list [--json]
2327
2333
  lmctl team show <name> [--json]
2328
2334
  lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
@@ -2333,20 +2339,20 @@ ${pn}`:pn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=hn(Ae(p),m.sessionid
2333
2339
 
2334
2340
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2335
2341
  refresh to create/update native provider sessions for team members.
2336
- `});var GS={};ne(GS,{applyMaxBytes:()=>al,renderMessage:()=>JS,runTail:()=>t2});async function t2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${e2}
2337
- `),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--lines"),s=A(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?ZB:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return y(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=C(r,"--watch"),a=A(r,"--watch-interval"),l=a===void 0?QB:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return y(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=A(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return y(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await R(e,async p=>r2(e,p,m,o,i,l))}catch(p){return _e(e,p)}}let u=vr(zB,{target:r.positionals[0],alias:r.positionals[1],flags:{session:A(r,"--session"),provider:A(r,"--provider")}});if(u.mode==="error")return y(e,u.message);if(u.mode==="managed")return y(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await R(e,g=>we(u.teamfile,g))}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Fe(m)}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=$t(p);if(h===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await R(e,_=>Xe(u.teamfile,h.alias,_));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof be?y(e,g.message):_e(e,g)}}else try{let m=await R(e,p=>Xe(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof be?y(e,m.message):_e(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await bi(m);if(h.length===0)return y(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return y(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await WS(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await WS(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2342
+ `});var GS={};ne(GS,{applyMaxBytes:()=>ll,renderMessage:()=>JS,runTail:()=>t2});async function t2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${e2}
2343
+ `),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--lines"),s=A(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?ZB:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return y(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=C(r,"--watch"),a=A(r,"--watch-interval"),l=a===void 0?QB:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return y(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=A(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return y(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await R(e,async p=>r2(e,p,m,o,i,l))}catch(p){return _e(e,p)}}let u=vr(zB,{target:r.positionals[0],alias:r.positionals[1],flags:{session:A(r,"--session"),provider:A(r,"--provider")}});if(u.mode==="error")return y(e,u.message);if(u.mode==="managed")return y(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await R(e,g=>we(u.teamfile,g))}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Fe(m)}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=$t(p);if(h===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await R(e,_=>Xe(u.teamfile,h.alias,_));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof be?y(e,g.message):_e(e,g)}}else try{let m=await R(e,p=>Xe(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof be?y(e,m.message):_e(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await Si(m);if(h.length===0)return y(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return y(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await WS(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await WS(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2338
2344
  `)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function WS(t,e,r,n,s){let o;try{o=await Gt(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
2339
2345
  `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
2340
2346
  `),-1;let i=o.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,i.length-n.lines):s+1;if(a>=i.length)return i.length-1;let l="";for(let c=a;c<i.length;c+=1)l+=`${JS(i[c])}
2341
- `;return t.stdout.write(n.kind==="bytes"?al(l,n.maxBytes):l),i.length-1}function JS(t){let e=XS(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
2347
+ `;return t.stdout.write(n.kind==="bytes"?ll(l,n.maxBytes):l),i.length-1}function JS(t){let e=XS(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
2342
2348
  `).replace(/\r/g,`
2343
2349
  `).split(`
2344
2350
  `),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
2345
2351
  ${i.map(a=>` ${a}`).join(`
2346
2352
  `)}`}async function r2(t,e,r,n,s,o){if(e.getRun(r)===null)return y(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(d=>`${qS(d)}
2347
- `).join("");t.stdout.write(n.kind==="bytes"?al(c,n.maxBytes):c);let u=a.length>0?a[a.length-1].id:0;return s?await new Promise(d=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,u),g="";for(let _ of h)g+=`${qS(_)}
2348
- `,u=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?al(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2349
- `)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function al(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(BS,"utf8");if(n>=e)return HS(t,e);let s=e-n,o=HS(t,s);return`${BS}${o}`}function HS(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 qS(t){let e=XS(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 XS(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 zB,ZB,QB,e2,BS,KS=E(()=>{"use strict";Ur();pe();Lt();er();wt();zB={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},ZB=4096,QB=2,e2=`usage: lmctl tail [target] [alias]
2353
+ `).join("");t.stdout.write(n.kind==="bytes"?ll(c,n.maxBytes):c);let u=a.length>0?a[a.length-1].id:0;return s?await new Promise(d=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,u),g="";for(let _ of h)g+=`${qS(_)}
2354
+ `,u=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?ll(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2355
+ `)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function ll(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(BS,"utf8");if(n>=e)return HS(t,e);let s=e-n,o=HS(t,s);return`${BS}${o}`}function HS(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 qS(t){let e=XS(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 XS(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 zB,ZB,QB,e2,BS,KS=E(()=>{"use strict";Ur();pe();Lt();er();wt();zB={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},ZB=4096,QB=2,e2=`usage: lmctl tail [target] [alias]
2350
2356
  lmctl tail --session <id> [--provider <name>]
2351
2357
  lmctl tail --run <id>
2352
2358
  [--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
@@ -2354,7 +2360,7 @@ ${i.map(a=>` ${a}`).join(`
2354
2360
  Print or watch provider session messages, or follow a managed run timeline.
2355
2361
  --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;BS=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2356
2362
  `});var tv={};ne(tv,{runInfo:()=>a2});import{execFileSync as Cf}from"node:child_process";import{dirname as YS,resolve as n2}from"node:path";function i2(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function a2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${o2}
2357
- `),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=C(r,"--json"),s=A(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return y(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await R(e,async u=>c2(e,u,c,n))}catch(u){return _e(e,u)}}let o=vr(s2,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:A(r,"--provider")}});if(o.mode==="error")return y(e,o.message);if(o.mode==="managed")return y(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await R(e,u=>we(o.teamfile,u))}catch(u){return y(e,`health: ${u instanceof Error?u.message:String(u)}`)}return u2(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await R(e,u=>Xe(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof be?y(e,c.message):_e(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await bi(a);if(c.length===0)return y(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return y(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return l2(e,i,a,l,n)}async function l2(t,e,r,n,s){let o;try{o=await Gt(r,e)}catch(l){return y(t,`health: failed to load session: ${l instanceof Error?l.message:String(l)}`)}if(o===null)return y(t,`health: session not found: ${r} (provider=${e})`);let i=ro(o.messages),a={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(U(t,a),0):(t.stdout.write(`Session: ${o.sessionId}
2363
+ `),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=C(r,"--json"),s=A(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return y(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await R(e,async u=>c2(e,u,c,n))}catch(u){return _e(e,u)}}let o=vr(s2,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:A(r,"--provider")}});if(o.mode==="error")return y(e,o.message);if(o.mode==="managed")return y(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await R(e,u=>we(o.teamfile,u))}catch(u){return y(e,`health: ${u instanceof Error?u.message:String(u)}`)}return u2(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await R(e,u=>Xe(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof be?y(e,c.message):_e(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await Si(a);if(c.length===0)return y(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return y(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return l2(e,i,a,l,n)}async function l2(t,e,r,n,s){let o;try{o=await Gt(r,e)}catch(l){return y(t,`health: failed to load session: ${l instanceof Error?l.message:String(l)}`)}if(o===null)return y(t,`health: session not found: ${r} (provider=${e})`);let i=ro(o.messages),a={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(U(t,a),0):(t.stdout.write(`Session: ${o.sessionId}
2358
2364
  `),t.stdout.write(` Provider: ${o.provider}
2359
2365
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
2360
2366
  `),t.stdout.write(` CWD: ${o.cwd}
@@ -2405,13 +2411,13 @@ Show provider session details, team rollups, or managed run state/token totals.`
2405
2411
  [--recursive] [--all] [--format table|teamfile|json] [--json]
2406
2412
  lmctl ls --runs [--limit N] [--format table|json] [--json]
2407
2413
 
2408
- List native provider sessions in scope, or list recent managed runs with --runs.`,E2=50,nv=500});import{existsSync as lo,readFileSync as iv}from"node:fs";import{homedir as k2}from"node:os";import{dirname as av,resolve as Gn}from"node:path";import{fileURLToPath as I2}from"node:url";function Ff(t,e={}){let r=[],n=A2(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&o!=="lmplayer"&&o!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),o==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(o==="lmplayer")continue;if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=C2(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(cl??"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: ${D2(i)}`)}return r}function A2(t){if(!t&&ao)return ao;let e=new Map,r,n=t??R2();if(!lo(n))return r=`${n} not found`,t||Df(e),t||(ao=e),t||(cl=r),e;let s;try{s=iv(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Df(e),t||(ao=e),t||(cl=r),e}for(let[o,i]of Object.entries(N2)){let a=j2(s,i),l=O2(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Df(e),t||(ao=e),t||(cl=r),e}function R2(){return $2(av(I2(import.meta.url)))}function $2(t){let e=L2(t);if(e){let n=Gn(e,"durable-memory","model_selection.md");if(lo(n))return n}let r=[Gn(t,"..","..","durable-memory","model_selection.md"),Gn(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(lo(n))return n;return r[r.length-1]}function L2(t){let e=Gn(t);for(;;){if(lo(Gn(e,"package.json")))return e;let r=av(e);if(r===e)return null;e=r}}function Df(t){for(let[e,r]of Object.entries(x2))t.set(e,r)}function j2(t,e){let n=new RegExp(`^## ${P2(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 O2(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 C2(t){let e=t??Gn(k2(),".config","opencode","opencode.json");if(!lo(e))return{available:!0,models:[]};let r;try{r=JSON.parse(iv(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:M2(r)}}function M2(t){if(!Pf(t))return[];let e=ll(t.provider)??ll(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Pf(s))continue;let o=ll(s.models)??ll(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function ll(t){return Pf(t)?t:null}function Pf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function D2(t){return t.length>0?t.join(", "):"(none)"}function P2(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var N2,x2,ao,cl,lv=E(()=>{"use strict";N2={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},x2={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},ao=null});import{homedir as F2}from"node:os";import{basename as U2}from"node:path";function ul(t,e){let r=new Set;return{text:t.replace(B2,(s,o)=>{let i=o.trim(),a=W2[i];return a===void 0?(r.add(i),s):a(e)}),unknownNames:[...r].sort()}}function dl(t){return{workdir:t.workdir,teamfile:t.teamfile,date:H2(t.date)}}function H2(t){return t.toISOString().slice(0,10)}var W2,B2,Uf=E(()=>{"use strict";W2={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=U2(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>F2(),date:t=>t.date},B2=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var fo={};ne(fo,{GEMINI_PROVIDER_NOTICE:()=>fv,_setLintSessiondirFsOpsForTests:()=>z2,_setTeamfileSeedForTests:()=>Y2,buildRootTeamRegistrationRow:()=>gv,registerRootTeam:()=>yv,runHire:()=>oH,runLint:()=>sH,runRefresh:()=>iH,runSeed:()=>hv,sha256Text:()=>_v});import{createHash as q2}from"node:crypto";import{accessSync as J2,constants as cv,existsSync as X2,readFileSync as pl,realpathSync as Hf,statSync as G2,writeFileSync as ml}from"node:fs";import{dirname as zr,resolve as dv}from"node:path";function Y2(t){mv=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(kt(),Pc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function z2(t){Yr=t===null?qf:{...qf,...t}}function Z2(t,e){let r=zr(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=dv(i);if(n.has(a))continue;let l=Q2(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 Q2(t){try{if(Yr.existsSync(t)){if(!Yr.statSync(t).isDirectory())return"ENOTDIR";Yr.accessSync(t,cv.W_OK);return}let e=rH(t);if(e===void 0)return;if(!Yr.statSync(e).isDirectory())return"ENOTDIR";Yr.accessSync(e,cv.W_OK);return}catch(e){return nH(e)??"permission check failed"}}function eH(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||pv(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function tH(t,e,r,n){let s=!1;for(let o of t){if(o.teamfile!==void 0||o.sessiondir===void 0||!pv(o.sessiondir,n))continue;let i=r.get(o.alias.toLowerCase());if(i===void 0)continue;let a=wv(e[i],"sessiondir");a!==e[i]&&(e[i]=a,s=!0),o.sessiondir=void 0}return s}function pv(t,e){return uv(t)===uv(e)}function uv(t){let e=dv(t);try{return Hf(e)}catch{return e}}function rH(t){let e=t;for(;;){try{if(Yr.existsSync(e))return e}catch{return}let r=zr(e);if(r===e)return;e=r}}function nH(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 sH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(K2),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2409
- `),2;let r=t[0],n;try{n=await R(e,c=>we(r,c))}catch(c){return je(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(n)}catch(c){return je(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let o=rf(s,zr(n)),i=Ff(s.members),a=pl(n,"utf8"),l=ul(a,dl({workdir:zr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&i.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),i.push(...tc(s.members,zr(n))),i.push(...Z2(s.members,n)),i.push(...eH(s.members,zr(n)));for(let c of o)e.stderr.write(`error: ${c.field}: ${c.message}
2414
+ List native provider sessions in scope, or list recent managed runs with --runs.`,E2=50,nv=500});import{existsSync as lo,readFileSync as iv}from"node:fs";import{homedir as k2}from"node:os";import{dirname as av,resolve as Gn}from"node:path";import{fileURLToPath as I2}from"node:url";function Ff(t,e={}){let r=[],n=A2(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&o!=="lmplayer"&&o!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),o==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(o==="lmplayer")continue;if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=C2(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(ul??"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: ${D2(i)}`)}return r}function A2(t){if(!t&&ao)return ao;let e=new Map,r,n=t??R2();if(!lo(n))return r=`${n} not found`,t||Df(e),t||(ao=e),t||(ul=r),e;let s;try{s=iv(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Df(e),t||(ao=e),t||(ul=r),e}for(let[o,i]of Object.entries(N2)){let a=j2(s,i),l=O2(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Df(e),t||(ao=e),t||(ul=r),e}function R2(){return $2(av(I2(import.meta.url)))}function $2(t){let e=L2(t);if(e){let n=Gn(e,"durable-memory","model_selection.md");if(lo(n))return n}let r=[Gn(t,"..","..","durable-memory","model_selection.md"),Gn(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(lo(n))return n;return r[r.length-1]}function L2(t){let e=Gn(t);for(;;){if(lo(Gn(e,"package.json")))return e;let r=av(e);if(r===e)return null;e=r}}function Df(t){for(let[e,r]of Object.entries(x2))t.set(e,r)}function j2(t,e){let n=new RegExp(`^## ${P2(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 O2(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 C2(t){let e=t??Gn(k2(),".config","opencode","opencode.json");if(!lo(e))return{available:!0,models:[]};let r;try{r=JSON.parse(iv(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:M2(r)}}function M2(t){if(!Pf(t))return[];let e=cl(t.provider)??cl(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Pf(s))continue;let o=cl(s.models)??cl(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function cl(t){return Pf(t)?t:null}function Pf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function D2(t){return t.length>0?t.join(", "):"(none)"}function P2(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var N2,x2,ao,ul,lv=E(()=>{"use strict";N2={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},x2={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},ao=null});import{homedir as F2}from"node:os";import{basename as U2}from"node:path";function dl(t,e){let r=new Set;return{text:t.replace(B2,(s,o)=>{let i=o.trim(),a=W2[i];return a===void 0?(r.add(i),s):a(e)}),unknownNames:[...r].sort()}}function fl(t){return{workdir:t.workdir,teamfile:t.teamfile,date:H2(t.date)}}function H2(t){return t.toISOString().slice(0,10)}var W2,B2,Uf=E(()=>{"use strict";W2={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=U2(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>F2(),date:t=>t.date},B2=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var fo={};ne(fo,{GEMINI_PROVIDER_NOTICE:()=>fv,_setLintSessiondirFsOpsForTests:()=>z2,_setTeamfileSeedForTests:()=>Y2,buildRootTeamRegistrationRow:()=>gv,registerRootTeam:()=>yv,runHire:()=>oH,runLint:()=>sH,runRefresh:()=>iH,runSeed:()=>hv,sha256Text:()=>_v});import{createHash as q2}from"node:crypto";import{accessSync as J2,constants as cv,existsSync as X2,readFileSync as hl,realpathSync as Hf,statSync as G2,writeFileSync as pl}from"node:fs";import{dirname as zr,resolve as dv}from"node:path";function Y2(t){mv=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(kt(),Pc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function z2(t){Yr=t===null?qf:{...qf,...t}}function Z2(t,e){let r=zr(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=dv(i);if(n.has(a))continue;let l=Q2(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 Q2(t){try{if(Yr.existsSync(t)){if(!Yr.statSync(t).isDirectory())return"ENOTDIR";Yr.accessSync(t,cv.W_OK);return}let e=rH(t);if(e===void 0)return;if(!Yr.statSync(e).isDirectory())return"ENOTDIR";Yr.accessSync(e,cv.W_OK);return}catch(e){return nH(e)??"permission check failed"}}function eH(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||pv(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function tH(t,e,r,n){let s=!1;for(let o of t){if(o.teamfile!==void 0||o.sessiondir===void 0||!pv(o.sessiondir,n))continue;let i=r.get(o.alias.toLowerCase());if(i===void 0)continue;let a=wv(e[i],"sessiondir");a!==e[i]&&(e[i]=a,s=!0),o.sessiondir=void 0}return s}function pv(t,e){return uv(t)===uv(e)}function uv(t){let e=dv(t);try{return Hf(e)}catch{return e}}function rH(t){let e=t;for(;;){try{if(Yr.existsSync(e))return e}catch{return}let r=zr(e);if(r===e)return;e=r}}function nH(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 sH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(K2),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2415
+ `),2;let r=t[0],n;try{n=await R(e,c=>we(r,c))}catch(c){return je(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(n)}catch(c){return je(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let o=rf(s,zr(n)),i=Ff(s.members),a=hl(n,"utf8"),l=dl(a,fl({workdir:zr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&i.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),i.push(...tc(s.members,zr(n))),i.push(...Z2(s.members,n)),i.push(...eH(s.members,zr(n)));for(let c of o)e.stderr.write(`error: ${c.field}: ${c.message}
2410
2416
  `);for(let c of s.members)Xf([c],e),c.session!==void 0&&c.session.length<co&&i.push(`${c.alias}: sessionid is shorter than ${co} chars; run lmctl seed to refresh it`);for(let c of i)e.stderr.write(`warning: ${c}
2411
2417
  `);return await R(e,c=>{_b(n,c,u=>e.stderr.write(`${u}
2412
2418
  `))}),o.length>0?1:(e.stdout.write(`ok
2413
2419
  `),0)}async function hv(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(V2),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2414
- `),2;let r=t[0],n;try{n=await R(e,_=>we(r,_))}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Hf(n)}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let o=zr(n),i;try{i=Fe(n)}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=pl(n,"utf8").split(`
2420
+ `),2;let r=t[0],n;try{n=await R(e,_=>we(r,_))}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Hf(n)}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let o=zr(n),i;try{i=Fe(n)}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=hl(n,"utf8").split(`
2415
2421
  `),c=cH(l),u=tH(i.members,l,c,o),d=rf(i,o);if(d.length>0){Xf(i.members,e);for(let _ of d)e.stderr.write(`error: ${_.field}: ${_.message}
2416
2422
  `);return 1}try{En(e,i,n)}catch{}Xf(i.members,e);for(let _ of Ff(i.members))e.stderr.write(`warning: ${_}
2417
2423
  `);for(let _ of tc(i.members,o))e.stderr.write(`warning: ${_}
@@ -2420,14 +2426,14 @@ List native provider sessions in scope, or list recent managed runs with --runs.
2420
2426
  `);continue}let S=_.sessiondir??o,w=await mv({provider:_.provider,cwd:S,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.alias.toLowerCase()==="lead"?{prompt:aH(n,l.join(`
2421
2427
  `),i.members)}:{}});if(w.error!==void 0||w.sessionId===void 0||w.sessionId.length<co){let k=`provider did not report a sessionid; no new session was found for ${S} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${_.alias}: seed failed${w.error!==void 0?`: ${w.error}`:`; ${k}`}
2422
2428
  `),1}let b=c.get(_.alias.toLowerCase());if(b===void 0)return e.stderr.write(`error: ${_.alias}: could not find matching _MEMBER_ line to update
2423
- `),1;let x=mH(l[b],"sessionid",w.sessionId);l[b]=x,f+=1,ml(n,l.join(`
2429
+ `),1;let x=mH(l[b],"sessionid",w.sessionId);l[b]=x,f+=1,pl(n,l.join(`
2424
2430
  `),"utf8"),e.stdout.write(`${_.alias}: seeded ${w.sessionId}
2425
2431
  `)}let p=l.join(`
2426
- `),h=hH(p,Hf(n));(h!==p||u)&&ml(n,h,"utf8"),f===0&&e.stdout.write(`no members needed seeding
2427
- `);let g=new Date().toISOString();return await R(e,_=>{yv(_,{teamfilePath:s,name:i.name,rawText:h,now:g})}),0}async function oH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(fl),0;let r=D(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Bf(e,r.error,fl);if(r.positionals.length!==2)return Bf(e,"expected <teamfile.lmctl> and <alias>",fl);let[n,s]=r.positionals;if(!fH(s))return je(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return je(e,"hire only applies to non-Lead members");let o=A(r,"--provider");if(o===void 0)return Bf(e,"missing value for --provider",fl);if(!Ev(o))return je(e,`invalid provider "${o}"`);let i;try{i=await R(e,d=>we(n,d))}catch(d){return je(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=pl(i,"utf8")}catch(d){return je(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(dH(a,s))return je(e,`${s}: alias already exists in ${i}`);let l=A(r,"--sessiondir"),c=[`_MEMBER_ alias=${Jf(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Jf(l)}`]].join(" "),u=pH(a,c);return ml(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
2432
+ `),h=hH(p,Hf(n));(h!==p||u)&&pl(n,h,"utf8"),f===0&&e.stdout.write(`no members needed seeding
2433
+ `);let g=new Date().toISOString();return await R(e,_=>{yv(_,{teamfilePath:s,name:i.name,rawText:h,now:g})}),0}async function oH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ml),0;let r=D(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Bf(e,r.error,ml);if(r.positionals.length!==2)return Bf(e,"expected <teamfile.lmctl> and <alias>",ml);let[n,s]=r.positionals;if(!fH(s))return je(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return je(e,"hire only applies to non-Lead members");let o=A(r,"--provider");if(o===void 0)return Bf(e,"missing value for --provider",ml);if(!Ev(o))return je(e,`invalid provider "${o}"`);let i;try{i=await R(e,d=>we(n,d))}catch(d){return je(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=hl(i,"utf8")}catch(d){return je(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(dH(a,s))return je(e,`${s}: alias already exists in ${i}`);let l=A(r,"--sessiondir"),c=[`_MEMBER_ alias=${Jf(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Jf(l)}`]].join(" "),u=pH(a,c);return pl(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
2428
2434
  `),e.stdout.write(`Run: lmctl seed ${i}
2429
- `),0}async function iH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Wf),0;let r,n;if(t.length===1){let d=Gr(t[0]);if(d===null)return e.stderr.write(Wf),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Wf),2;let s;try{s=await R(e,d=>we(r,d))}catch(d){return je(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let o;try{o=pl(s,"utf8")}catch(d){return je(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
2430
- `),a=uH(i,n);if(a===void 0)return je(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(uo(l,"teamfile")!==void 0)return je(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[fs],u=uo(l,"sessionid");return c!==void 0&&c.length>0&&u===c?je(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=wv(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),ml(s,i.join(`
2435
+ `),0}async function iH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Wf),0;let r,n;if(t.length===1){let d=Gr(t[0]);if(d===null)return e.stderr.write(Wf),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Wf),2;let s;try{s=await R(e,d=>we(r,d))}catch(d){return je(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let o;try{o=hl(s,"utf8")}catch(d){return je(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
2436
+ `),a=uH(i,n);if(a===void 0)return je(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(uo(l,"teamfile")!==void 0)return je(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[fs],u=uo(l,"sessionid");return c!==void 0&&c.length>0&&u===c?je(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=wv(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),pl(s,i.join(`
2431
2437
  `),"utf8"),hv([s],e))}function _v(t){return q2("sha256").update(t).digest("hex")}function gv(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:_v(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function yv(t,e){let r=gv(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function aH(t,e,r){let n=r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=n.length>0?n.join(`
2432
2438
  `):"- (no non-Lead members)",o=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",i=lH(o,t);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${t}" <alias> "your task here"`,"- MCP lmctl_chat is synchronous/blocking; use it only as a quick-ping or backup path.",'- Plain shell "&" alone is blind backgrounding. Use lmctl-tracked commands, then wait.',`- For non-blocking member work: run the blocking lmctl chat command in the background, then run lmctl wait. Example: lmctl chat "${t}" <alias> "your task here" & lmctl wait`,"- For arbitrary shell work: lmctl exec -- <command> & lmctl wait",i,"","Delegation is an ACTION, not a plan: to hand a member a task, run the command or call the tool.","If you use lmctl_chat and it appears only after tool search, call it in the SAME turn and do not stop after discovering it or say you're about to call it.","","Team members:",s,"","Example MCP calls:",...r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>`lmctl_chat(team="${t}", alias="${a.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${t}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${t}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, prefer tracked CLI commands plus lmctl wait; lmctl_chat is the synchronous backup.)","","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
2433
2439
  `)}function lH(t,e){let r=`lmctl chat "${e}" <alias> "your task here"`;switch(t.toLowerCase()){case"claude":return`- Claude tip: run the blocking command (${r}) as background Bash (run_in_background: true); the runtime re-invokes you with the reply when it completes.`;case"copilot":return`- Copilot tip: run the blocking command (${r}) via bash async mode (mode:"async"); the runtime notifies you with output when it completes.`;case"agy":return`- Antigravity tip: run the blocking command (${r}) via run_command with WaitMsBeforeAsync: 0 (Background Tasks); agy wakes you with the output when it completes.`;case"qwen":return`- Qwen tip: run the blocking command (${r}) via the monitor tool; it notifies you on completion.`;case"codex":return"- Codex note: no native completion push; for long work, background tracked lmctl chat or lmctl exec, then run lmctl wait.";case"gemini":return"- Gemini note: no native completion push; for long work, background tracked lmctl chat or lmctl exec, then run lmctl wait.";case"opencode":return"- OpenCode note: use the provider-native background/task surface when available; otherwise run one blocking lmctl chat turn and wait.";default:return"- If your provider has native background-shell completion, use it around the blocking command; otherwise background the tracked command and run lmctl wait."}}function cH(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=uo(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function uH(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)&&uo(s,"alias")?.toLowerCase()===r)return n}}function dH(t,e){for(let r of t.split(`
@@ -2448,14 +2454,14 @@ ${t}`:`${r}
2448
2454
  `),1}function Bf(t,e,r){return t.stderr.write(`error: ${e}
2449
2455
  ${r}`),2}function Xf(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
2450
2456
  `),r.provider==="gemini"&&e.stderr.write(`${fv.replace("%s",r.alias)}
2451
- `)}var co,K2,V2,fl,Wf,fv,qf,mv,Yr,mo=E(()=>{"use strict";er();lv();Do();ct();pe();wt();Lt();wt();Uf();Rs();co=5,K2=`usage: lmctl lint <teamfile.lmctl>
2457
+ `)}var co,K2,V2,ml,Wf,fv,qf,mv,Yr,mo=E(()=>{"use strict";er();lv();Po();ct();pe();wt();Lt();wt();Uf();Rs();co=5,K2=`usage: lmctl lint <teamfile.lmctl>
2452
2458
 
2453
2459
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2454
2460
  `,V2=`usage: lmctl seed <teamfile.lmctl>
2455
2461
 
2456
2462
  Seed missing or placeholder session ids in an lmctl teamfile by calling each
2457
2463
  member's configured native provider.
2458
- `,fl=`usage: lmctl hire <teamfile.lmctl> <alias> --provider <name> [--sessiondir <dir>]
2464
+ `,ml=`usage: lmctl hire <teamfile.lmctl> <alias> --provider <name> [--sessiondir <dir>]
2459
2465
 
2460
2466
  Append an unseeded non-Lead _MEMBER_ line to an lmctl teamfile. Run lmctl seed
2461
2467
  after editing to create the provider session.
@@ -2489,7 +2495,7 @@ Examples:
2489
2495
  `),e.stderr.write(`usage: lmctl plan [options] <directory>
2490
2496
  `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
2491
2497
  `),2;let n=LH(r.positionals[0]);AH(n,{recursive:!0});let s=A(r,"--team")??Nv(n),o=A(r,"--provider")??"claude",i=$H(n,CH(s));if(xH(i))return e.stderr.write(`error: ${i} already exists.
2492
- `),1;let a=DH({teamName:MH(s),leadProvider:o}),l=ul(a,dl({workdir:n,teamfile:i,date:new Date}));return RH(i,l.text,"utf8"),e.stdout.write(`Created ${i}
2498
+ `),1;let a=DH({teamName:MH(s),leadProvider:o}),l=dl(a,fl({workdir:n,teamfile:i,date:new Date}));return RH(i,l.text,"utf8"),e.stdout.write(`Created ${i}
2493
2499
  `),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
2494
2500
  `),e.stdout.write(`After editing, run: lmctl lint ${i}
2495
2501
  `),e.stdout.write(`Then run: lmctl seed ${i}
@@ -2520,7 +2526,7 @@ Examples:
2520
2526
 
2521
2527
  # Same shape, codex for the Lead and Reviewer2
2522
2528
  lmctl plan ./backend --provider codex
2523
- `});var jv={};ne(jv,{SIZE_WARN_EST_TOKENS:()=>po,estimateTokens:()=>Lv,runTerminal:()=>WH});import{spawn as PH}from"node:child_process";import{statSync as FH}from"node:fs";async function WH(t,e){if(t.includes("--help")||t.includes("-h"))return XH(e);let r=D(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return y(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?C(r,i):A(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await R(e,async i=>{let a=A(r,"--alias"),l=cE(i,s,a);return"err"in l?y(e,l.err):Kf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return _e(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?C(r,l):A(r,l)!==void 0)return y(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=vr(UH,{target:o,alias:i,flags:{}});return a.mode==="error"?y(e,a.message):a.mode!=="ai-team"?y(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?y(e,"terminal: alias required for the teamfile target"):await R(e,l=>BH(e,a.teamfile,a.alias,l))}try{return await R(e,async s=>{let o=HH(e,s,r);if(typeof o=="number")return o;let i=A(r,"--alias");return C(r,"--size")?JH(e,s,o,i,C(r,"--json")):qH(e,s,o,i)})}catch(s){return _e(e,s)}}async function BH(t,e,r,n){let s;try{s=Xe(e,r,n)}catch(l){return l instanceof be?y(t,l.message):_e(t,l)}let o=Sr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:kr()});if(!o.acquired)return y(t,`${s.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at}`);let i=$b({teamfile:s.teamfile,alias:s.alias}),a=null;try{n.setTerminalLock(i),a=setInterval(()=>{try{!n.heartbeatTerminalLock(i.teamfile,i.alias,i.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Lb()),a.unref?.();try{En(t,Fe(s.teamfile),s.teamfile)}catch{}return await Kf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}finally{a!==null&&clearInterval(a),n.clearTerminalLock(i.teamfile,i.alias,i.lock_id),n.releaseAgentInflight(o.lease)}}async function Kf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Ti(r))return y(t,`no resume incantation for provider "${r}"`);if(!m_.test(n))return y(t,"refusing to resume: malformed sessionid");let o=iu(r,n,{isLead:e.isLead});if(o===null||o.length===0)return y(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=PH(i,a,{stdio:"inherit",cwd:s,env:He(process.env,s,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function HH(t,e,r){let n=A(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?y(t,`team not found: ${n}`):i}let s=Mi(t,e,A(r,"--project"));return typeof s=="number"?s:Di(t,e,s,void 0)}async function qH(t,e,r,n){let s=Pi(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?y(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Kf(t,{provider:Ae(s),sessionid:o,sessiondir:s.sessiondir})}function Lv(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=FH(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 JH(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return y(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=Ae(a),u=null;Ti(c)&&(u=await Gt(l,c));let d=Lv(u),f=d.est>po;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?hn(c,l):null})}if(s)return U(t,{estimate:!0,legend:$v,guide_tokens:po,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2529
+ `});var jv={};ne(jv,{SIZE_WARN_EST_TOKENS:()=>po,estimateTokens:()=>Lv,runTerminal:()=>WH});import{spawn as PH}from"node:child_process";import{statSync as FH}from"node:fs";async function WH(t,e){if(t.includes("--help")||t.includes("-h"))return XH(e);let r=D(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return y(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?C(r,i):A(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await R(e,async i=>{let a=A(r,"--alias"),l=cE(i,s,a);return"err"in l?y(e,l.err):Kf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return _e(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?C(r,l):A(r,l)!==void 0)return y(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=vr(UH,{target:o,alias:i,flags:{}});return a.mode==="error"?y(e,a.message):a.mode!=="ai-team"?y(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?y(e,"terminal: alias required for the teamfile target"):await R(e,l=>BH(e,a.teamfile,a.alias,l))}try{return await R(e,async s=>{let o=HH(e,s,r);if(typeof o=="number")return o;let i=A(r,"--alias");return C(r,"--size")?JH(e,s,o,i,C(r,"--json")):qH(e,s,o,i)})}catch(s){return _e(e,s)}}async function BH(t,e,r,n){let s;try{s=Xe(e,r,n)}catch(l){return l instanceof be?y(t,l.message):_e(t,l)}let o=Sr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:kr()});if(!o.acquired)return y(t,`${s.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at}`);let i=$b({teamfile:s.teamfile,alias:s.alias}),a=null;try{n.setTerminalLock(i),a=setInterval(()=>{try{!n.heartbeatTerminalLock(i.teamfile,i.alias,i.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Lb()),a.unref?.();try{En(t,Fe(s.teamfile),s.teamfile)}catch{}return await Kf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}finally{a!==null&&clearInterval(a),n.clearTerminalLock(i.teamfile,i.alias,i.lock_id),n.releaseAgentInflight(o.lease)}}async function Kf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!bi(r))return y(t,`no resume incantation for provider "${r}"`);if(!m_.test(n))return y(t,"refusing to resume: malformed sessionid");let o=iu(r,n,{isLead:e.isLead});if(o===null||o.length===0)return y(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=PH(i,a,{stdio:"inherit",cwd:s,env:He(process.env,s,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function HH(t,e,r){let n=A(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?y(t,`team not found: ${n}`):i}let s=Di(t,e,A(r,"--project"));return typeof s=="number"?s:Pi(t,e,s,void 0)}async function qH(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?y(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Kf(t,{provider:Ae(s),sessionid:o,sessiondir:s.sessiondir})}function Lv(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=FH(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 JH(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return y(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=Ae(a),u=null;bi(c)&&(u=await Gt(l,c));let d=Lv(u),f=d.est>po;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?hn(c,l):null})}if(s)return U(t,{estimate:!0,legend:$v,guide_tokens:po,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2524
2530
  `),t.stdout.write(`${$v}
2525
2531
  `);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)
2526
2532
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2559,14 +2565,14 @@ Examples:
2559
2565
  tokens it surfaces the resume incantation so YOU can
2560
2566
  open & self-compact. Nothing is ever changed
2561
2567
  automatically; ${po} is a guide, not a gate.
2562
- `),0}var UH,po,$v,Ov=E(()=>{"use strict";We();Ur();pe();Eu();Lt();er();ct();Rs();Wn();Za();yf();Ra();UH={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},po=2e5,$v="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as Vf,dirname as Pv}from"node:path";function Yf(t,e){let r=Vf(t);for(;;){let n=GH(e,r);if(n!==null)return n;let s=Pv(r);if(s===r)return null;r=s}}function GH(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function hl(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function _l(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function zf(t){if(t.io.dal!==void 0){let o=Cv(t.io.dal,t.cwd,t.projectName);if(o===null)throw new it(Mv(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(hl()||_l()){let o=le(),i=ge({path:o}),a=Cv(i,t.cwd,t.projectName);if(a===null)throw i.close(),new it(Mv(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:_l()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:hl()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?Uv(t.cwd):KH(t.projectName),r=Wv(e,t.projectName===void 0?"cwd":"project"),n=ge({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new it(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function Fv(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(hl()||_l()){let n=le();return{dal:ge({path:n}),ownsDal:!0,dbPath:n,workspaceName:_l()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:hl()?"explicit-db":"explicit-workspace"}}let e;try{e=Uv(t.cwd)}catch{throw new it("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=Wv(e,"job-cwd");return{dal:ge({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function Cv(t,e,r){return r!==void 0?t.findProjectByName(r):Yf(e,t)}function Mv(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 KH(t){let e=[];for(let r of vl())for(let n of Bv(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new it(`project not found in any workspace DB: ${t}`);return e}function Uv(t){let e=VH(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of vl())for(let o of Bv(s)){let i=Vf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new it("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function Wv(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new it(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2568
+ `),0}var UH,po,$v,Ov=E(()=>{"use strict";We();Ur();pe();Eu();Lt();er();ct();Rs();Wn();Qa();yf();$a();UH={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},po=2e5,$v="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as Vf,dirname as Pv}from"node:path";function Yf(t,e){let r=Vf(t);for(;;){let n=GH(e,r);if(n!==null)return n;let s=Pv(r);if(s===r)return null;r=s}}function GH(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function _l(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function gl(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function zf(t){if(t.io.dal!==void 0){let o=Cv(t.io.dal,t.cwd,t.projectName);if(o===null)throw new it(Mv(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(_l()||gl()){let o=le(),i=ge({path:o}),a=Cv(i,t.cwd,t.projectName);if(a===null)throw i.close(),new it(Mv(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:gl()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:_l()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?Uv(t.cwd):KH(t.projectName),r=Wv(e,t.projectName===void 0?"cwd":"project"),n=ge({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new it(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function Fv(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(_l()||gl()){let n=le();return{dal:ge({path:n}),ownsDal:!0,dbPath:n,workspaceName:gl()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:_l()?"explicit-db":"explicit-workspace"}}let e;try{e=Uv(t.cwd)}catch{throw new it("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=Wv(e,"job-cwd");return{dal:ge({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function Cv(t,e,r){return r!==void 0?t.findProjectByName(r):Yf(e,t)}function Mv(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 KH(t){let e=[];for(let r of kl())for(let n of Bv(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new it(`project not found in any workspace DB: ${t}`);return e}function Uv(t){let e=VH(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of kl())for(let o of Bv(s)){let i=Vf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new it("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function Wv(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new it(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2563
2569
  ${Dv(n)}`):new it(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2564
2570
  ${Dv(n)}`)}function Dv(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2565
- `)}function VH(t){let e=[],r=Vf(t);for(;;){e.push(r);let n=Pv(r);if(n===r)return e;r=n}}function Bv(t){let e=null;try{e=new So(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>Bl)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var it,Zf=E(()=>{"use strict";Ul();ql();We();Ke();it=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var sm={};ne(sm,{assertNoCrossWorkflowSubflowCycle:()=>Vv,firstUnregisteredArchetype:()=>nm,runWorkflow:()=>cq});import{createHash as tm,randomUUID as YH}from"node:crypto";import{existsSync as zH,readFileSync as wl,readdirSync as ZH,writeFileSync as QH}from"node:fs";import{basename as eq,join as tq,resolve as rq}from"node:path";import{pathToFileURL as nq}from"node:url";function rm(t,e){return{source_uri:nq(rq(t)).href,source_sha256:tm("sha256").update(e).digest("hex")}}function Jv(t){return tm("sha256").update(t).digest("hex")}async function aq(t){let e=await bo(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:Jv(e),remote:!0}}async function yl(t){if(hr(t)){let n=await xs(t),s=wl(n,"utf8");return{definition:s,source_uri:t,source_sha256:Jv(s),remote:!1}}let e=ns(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(rs(t))return aq(t);let r=wl(t,"utf8");return{definition:r,...rm(t,r),remote:!1}}function Xv(t){return De(t.definition)}function Gv(t){if(t.definition_schema_version!==3)return null;let e=nm(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function lq(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 cq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(iq),0;try{return r==="run"?await uq(n,e):await R(e,s=>{switch(r){case"load":return pq(n,e,s);case"author":return hq(n,e,s);case"list":return _q(n,e,s);case"sync":return gq(n,e,s);case"export":return yq(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof it?y(e,s.message):_e(e,s)}}async function uq(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${gl}
2566
- `),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return Ir(e,r.error);if(r.positionals.length>1)return Ir(e,gl);let n=C(r,"--json"),s=A(r,"--workflow"),o=A(r,"--project"),i=A(r,"--job"),a=A(r,"--inputs"),l=C(r,"--verbose"),c=r.positionals[0],u=C(r,"--yes")||C(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return Ir(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Ll(c))return Ir(e,gl);if(hr(c))return Hv(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=ns(c,"remote workflow URLs");return m!==null?y(e,m):Hv(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return Ir(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return Ir(e,gl);if(i!==void 0&&(o!==void 0||a!==void 0))return Ir(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=dq(i);if(m===null)return Ir(e,`invalid --job: ${i}`);let p=Fv({cwd:process.cwd(),io:e});try{let h=await Js({dal:p.dal,job_id:m,worker_id:Qf()});return em(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=Kv(a,e);if(d===El)return 2;let f=zf({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return y(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await Js({dal:f.dal,job_id:p.id,worker_id:Qf()});return em(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 Hv(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=Kv(o,r);if(l===El)return 2;let c,u;try{c=await yl(t),u=Xv(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=Gv(u);if(d!==null)return y(r,d);if(c.remote&&!await fq(r,c,u,a))return 1;let f=zf({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 Js({dal:f.dal,job_id:p.id,worker_id:Qf()});return em(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 Ir(t,e){return t.stderr.write(`error: ${e}
2571
+ `)}function VH(t){let e=[],r=Vf(t);for(;;){e.push(r);let n=Pv(r);if(n===r)return e;r=n}}function Bv(t){let e=null;try{e=new So(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>Bl)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var it,Zf=E(()=>{"use strict";Wl();ql();We();Ke();it=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var sm={};ne(sm,{assertNoCrossWorkflowSubflowCycle:()=>Vv,firstUnregisteredArchetype:()=>nm,runWorkflow:()=>cq});import{createHash as tm,randomUUID as YH}from"node:crypto";import{existsSync as zH,readFileSync as El,readdirSync as ZH,writeFileSync as QH}from"node:fs";import{basename as eq,join as tq,resolve as rq}from"node:path";import{pathToFileURL as nq}from"node:url";function rm(t,e){return{source_uri:nq(rq(t)).href,source_sha256:tm("sha256").update(e).digest("hex")}}function Jv(t){return tm("sha256").update(t).digest("hex")}async function aq(t){let e=await bo(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:Jv(e),remote:!0}}async function wl(t){if(hr(t)){let n=await xs(t),s=El(n,"utf8");return{definition:s,source_uri:t,source_sha256:Jv(s),remote:!1}}let e=ns(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(rs(t))return aq(t);let r=El(t,"utf8");return{definition:r,...rm(t,r),remote:!1}}function Xv(t){return De(t.definition)}function Gv(t){if(t.definition_schema_version!==3)return null;let e=nm(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function lq(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 cq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(iq),0;try{return r==="run"?await uq(n,e):await R(e,s=>{switch(r){case"load":return pq(n,e,s);case"author":return hq(n,e,s);case"list":return _q(n,e,s);case"sync":return gq(n,e,s);case"export":return yq(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof it?y(e,s.message):_e(e,s)}}async function uq(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${yl}
2572
+ `),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return Ir(e,r.error);if(r.positionals.length>1)return Ir(e,yl);let n=C(r,"--json"),s=A(r,"--workflow"),o=A(r,"--project"),i=A(r,"--job"),a=A(r,"--inputs"),l=C(r,"--verbose"),c=r.positionals[0],u=C(r,"--yes")||C(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return Ir(e,"remote workflow URL cannot be combined with --workflow or --job");if(!jl(c))return Ir(e,yl);if(hr(c))return Hv(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=ns(c,"remote workflow URLs");return m!==null?y(e,m):Hv(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return Ir(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return Ir(e,yl);if(i!==void 0&&(o!==void 0||a!==void 0))return Ir(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=dq(i);if(m===null)return Ir(e,`invalid --job: ${i}`);let p=Fv({cwd:process.cwd(),io:e});try{let h=await Js({dal:p.dal,job_id:m,worker_id:Qf()});return em(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=Kv(a,e);if(d===Tl)return 2;let f=zf({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return y(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await Js({dal:f.dal,job_id:p.id,worker_id:Qf()});return em(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 Hv(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=Kv(o,r);if(l===Tl)return 2;let c,u;try{c=await wl(t),u=Xv(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=Gv(u);if(d!==null)return y(r,d);if(c.remote&&!await fq(r,c,u,a))return 1;let f=zf({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 Js({dal:f.dal,job_id:p.id,worker_id:Qf()});return em(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 Ir(t,e){return t.stderr.write(`error: ${e}
2567
2573
  `),2}function Kv(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)}
2568
- `),El}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2569
- `),El):r}function dq(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Qf(){return`cli-${process.pid}-${YH().slice(0,8)}`}function em(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?U(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2574
+ `),Tl}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2575
+ `),Tl):r}function dq(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Qf(){return`cli-${process.pid}-${YH().slice(0,8)}`}function em(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?U(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2570
2576
  `),1}let n={ok:e.status!=="failed",job_id:e.job_id,run_id:e.run_id,status:e.status,terminal_state:e.terminal_state,workflow:r.workflowName,project:r.projectName,workspace:r.workspaceName,ms:e.ms,...r.verbose?{db_path:r.dbPath}:{}};return r.json?U(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
2571
2577
  `):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
2572
2578
  `):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
@@ -2574,39 +2580,39 @@ ${Dv(n)}`)}function Dv(t){return t.map(e=>` workspace ${e.candidate.workspace_n
2574
2580
  `)),e.status==="failed"?1:0}async function fq(t,e,r,n){let s=lq(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(`
2575
2581
  `)+`
2576
2582
  `),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 mq(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
2577
- `),a}function mq(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 pq(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return y(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(hr(s))try{o=await yl(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else if(rs(s))try{o=await yl(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else{let c=ns(s,"remote workflow URLs");if(c!==null)return y(e,c);o=await yl(s)}let i;try{i=Xv(o)}catch(c){if(o.remote)return y(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?Gv(i):null;if(a!==null)return y(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2583
+ `),a}function mq(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 pq(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return y(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(hr(s))try{o=await wl(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else if(rs(s))try{o=await wl(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else{let c=ns(s,"remote workflow URLs");if(c!==null)return y(e,c);o=await wl(s)}let i;try{i=Xv(o)}catch(c){if(o.remote)return y(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?Gv(i):null;if(a!==null)return y(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2578
2584
  `),o.remote&&e.stdout.write(`source: ${o.source_uri}
2579
2585
  sha256: ${o.source_sha256}
2580
- `),0}function nm(t){let e=ua();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function qv(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 Vv(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 hq(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return y(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return y(e,"usage: lmctl workflow author <file.dsl> [name]");let i=wl(s,"utf8"),a;try{a=De(i)}catch(m){return y(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return _e(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=nm(l);if(c!==null)return y(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{Vv(u,qv(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return qv(JSON.parse(p.definition))}catch{return null}})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...rm(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:tm("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)
2586
+ `),0}function nm(t){let e=da();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function qv(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 Vv(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 hq(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return y(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return y(e,"usage: lmctl workflow author <file.dsl> [name]");let i=El(s,"utf8"),a;try{a=De(i)}catch(m){return y(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return _e(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=nm(l);if(c!==null)return y(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{Vv(u,qv(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return qv(JSON.parse(p.definition))}catch{return null}})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...rm(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:tm("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)
2581
2587
  `),0}function _q(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listWorkflows();return C(n,"--json")?U(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2582
2588
  `)}${s.length>0?`
2583
- `:""}`),0}function gq(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);Ii({swallow:!0});let s=y_(),o=[];try{o=zH(s)?ZH(s).filter(c=>sq.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=tq(s,c),d=wl(u,"utf8"),f;try{f=De(d)}catch(x){return y(e,`compile failed for ${c}: ${x instanceof Error?x.message:String(x)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:eq(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,S=rm(u,d),w=r.getWorkflowByName(p);if(w!==null&&w.source_sha256===S.source_sha256){l+=1;continue}let b=w===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...S}),b?i+=1:a+=1}return C(n,"--json")?U(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2589
+ `:""}`),0}function gq(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);Ni({swallow:!0});let s=y_(),o=[];try{o=zH(s)?ZH(s).filter(c=>sq.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=tq(s,c),d=El(u,"utf8"),f;try{f=De(d)}catch(x){return y(e,`compile failed for ${c}: ${x instanceof Error?x.message:String(x)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:eq(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,S=rm(u,d),w=r.getWorkflowByName(p);if(w!==null&&w.source_sha256===S.source_sha256){l+=1;continue}let b=w===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...S}),b?i+=1:a+=1}return C(n,"--json")?U(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2584
2590
  `),0}function yq(t,e,r){let n=D(t,["--out"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return y(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:oq,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)}
2585
2591
  `,c=A(n,"--out");return c!==void 0?(QH(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2586
- `)):e.stdout.write(l),0}var sq,oq,iq,gl,El,om=E(()=>{"use strict";od();Nn();xi();uu();pe();Zf();jl();Xs();sq=[".compound.json",".lmctl"],oq="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",iq=`usage: lmctl workflow <load|author|list|sync|export|run>
2592
+ `)):e.stdout.write(l),0}var sq,oq,iq,yl,Tl,om=E(()=>{"use strict";od();Nn();Ai();uu();pe();Zf();Ol();Xs();sq=[".compound.json",".lmctl"],oq="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",iq=`usage: lmctl workflow <load|author|list|sync|export|run>
2587
2593
 
2588
2594
  Load, author, list, synchronize, inspect, or run workflow definitions. The
2589
2595
  load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
2590
2596
  URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
2591
2597
  remote https:// workflow after a trust prompt.
2592
- `,gl="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";El=Symbol("inputs-error")});function im(t,e){let r=wq[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 wq,Yv=E(()=>{"use strict";wq={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var nk={};ne(nk,{initWorkspace:()=>tk,runWorkspace:()=>Iq,setWorkspaceProvider:()=>rk});import{copyFileSync as Eq,cpSync as Tq,existsSync as Ue,mkdirSync as Nr,readdirSync as lm,renameSync as bq,rmSync as Tl,statSync as bl,writeFileSync as Sq}from"node:fs";import{spawnSync as vq}from"node:child_process";import{homedir as zv}from"node:os";import{dirname as cm,join as ho}from"node:path";async function Iq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(kq),0;switch(r){case"list":return Nq(n,e);case"create":return xq(n,e);case"use":return Aq(n,e);case"show":return Rq(n,e);case"delete":return $q(n,e);case"migrate":return Lq(n,e);case"init":return tk(n,e);case"set-provider":return rk(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function Qv(){let t=go(),e=[],r=new Set,n=Rr.default,s=Ue(zn()),o=Ue(Pt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?sr(n):zn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Ue(Ar())){let i;try{i=lm(Ar())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Ge(a))continue;let l=!1;try{l=bl(Pt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:sr(a),active:t===a,legacy:!1}),r.add(a))}}return e}function Nq(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length!==0)return y(e,"usage: lmctl workspace list");let n=Qv();if(C(r,"--json"))return U(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2593
- `)}return 0}function xq(t,e){let r=D(t,["--docroot"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ge(n))return y(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Pt(n);if(Ue(s))return y(e,`workspace already exists: ${n} (${s})`);let o=A(r,"--docroot")??kl(n);Nr(s,{recursive:!0}),Nr(o,{recursive:!0});let i=sr(n);Nr(cm(i),{recursive:!0});let a=ge({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return C(r,"--json")?U(e,l):e.stdout.write(`created workspace ${n} at ${s}
2598
+ `,yl="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";Tl=Symbol("inputs-error")});function im(t,e){let r=wq[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 wq,Yv=E(()=>{"use strict";wq={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var nk={};ne(nk,{initWorkspace:()=>tk,runWorkspace:()=>Iq,setWorkspaceProvider:()=>rk});import{copyFileSync as Eq,cpSync as Tq,existsSync as Ue,mkdirSync as Nr,readdirSync as lm,renameSync as bq,rmSync as bl,statSync as Sl,writeFileSync as Sq}from"node:fs";import{spawnSync as vq}from"node:child_process";import{homedir as zv}from"node:os";import{dirname as cm,join as ho}from"node:path";async function Iq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(kq),0;switch(r){case"list":return Nq(n,e);case"create":return xq(n,e);case"use":return Aq(n,e);case"show":return Rq(n,e);case"delete":return $q(n,e);case"migrate":return Lq(n,e);case"init":return tk(n,e);case"set-provider":return rk(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function Qv(){let t=go(),e=[],r=new Set,n=Rr.default,s=Ue(zn()),o=Ue(Pt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?sr(n):zn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Ue(Ar())){let i;try{i=lm(Ar())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Ge(a))continue;let l=!1;try{l=Sl(Pt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:sr(a),active:t===a,legacy:!1}),r.add(a))}}return e}function Nq(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length!==0)return y(e,"usage: lmctl workspace list");let n=Qv();if(C(r,"--json"))return U(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2599
+ `)}return 0}function xq(t,e){let r=D(t,["--docroot"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ge(n))return y(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Pt(n);if(Ue(s))return y(e,`workspace already exists: ${n} (${s})`);let o=A(r,"--docroot")??Il(n);Nr(s,{recursive:!0}),Nr(o,{recursive:!0});let i=sr(n);Nr(cm(i),{recursive:!0});let a=ge({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return C(r,"--json")?U(e,l):e.stdout.write(`created workspace ${n} at ${s}
2594
2600
  `),0}function Aq(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace use <name>");if(!Ge(n))return y(e,`invalid workspace name: ${n}`);if(n!==Rr.default&&!Ue(Pt(n)))return y(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=_o();return Nr(cm(s),{recursive:!0}),Sq(s,`${n}
2595
2601
  `),C(r,"--json")?U(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2596
- `),0}function Rq(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace show <name>");if(!Ge(n))return y(e,`invalid workspace name: ${n}`);let s=Qv().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=Ue(s.db_path)?bl(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Ue(s.db_path)){let u=ge({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return C(r,"--json")?U(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2597
- `),0}function $q(t,e){let r=D(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ge(n))return y(e,`invalid workspace name: ${n}`);if(!C(r,"--confirm"))return y(e,`refusing to delete workspace ${n} without --confirm`);if(n===Rr.default&&!C(r,"--force"))return y(e,"refusing to delete the default workspace without --force");if(go()===n&&!C(r,"--force"))return y(e,`refusing to delete the active workspace (${n}) without --force`);let o=Pt(n);return Ue(o)?(Tl(o,{recursive:!0,force:!0}),C(r,"--json")?U(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2602
+ `),0}function Rq(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace show <name>");if(!Ge(n))return y(e,`invalid workspace name: ${n}`);let s=Qv().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=Ue(s.db_path)?Sl(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Ue(s.db_path)){let u=ge({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return C(r,"--json")?U(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2603
+ `),0}function $q(t,e){let r=D(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ge(n))return y(e,`invalid workspace name: ${n}`);if(!C(r,"--confirm"))return y(e,`refusing to delete workspace ${n} without --confirm`);if(n===Rr.default&&!C(r,"--force"))return y(e,"refusing to delete the default workspace without --force");if(go()===n&&!C(r,"--force"))return y(e,`refusing to delete the active workspace (${n}) without --force`);let o=Pt(n);return Ue(o)?(bl(o,{recursive:!0,force:!0}),C(r,"--json")?U(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2598
2604
  `),0):y(e,`workspace not found: ${n}`)}function am(t,e,r){try{bq(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
2599
- `),bl(t).isDirectory()?Tq(t,e,{recursive:!0}):Eq(t,e),!Ue(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);Tl(t,{recursive:!0,force:!0})}function Lq(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return y(e,r.error);let n=C(r,"--json"),s=Il(),o=Ar(),i=[],a=(f,m)=>{if(n)U(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2605
+ `),Sl(t).isDirectory()?Tq(t,e,{recursive:!0}):Eq(t,e),!Ue(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);bl(t,{recursive:!0,force:!0})}function Lq(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return y(e,r.error);let n=C(r,"--json"),s=Nl(),o=Ar(),i=[],a=(f,m)=>{if(n)U(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2600
2606
  `);e.stdout.write(f?`migration complete
2601
2607
  `:`${m??"nothing to migrate"}
2602
- `)}return 0};if(!Ue(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=lm(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return bl(ho(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Tl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Ue(o))am(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Ue(ho(o,m)));if(f.length>0)return y(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Nr(o,{recursive:!0});for(let m of c)am(ho(s,m),ho(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{lm(s).length===0&&(Tl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Sm(),d=_o();return Ue(u)&&(Ue(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(am(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function ek(t,e){return vq(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function Cq(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 Zv(t){return t==="~"?zv():t.startsWith("~/")?ho(zv(),t.slice(2)):t}async function tk(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: ${Kn.join(", ")}.`].join(`
2608
+ `)}return 0};if(!Ue(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=lm(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Sl(ho(s,f)).isDirectory()}catch{return!1}});if(c.length===0)bl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Ue(o))am(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Ue(ho(o,m)));if(f.length>0)return y(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Nr(o,{recursive:!0});for(let m of c)am(ho(s,m),ho(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{lm(s).length===0&&(bl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Sm(),d=_o();return Ue(u)&&(Ue(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(am(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function ek(t,e){return vq(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function Cq(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 Zv(t){return t==="~"?zv():t.startsWith("~/")?ho(zv(),t.slice(2)):t}async function tk(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: ${Kn.join(", ")}.`].join(`
2603
2609
  `)+`
2604
2610
  `),0;let s=D(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return y(e,s.error);if(s.positionals.length!==0)return y(e,n);let o=r.spawn??ek,a=Kn.map(k=>im(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 ${Kn.join("|")} first
2605
2611
  `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??Cq,u=r.promptLine!==void 0||l,d=k=>(e.stderr.write(`error: ${k} is required in non-interactive mode (no TTY); pass it explicitly
2606
2612
  `),2),f,m=A(s,"--name");if(m!==void 0){if(!Ge(m))return e.stderr.write(`error: invalid workspace name: ${m}
2607
2613
  `),2;f=m}else{if(!u)return d("--name");for(;;){let k=(await c("Workspace name [default]: ")).trim(),j=k.length===0?"default":k;if(Ge(j)){f=j;break}e.stderr.write(`invalid workspace name: ${j} (letters/digits/.-_, start alnum, \u226464)
2608
2614
  `)}}let p=Pt(f);if(Ue(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2609
- `),2;let h,g=A(s,"--basedir"),_=kl(f);if(g!==void 0)h=Zv(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:Zv(k)}let S={};for(let k of["provider1","provider2","provider3"]){let j=A(s,`--${k}`),V=jq[k],W=a.includes(V)?V:a[0];if(j!==void 0){if(!a.includes(j))return e.stderr.write(`error: --${k} ${j} is not an available provider (available: ${a.join(", ")})
2615
+ `),2;let h,g=A(s,"--basedir"),_=Il(f);if(g!==void 0)h=Zv(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:Zv(k)}let S={};for(let k of["provider1","provider2","provider3"]){let j=A(s,`--${k}`),V=jq[k],W=a.includes(V)?V:a[0];if(j!==void 0){if(!a.includes(j))return e.stderr.write(`error: --${k} ${j} is not an available provider (available: ${a.join(", ")})
2610
2616
  `),2;S[k]=j;continue}if(!u)return d(`--${k}`);for(;;){let M=(await c(`${k} (${Oq[k]}) [${W}]: `)).trim(),$=M.length===0?W:M;if(a.includes($)){S[k]=$;break}e.stderr.write(`not an available provider: ${$} (available: ${a.join(", ")})
2611
2617
  `)}}Nr(p,{recursive:!0}),Nr(h,{recursive:!0});let w=sr(f);Nr(cm(w),{recursive:!0});let b=ge({path:w});try{b.setConfig("project.docroot",h),b.setConfig("workspace.provider1",S.provider1),b.setConfig("workspace.provider2",S.provider2),b.setConfig("workspace.provider3",S.provider3)}finally{b.close()}let x={name:f,dir:p,db_path:w,basedir:h,providers:{...S}};return C(s,"--json")?U(e,x):(e.stdout.write(`created workspace ${f} at ${p}
2612
2618
  `),e.stdout.write(` basedir: ${h}
@@ -2712,8 +2718,8 @@ If project create omits --local-path, project.docroot must be configured.
2712
2718
  Show the current project context, active run, unacked attentions, and recent
2713
2719
  runs. Defaults to resolving the project from the current working directory;
2714
2720
  --project selects a project by name, and --web uses the web UI focus.
2715
- `});Ke();ts();ve();import{pathToFileURL as jJ}from"node:url";jl();ts();import{mkdirSync as NI,readFileSync as xI,renameSync as AI,writeFileSync as RI}from"node:fs";import{homedir as $I}from"node:os";import{dirname as LI,join as jI}from"node:path";var OI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",CI=60*60*1e3,MI=1500;function DI(){let t=process.env.HOME??$I();return jI(t,".lmctl",".update-check.json")}function PI(t){return t.isTTY===!0}function FI(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 Ol(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!PI(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function UI(t,e){try{let r=JSON.parse(xI(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<CI)return r.latest}catch{}return null}function WI(t,e){NI(LI(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;RI(r,`${JSON.stringify(e)}
2716
- `,"utf8"),AI(r,t)}async function BI(){let t=await bo(OI,{description:"lmctl npm metadata",timeoutMs:MI}),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 Pm(t,e=[],r={}){try{if(Ol(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??DI();if(UI(s,n)!==null)return;let i=await(r.fetchLatest??BI)();try{WI(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??lt();FI(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2721
+ `});Ke();ts();ve();import{pathToFileURL as jJ}from"node:url";Ol();ts();import{mkdirSync as NI,readFileSync as xI,renameSync as AI,writeFileSync as RI}from"node:fs";import{homedir as $I}from"node:os";import{dirname as LI,join as jI}from"node:path";var OI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",CI=60*60*1e3,MI=1500;function DI(){let t=process.env.HOME??$I();return jI(t,".lmctl",".update-check.json")}function PI(t){return t.isTTY===!0}function FI(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 Cl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!PI(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function UI(t,e){try{let r=JSON.parse(xI(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<CI)return r.latest}catch{}return null}function WI(t,e){NI(LI(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;RI(r,`${JSON.stringify(e)}
2722
+ `,"utf8"),AI(r,t)}async function BI(){let t=await bo(OI,{description:"lmctl npm metadata",timeoutMs:MI}),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 Pm(t,e=[],r={}){try{if(Cl(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??DI();if(UI(s,n)!==null)return;let i=await(r.fetchLatest??BI)();try{WI(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??lt();FI(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2717
2723
  `)}catch{}}var Vn=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2718
2724
  `,gm=`${Vn}
2719
2725
  Setup & status:
@@ -2776,8 +2782,8 @@ ${Vn}Run 'lmctl help' for usage.
2776
2782
  `),1):(t.stderr.write(`error: unknown command: ${e}
2777
2783
  ${Vn}Run 'lmctl help' for usage.
2778
2784
  `),1)}async function OJ(t,e={stdout:process.stdout,stderr:process.stderr}){let r=Cm();try{return await CJ(t,e)}finally{Mm(r)}}async function CJ(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 ym(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 ym(e,"missing value for --workspace");if(!Ge(l))return ym(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){Om();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${lt()}
2779
- `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(gm),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(gm),0):Ck.has(i)?Mk(i,[...a,"--help"],e):Dk(e,i)}bm(le(),e.stderr),vm(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(gm),0;$l()&&Oe({event:"legacy",msg:`[debug] lmctl ${lt()} | node ${process.version} | cmd ${s} ${o.join(" ")}
2780
- [debug] cwd ${process.cwd()} | db ${le()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}`},{always:!0});try{let i=await Mk(s,o,e);return Ck.has(s)&&!Ol(r,e)&&await Pm(e,r),i}catch(i){return MJ(i,s,o,e)}}function MJ(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!$l())return n.stderr.write(`error: ${s.message}
2785
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(gm),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(gm),0):Ck.has(i)?Mk(i,[...a,"--help"],e):Dk(e,i)}bm(le(),e.stderr),vm(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(gm),0;Ll()&&Oe({event:"legacy",msg:`[debug] lmctl ${lt()} | node ${process.version} | cmd ${s} ${o.join(" ")}
2786
+ [debug] cwd ${process.cwd()} | db ${le()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}`},{always:!0});try{let i=await Mk(s,o,e);return Ck.has(s)&&!Cl(r,e)&&await Pm(e,r),i}catch(i){return MJ(i,s,o,e)}}function MJ(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Ll())return n.stderr.write(`error: ${s.message}
2781
2787
  `),n.stderr.write(`(re-run with --debug for the full stack trace and context)
2782
2788
  `),1;n.stderr.write(`error: ${s.message}
2783
2789
  `),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}