@lmctl-ai/lmctl 0.1.53 → 0.1.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli/index.js +273 -270
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -1,20 +1,20 @@
1
- var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{for(var r in e)PT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Pr,readdirSync as FT,readFileSync as UT}from"node:fs";import{homedir as WT,platform as $f}from"node:os";import{join as kt}from"node:path";function pr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:kt(WT(),BT)}function An(){return kt(pr(),jf)}function hr(){return kt(pr(),qT)}function vt(t){return kt(hr(),t)}function Bt(t){return kt(vt(t),jf)}function Xa(){let t=[],e=new Set,r=o=>{Pr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:An(),kind:"legacy"});let n=hr();if(!Pr(n))return t;let s;try{s=FT(n)}catch{return t}for(let o of s.sort())qe(o)&&r({workspace_name:o,db_path:Bt(o),kind:"workspace"});return t}function Ga(t){return kt(vt(t),"projects")}function Hs(){return kt(pr(),HT)}function qe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function Js(){let t=Hs();if(!Pr(t))return null;try{let e=UT(t,"utf8").trim();return e.length===0||!qe(e)?null:e}catch{return null}}function Rn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&qe(t)?t:Js()}function ue(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Rn();if(e!==null)return Bt(e);let r=An();return Pr(r)||!Pr(hr())?r:Bt(Af)}function GT(t,e=$f()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Rf(t,e=process.stderr,r=$f()){GT(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 Va(){return kt(pr(),JT)}function Of(){return kt(pr(),XT)}function VT(){try{return Pr(Va())}catch{return!1}}function Lf(t=process.stderr){VT()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
- `)}var BT,jf,qT,HT,Af,JT,XT,_r,Ve=b(()=>{"use strict";BT=".lmctl",jf="state.db",qT="workspaces",HT="active-workspace",Af="default",JT="profiles",XT="active-profile";_r={default:Af}});function ZT(t){for(let e of zT)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 QT(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function rk(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 On(t){let e=t;for(let{re:r,replacement:n}of YT)e=e.replace(r,n);return e=e.replace(ek,r=>!rk(r)||ZT(r)?r:Cf),e=e.replace(tk,r=>QT(r)?r:Cf),e}function Ln(t){return t.split(`
1
+ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{for(var r in e)PT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Pr,readdirSync as FT,readFileSync as UT}from"node:fs";import{homedir as WT,platform as jf}from"node:os";import{join as kt}from"node:path";function pr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:kt(WT(),BT)}function An(){return kt(pr(),Af)}function hr(){return kt(pr(),qT)}function vt(t){return kt(hr(),t)}function Bt(t){return kt(vt(t),Af)}function Xa(){let t=[],e=new Set,r=o=>{Pr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:An(),kind:"legacy"});let n=hr();if(!Pr(n))return t;let s;try{s=FT(n)}catch{return t}for(let o of s.sort())qe(o)&&r({workspace_name:o,db_path:Bt(o),kind:"workspace"});return t}function Ga(t){return kt(vt(t),"projects")}function Hs(){return kt(pr(),HT)}function qe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function Js(){let t=Hs();if(!Pr(t))return null;try{let e=UT(t,"utf8").trim();return e.length===0||!qe(e)?null:e}catch{return null}}function Rn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&qe(t)?t:Js()}function ue(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Rn();if(e!==null)return Bt(e);let r=An();return Pr(r)||!Pr(hr())?r:Bt(Rf)}function GT(t,e=jf()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Of(t,e=process.stderr,r=jf()){GT(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 Va(){return kt(pr(),JT)}function Lf(){return kt(pr(),XT)}function VT(){try{return Pr(Va())}catch{return!1}}function Cf(t=process.stderr){VT()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
+ `)}var BT,Af,qT,HT,Rf,JT,XT,_r,Ve=b(()=>{"use strict";BT=".lmctl",Af="state.db",qT="workspaces",HT="active-workspace",Rf="default",JT="profiles",XT="active-profile";_r={default:Rf}});function ZT(t){for(let e of zT)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 QT(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function rk(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 On(t){let e=t;for(let{re:r,replacement:n}of YT)e=e.replace(r,n);return e=e.replace(ek,r=>!rk(r)||ZT(r)?r:Mf),e=e.replace(tk,r=>QT(r)?r:Mf),e}function Ln(t){return t.split(`
4
4
  `).map(e=>On(e)).join(`
5
- `)}function Df(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:nt}:{key:t,value:On(e)}}function qt(t){if(typeof t=="string")return On(t);if(Array.isArray(t))return t.map(e=>qt(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?nt:qt(n):e[r]=qt(n)}return e}return t}function Pf(t,e){for(let{name:r,re:n}of nk){let s=e.match(n);if(s!==null&&!s[0].includes(nt))throw new gr(t,r)}}var nt,KT,Cf,Mf,YT,zT,ek,tk,nk,gr,Xs=b(()=>{"use strict";nt="[REDACTED]",KT="[REDACTED_EMAIL]",Cf="[REDACTED_IP]",Mf="[USER]",YT=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${nt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${nt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${nt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:nt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:nt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:nt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:nt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${nt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Mf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Mf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:KT}],zT=["127.","10.","192.168.","0.0.0.0"];ek=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,tk=/\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;nk=[{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"'`]+/}],gr=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 Ka}from"node:child_process";import{readFileSync as sk}from"node:fs";import{readFile as za,stat as Ff}from"node:fs/promises";import{homedir as ok}from"node:os";import{join as ik}from"node:path";import{fileURLToPath as ak}from"node:url";function st(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(sk(ak(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Uf(t){let e=new Set(t.include??Gs),r={};return e.has("serve")&&(r.serve=await ck(t)),e.has("db")&&(r.db=uk(t)),e.has("runs")&&(r.runs=dk(t)),e.has("jobs")&&(r.jobs=fk(t)),e.has("attentions")&&(r.attentions=mk(t)),e.has("env")&&(r.env=await pk(t)),e.has("intents")&&(r.intents=await _k(t)),r}async function ck(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 za(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 za(r,"utf8")).split(`
5
+ `)}function Pf(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:nt}:{key:t,value:On(e)}}function qt(t){if(typeof t=="string")return On(t);if(Array.isArray(t))return t.map(e=>qt(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?nt:qt(n):e[r]=qt(n)}return e}return t}function Ff(t,e){for(let{name:r,re:n}of nk){let s=e.match(n);if(s!==null&&!s[0].includes(nt))throw new gr(t,r)}}var nt,KT,Mf,Df,YT,zT,ek,tk,nk,gr,Xs=b(()=>{"use strict";nt="[REDACTED]",KT="[REDACTED_EMAIL]",Mf="[REDACTED_IP]",Df="[USER]",YT=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${nt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${nt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${nt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:nt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:nt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:nt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:nt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${nt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Df}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Df}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:KT}],zT=["127.","10.","192.168.","0.0.0.0"];ek=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,tk=/\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;nk=[{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"'`]+/}],gr=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 Ka}from"node:child_process";import{readFileSync as sk}from"node:fs";import{readFile as za,stat as Uf}from"node:fs/promises";import{homedir as ok}from"node:os";import{join as ik}from"node:path";import{fileURLToPath as ak}from"node:url";function st(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(sk(ak(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Wf(t){let e=new Set(t.include??Gs),r={};return e.has("serve")&&(r.serve=await ck(t)),e.has("db")&&(r.db=uk(t)),e.has("runs")&&(r.runs=dk(t)),e.has("jobs")&&(r.jobs=fk(t)),e.has("attentions")&&(r.attentions=mk(t)),e.has("env")&&(r.env=await pk(t)),e.has("intents")&&(r.intents=await _k(t)),r}async function ck(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 za(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 za(r,"utf8")).split(`
6
6
  `),f=d.slice(Math.max(0,d.length-n));c=f.length,a=Ln(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 uk(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(i=>i.integrity_check??JSON.stringify(i)).join(`
8
8
  `)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function dk(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 ${Ya} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${Ya} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${Ya} 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:qt(o),stale:qt(a),paused:qt(i)}}function fk(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 mk(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:qt(r)}}async function pk(t){let e=st(),r=process.version,n=Ka("uname",["-a"],{encoding:"utf8"}),s=Ln((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Ff(i);let u=Ka("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 Ff(a);let u=Ka("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Ln(o.join(`
13
- `)),c=[];for(let u of lk){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Df(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function hk(){return process.env.LMCTL_INTENT_LOG??ik(ok(),".lmctl","recent-intents.log")}async function _k(t){let e=t.intentLog??hk(),r=t.intentLogTailLines??500;try{let s=(await za(e,"utf8")).split(`
12
+ FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:qt(r)}}async function pk(t){let e=st(),r=process.version,n=Ka("uname",["-a"],{encoding:"utf8"}),s=Ln((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Uf(i);let u=Ka("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 Uf(a);let u=Ka("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Ln(o.join(`
13
+ `)),c=[];for(let u of lk){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Pf(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function hk(){return process.env.LMCTL_INTENT_LOG??ik(ok(),".lmctl","recent-intents.log")}async function _k(t){let e=t.intentLog??hk(),r=t.intentLogTailLines??500;try{let s=(await za(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:Ln(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 Gs,lk,Ya,Cn=b(()=>{"use strict";Xs();Gs=["serve","db","runs","jobs","attentions","env","intents"];lk=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];Ya=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as qf,appendFileSync as gk,mkdirSync as yk,existsSync as QB,readdirSync as e2,unlinkSync as t2}from"node:fs";import{join as Ks,dirname as wk}from"node:path";import{homedir as Ek}from"node:os";function Za(){return Ks(Ek(),".lmctl")}function Hf(){Fr=!0,process.env.LMCTL_DEBUG="1"}function Jf(){return{cliDebug:Fr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Xf(t){Fr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function Se(){if(Fr)return!0;let t=Date.now();return t-Bf>=bk&&(Wf=kk(),Bf=t),Wf}function Qa(){return Fr||process.env.LMCTL_DEBUG==="1"}function Sk(){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 It(t,e){if(e?.verbose){if(!Fr)return}else if(!e?.always&&!Se())return;try{Tk();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};gk(Vs,JSON.stringify(r)+`
16
- `)}catch{}}function Tk(){if(!Vs){let e=Sk().slice(0,13).replace("T","-");Vs=Ks(Za(),`debug-${e}.log`)}yk(wk(Vs),{recursive:!0})}function ot(...t){It({event:"legacy",msg:t.join(" ")})}function pt(...t){It({event:"legacy",msg:t.join(" ")},{verbose:!0})}function Z(t){It(t,{always:!0})}function kk(){return vk()||Ik()}function vk(){try{let t=qf(Ks(Za(),"config.toml"),"utf-8");for(let e of t.split(`
17
- `)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Ik(){try{let t=qf(Ks(Za(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Fr,Wf,Bf,bk,Vs,je=b(()=>{"use strict";Fr=!1,Wf=!1,Bf=0,bk=5e3;Vs=null});function ht(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Ht(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Mn(t,e){return!Ht(t)||ht(t)?null:`${e} must use https://: ${t}`}async function yr(t,e){let r=Mn(t,e.description);if(r!==null||!ht(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 Gf(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 Gf(t,e.description,n,a)}}finally{clearTimeout(o)}}function Gf(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 Ys=b(()=>{"use strict"});import{existsSync as qk}from"node:fs";import{createRequire as Hk}from"node:module";function Jk(){return tl===null&&(tl=Hk(import.meta.url)("node:sqlite").DatabaseSync),tl}function rl(t){return t.length===1&&Xk(t[0])?[t[0]]:t}function Xk(t){if(!ol(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function ol(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var tl,nl,zs,sl,il=b(()=>{"use strict";tl=null;nl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!qk(e))throw new Error("unable to open database file");this.name=e,this.handle=new(Jk())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new sl(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=e(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let r=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},zs=nl,sl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...rl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...rl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...rl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&ol(e)?Object.values(e):ol(e)?{...e}:e}}});import{existsSync as Gk,mkdirSync as Vk,readFileSync as Kk}from"node:fs";import{homedir as Yk}from"node:os";import{dirname as Kf,join as zk,resolve as Yf}from"node:path";import{fileURLToPath as Zk,pathToFileURL as Qk}from"node:url";function ll(t){t.dbPath!==":memory:"&&Vk(Kf(t.dbPath),{recursive:!0});let e=new zs(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Zf(e);return r===0&&(e.exec(Kk(ev,"utf8")),e.pragma(`user_version = ${al}`)),rv(e,r),e}function rv(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 Gs,lk,Ya,Cn=b(()=>{"use strict";Xs();Gs=["serve","db","runs","jobs","attentions","env","intents"];lk=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];Ya=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as Hf,appendFileSync as gk,mkdirSync as yk,existsSync as QB,readdirSync as e2,unlinkSync as t2}from"node:fs";import{join as Ks,dirname as wk}from"node:path";import{homedir as Ek}from"node:os";function Za(){return Ks(Ek(),".lmctl")}function Jf(){Fr=!0,process.env.LMCTL_DEBUG="1"}function Xf(){return{cliDebug:Fr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Gf(t){Fr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function Se(){if(Fr)return!0;let t=Date.now();return t-qf>=bk&&(Bf=kk(),qf=t),Bf}function Qa(){return Fr||process.env.LMCTL_DEBUG==="1"}function Sk(){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 It(t,e){if(e?.verbose){if(!Fr)return}else if(!e?.always&&!Se())return;try{Tk();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};gk(Vs,JSON.stringify(r)+`
16
+ `)}catch{}}function Tk(){if(!Vs){let e=Sk().slice(0,13).replace("T","-");Vs=Ks(Za(),`debug-${e}.log`)}yk(wk(Vs),{recursive:!0})}function ot(...t){It({event:"legacy",msg:t.join(" ")})}function pt(...t){It({event:"legacy",msg:t.join(" ")},{verbose:!0})}function Z(t){It(t,{always:!0})}function kk(){return vk()||Ik()}function vk(){try{let t=Hf(Ks(Za(),"config.toml"),"utf-8");for(let e of t.split(`
17
+ `)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Ik(){try{let t=Hf(Ks(Za(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Fr,Bf,qf,bk,Vs,je=b(()=>{"use strict";Fr=!1,Bf=!1,qf=0,bk=5e3;Vs=null});function ht(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Ht(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Mn(t,e){return!Ht(t)||ht(t)?null:`${e} must use https://: ${t}`}async function yr(t,e){let r=Mn(t,e.description);if(r!==null||!ht(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 Vf(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 Vf(t,e.description,n,a)}}finally{clearTimeout(o)}}function Vf(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 Ys=b(()=>{"use strict"});import{existsSync as qk}from"node:fs";import{createRequire as Hk}from"node:module";function Jk(){return tl===null&&(tl=Hk(import.meta.url)("node:sqlite").DatabaseSync),tl}function rl(t){return t.length===1&&Xk(t[0])?[t[0]]:t}function Xk(t){if(!ol(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function ol(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var tl,nl,zs,sl,il=b(()=>{"use strict";tl=null;nl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!qk(e))throw new Error("unable to open database file");this.name=e,this.handle=new(Jk())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new sl(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=e(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let r=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},zs=nl,sl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...rl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...rl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...rl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&ol(e)?Object.values(e):ol(e)?{...e}:e}}});import{existsSync as Gk,mkdirSync as Vk,readFileSync as Kk}from"node:fs";import{homedir as Yk}from"node:os";import{dirname as Yf,join as zk,resolve as zf}from"node:path";import{fileURLToPath as Zk,pathToFileURL as Qk}from"node:url";function ll(t){t.dbPath!==":memory:"&&Vk(Yf(t.dbPath),{recursive:!0});let e=new zs(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Qf(e);return r===0&&(e.exec(Kk(ev,"utf8")),e.pragma(`user_version = ${al}`)),rv(e,r),e}function rv(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
18
18
  CREATE TABLE IF NOT EXISTS session_size (
19
19
  id INTEGER PRIMARY KEY AUTOINCREMENT,
20
20
  team_name TEXT NOT NULL,
@@ -454,9 +454,9 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
454
454
  ORDER BY id ASC;
455
455
  DROP TABLE team_connection;
456
456
  ALTER TABLE team_connection_v37 RENAME TO team_connection;
457
- `),t.pragma("user_version = 37"),r=37),r<38&&r!==0&&(ve(t,"agent_inflight").has("active_count")||t.exec("ALTER TABLE agent_inflight ADD COLUMN active_count INTEGER NOT NULL DEFAULT 1;"),t.exec("DROP TABLE IF EXISTS team_connection;"),t.pragma("user_version = 38"),r=38),r<39&&r!==0&&(ve(t,"agent_inflight").has("holder_pid")||t.exec("ALTER TABLE agent_inflight ADD COLUMN holder_pid INTEGER;"),t.pragma("user_version = 39"),r=39),Gk(tv)}function ve(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function nv(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Zf(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function sv(){return process.env.LMCTL_DB??zk(Yk(),".lmctl","state.db")}var zf,ev,tv,al,cl=b(()=>{"use strict";il();zf=Kf(Zk(import.meta.url)),ev=Yf(zf,"schema.sql"),tv=Yf(zf,"migrations"),al=39;if(process.argv[1]&&import.meta.url===Qk(process.argv[1]).href){let t=ll({dbPath:process.argv[2]??sv()});try{process.stdout.write(`migrated user_version=${Zf(t)}
458
- `)}finally{t.close()}}});function Ur(t){return typeof t=="string"&&ov.has(t)}function tm(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${Zs[0]}`,` STANCE: ${Zs[1]}`,` STANCE: ${Zs[2]}`,` STANCE: ${Qf}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
459
- `)}var Qf,Zs,ov,Dn,em,ul,Qs,Pn=b(()=>{"use strict";Qf="other",Zs=["not_enough_information","dont_know","other_work"],ov=new Set([Qf,...Zs]),Dn="@abort",em="invalid_decision",ul="escalation_aborted",Qs="workflow_escalation"});import{randomUUID as iv}from"node:crypto";function Ie(t){return t.provider_resolved??t.provider}function P(){return new Date().toISOString()}function pe(t){return new dl(ll({dbPath:t.path}))}function rm(t,e,r){let n=nm(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 nm(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 nm(t){let e=av(t),r=e===null?null:lv(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))fl(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function av(t){try{let e=JSON.parse(t);return fl(e)?e:null}catch{return null}}function lv(t,e){let r=t[e];return fl(r)?r:null}function fl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function cv(t){return{insertWorkflow:t.prepare(`
457
+ `),t.pragma("user_version = 37"),r=37),r<38&&r!==0&&(ve(t,"agent_inflight").has("active_count")||t.exec("ALTER TABLE agent_inflight ADD COLUMN active_count INTEGER NOT NULL DEFAULT 1;"),t.exec("DROP TABLE IF EXISTS team_connection;"),t.pragma("user_version = 38"),r=38),r<39&&r!==0&&(ve(t,"agent_inflight").has("holder_pid")||t.exec("ALTER TABLE agent_inflight ADD COLUMN holder_pid INTEGER;"),t.pragma("user_version = 39"),r=39),Gk(tv)}function ve(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function nv(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Qf(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function sv(){return process.env.LMCTL_DB??zk(Yk(),".lmctl","state.db")}var Zf,ev,tv,al,cl=b(()=>{"use strict";il();Zf=Yf(Zk(import.meta.url)),ev=zf(Zf,"schema.sql"),tv=zf(Zf,"migrations"),al=39;if(process.argv[1]&&import.meta.url===Qk(process.argv[1]).href){let t=ll({dbPath:process.argv[2]??sv()});try{process.stdout.write(`migrated user_version=${Qf(t)}
458
+ `)}finally{t.close()}}});function Ur(t){return typeof t=="string"&&ov.has(t)}function rm(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${Zs[0]}`,` STANCE: ${Zs[1]}`,` STANCE: ${Zs[2]}`,` STANCE: ${em}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
459
+ `)}var em,Zs,ov,Dn,tm,ul,Qs,Pn=b(()=>{"use strict";em="other",Zs=["not_enough_information","dont_know","other_work"],ov=new Set([em,...Zs]),Dn="@abort",tm="invalid_decision",ul="escalation_aborted",Qs="workflow_escalation"});import{randomUUID as iv}from"node:crypto";function Ie(t){return t.provider_resolved??t.provider}function P(){return new Date().toISOString()}function pe(t){return new dl(ll({dbPath:t.path}))}function nm(t,e,r){let n=sm(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 sm(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 sm(t){let e=av(t),r=e===null?null:lv(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))fl(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function av(t){try{let e=JSON.parse(t);return fl(e)?e:null}catch{return null}}function lv(t,e){let r=t[e];return fl(r)?r:null}function fl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function cv(t){return{insertWorkflow:t.prepare(`
460
460
  INSERT INTO workflow (name, version, definition_schema_version, definition, created_at)
461
461
  VALUES (?, ?, ?, ?, ?)
462
462
  `),setWorkflowSource:t.prepare("UPDATE workflow SET source_uri = ?, source_sha256 = ? WHERE id = ?"),getWorkflow:t.prepare("SELECT * FROM workflow WHERE id = ?"),findWorkflowVersion:t.prepare("SELECT * FROM workflow WHERE name = ? AND version = ?"),findWorkflowLatest:t.prepare("SELECT * FROM workflow WHERE name = ? ORDER BY version DESC LIMIT 1"),updateWorkflowActiveVersion:t.prepare("UPDATE workflow SET active_version_id = ? WHERE id = ?"),updateWorkflowActiveVersionAndDefinition:t.prepare(`
@@ -949,10 +949,10 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
949
949
  AND sender_teamfile = ?
950
950
  AND sender_alias = ?
951
951
  AND active_count > 1
952
- `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function uv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var dl,Pe=b(()=>{"use strict";cl();Pn();dl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=cv(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)=>uv("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!==Qs)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!==Dn&&!a.includes(n))return{resumed:!1,reason:em};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}}}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){rm(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){rm(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=iv(),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.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,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 dv}from"node:fs";import{resolve as fv}from"node:path";function ml(t){let e=fv(t);try{return dv(e)}catch{return e}}var sm=b(()=>{"use strict"});import{platform as om}from"node:os";function _t(t){let e=new Fn;for(let r of t)e.registerAdapter(r);return e}var Fn,pl=b(()=>{"use strict";sm();Fn=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=ml(e.workspace);o=o.filter(a=>ml(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=om()==="darwin"||om()==="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 im}from"node:fs";import{createInterface as am}from"node:readline";import{stat as mv}from"node:fs/promises";import{homedir as pv}from"node:os";async function*Fe(t){let e=im(t,{encoding:"utf-8"}),r=am({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Le(t,e){let r=[],n=im(t,{encoding:"utf-8"}),s=am({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 xe(t){let e=await mv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
953
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function V(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Te,Jt=b(()=>{"use strict";Te=pv()});import{readdir as eo,stat as lm,unlink as hv}from"node:fs/promises";import{join as Wr,basename as cm}from"node:path";function _v(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function gv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function um(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Fe(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var to,dm=b(()=>{"use strict";Jt();to=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Wr(Te,".claude"),this.projectsDir=Wr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await eo(this.projectsDir)}catch{return e}for(let n of r){let s=Wr(this.projectsDir,n);if(!(await lm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await eo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=cm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Wr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Le(e,50),s=await xe(e),o="",i,a,l,c,u,d;for(let m of n)if(!_v(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=V(p.trim(),80)),u=V(p.trim(),80)}}if(!o)return null;let f=await um(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 xe(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Fe(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:gv(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=V(_.trim(),80)),d=V(_.trim(),80),s.push({role:"user",timestamp:g,content:de(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let E=typeof T.content=="string"?de(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:T.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:de(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await um(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 hv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await eo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Wr(this.projectsDir,i);if(!(await lm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await eo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=cm(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Wr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Le(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function ro(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function wv(t,e,r){if(!r)return"";let n=t.tools[e]??hl[e],s=n?.profiles?.[r]?.flags??hl[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 fm(t,e){return!!t.tools[e]}function mm(t,e,r,n,s){let o=t.tools[e]??hl[e],i;if(o?.agent){let l=ro(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=yv[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=wv(t,e,s);return a&&(i+=" "+a),i}var hl,yv,pm=b(()=>{"use strict";hl={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:""}}}},yv={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 hm(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 _m=b(()=>{"use strict"});var Ev,Ne,no,xt=b(()=>{"use strict";Ev="ACK: waiting for explicit lmctl task.",Ne=`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: ${Ev}`,no=`send this exact lmctl seed instruction: "${Ne}"`});function Ke(t,e){return e===void 0||e.length===0?t:{...t??process.env,[_l]:e}}var _l,Xt=b(()=>{"use strict";_l="LMCTL_SELF_SESSIONID"});import{spawn as gm}from"node:child_process";import{mkdirSync as bv}from"node:fs";var gl,Oe,Gt=b(()=>{"use strict";pm();_m();xt();Xt();gl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Oe=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===Ne?r:n)}seed(e,r){return bv(e,{recursive:!0}),new Promise(n=>{let s;try{s=gm(this.binary,this.seedArgsFor(r),{cwd:e,stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
954
- `: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:no,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&fm(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 gl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=mm(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=hm(r.env),c=gm(s,{shell:!0,cwd:r.cwd,env:Ke(r.env,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function oo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new $t(t,r,e)}var Ye,we,Nt,so,$t,Br=b(()=>{"use strict";Ye=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},we=class extends Ye{},Nt=class extends Ye{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},so=class extends Ye{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},$t=class extends Ye{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as wl from"node:child_process";function Tv(t){if(typeof wl.spawnSync=="function")try{wl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function ym(t){return t.exitCode!==null||t.signalCode!==null}function yl(t,e){return ym(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 it(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??Tv;if(ym(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await yl(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 yl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await yl(t,Sv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var Sv,io=b(()=>{"use strict";Sv=1e3});function wm(t){Se()&&process.stderr.write(`[debug] ${t}
955
- `)}function qr(t,e){let r=vv[t];if(r)return r[e]??r.yolo}function xv(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 Vt(t,e,r="yolo"){if(Iv.has(t)){wm(`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"?qr(t,"plan"):kv[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 we(s)}if(!xv(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 we(o)}wm(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var kv,vv,Iv,Un=b(()=>{"use strict";Br();je();kv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},vv={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"]}};Iv=new Set(["codex","opencode"])});import{spawn as Nv}from"node:child_process";import{existsSync as $v}from"node:fs";function Av(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(`
952
+ `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function uv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var dl,Pe=b(()=>{"use strict";cl();Pn();dl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=cv(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)=>uv("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!==Qs)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!==Dn&&!a.includes(n))return{resumed:!1,reason:tm};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}}}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){nm(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){nm(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=iv(),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.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,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 dv}from"node:fs";import{resolve as fv}from"node:path";function ml(t){let e=fv(t);try{return dv(e)}catch{return e}}var om=b(()=>{"use strict"});import{platform as im}from"node:os";function _t(t){let e=new Fn;for(let r of t)e.registerAdapter(r);return e}var Fn,pl=b(()=>{"use strict";om();Fn=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=ml(e.workspace);o=o.filter(a=>ml(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=im()==="darwin"||im()==="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 am}from"node:fs";import{createInterface as lm}from"node:readline";import{stat as mv}from"node:fs/promises";import{homedir as pv}from"node:os";async function*Fe(t){let e=am(t,{encoding:"utf-8"}),r=lm({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Le(t,e){let r=[],n=am(t,{encoding:"utf-8"}),s=lm({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 xe(t){let e=await mv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
953
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function V(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Te,Jt=b(()=>{"use strict";Te=pv()});import{readdir as eo,stat as cm,unlink as hv}from"node:fs/promises";import{join as Wr,basename as um}from"node:path";function _v(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function gv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function dm(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Fe(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var to,fm=b(()=>{"use strict";Jt();to=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Wr(Te,".claude"),this.projectsDir=Wr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await eo(this.projectsDir)}catch{return e}for(let n of r){let s=Wr(this.projectsDir,n);if(!(await cm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await eo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=um(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Wr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Le(e,50),s=await xe(e),o="",i,a,l,c,u,d;for(let m of n)if(!_v(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=V(p.trim(),80)),u=V(p.trim(),80)}}if(!o)return null;let f=await dm(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 xe(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Fe(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:gv(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=V(_.trim(),80)),d=V(_.trim(),80),s.push({role:"user",timestamp:g,content:de(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let E=typeof T.content=="string"?de(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:T.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:de(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await dm(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 hv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await eo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Wr(this.projectsDir,i);if(!(await cm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await eo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=um(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Wr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Le(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function ro(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function wv(t,e,r){if(!r)return"";let n=t.tools[e]??hl[e],s=n?.profiles?.[r]?.flags??hl[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 mm(t,e){return!!t.tools[e]}function pm(t,e,r,n,s){let o=t.tools[e]??hl[e],i;if(o?.agent){let l=ro(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=yv[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=wv(t,e,s);return a&&(i+=" "+a),i}var hl,yv,hm=b(()=>{"use strict";hl={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:""}}}},yv={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 _m(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 gm=b(()=>{"use strict"});var Ev,Ne,no,xt=b(()=>{"use strict";Ev="ACK: waiting for explicit lmctl task.",Ne=`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: ${Ev}`,no=`send this exact lmctl seed instruction: "${Ne}"`});function Ke(t,e){return e===void 0||e.length===0?t:{...t??process.env,[_l]:e}}var _l,Xt=b(()=>{"use strict";_l="LMCTL_SELF_SESSIONID"});import{spawn as ym}from"node:child_process";import{mkdirSync as bv}from"node:fs";var gl,Oe,Gt=b(()=>{"use strict";hm();gm();xt();Xt();gl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Oe=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===Ne?r:n)}seed(e,r){return bv(e,{recursive:!0}),new Promise(n=>{let s;try{s=ym(this.binary,this.seedArgsFor(r),{cwd:e,stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
954
+ `: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:no,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&mm(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 gl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=pm(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=_m(r.env),c=ym(s,{shell:!0,cwd:r.cwd,env:Ke(r.env,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function oo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new $t(t,r,e)}var Ye,we,Nt,so,$t,Br=b(()=>{"use strict";Ye=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},we=class extends Ye{},Nt=class extends Ye{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},so=class extends Ye{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},$t=class extends Ye{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as wl from"node:child_process";function Tv(t){if(typeof wl.spawnSync=="function")try{wl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function wm(t){return t.exitCode!==null||t.signalCode!==null}function yl(t,e){return wm(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 it(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??Tv;if(wm(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await yl(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 yl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await yl(t,Sv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var Sv,io=b(()=>{"use strict";Sv=1e3});function Em(t){Se()&&process.stderr.write(`[debug] ${t}
955
+ `)}function qr(t,e){let r=vv[t];if(r)return r[e]??r.yolo}function xv(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 Vt(t,e,r="yolo"){if(Iv.has(t)){Em(`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"?qr(t,"plan"):kv[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 we(s)}if(!xv(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 we(o)}Em(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var kv,vv,Iv,Un=b(()=>{"use strict";Br();je();kv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},vv={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"]}};Iv=new Set(["codex","opencode"])});import{spawn as Nv}from"node:child_process";import{existsSync as $v}from"node:fs";function Av(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(`
956
956
 
957
957
  --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
958
958
 
@@ -960,23 +960,23 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
960
960
  One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return e?`Original provider error:
961
961
  ${e}
962
962
 
963
- ${r}`:r}function Em(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||jv[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=qr(s,a)??Cv[s]??["--dangerously-skip-permissions"];i.push(...l);try{Vt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!$v(e.cwd))return Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Nv(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:s,phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:s}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Rv({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(`
963
+ ${r}`:r}function bm(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||jv[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=qr(s,a)??Cv[s]??["--dangerously-skip-permissions"];i.push(...l);try{Vt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!$v(e.cwd))return Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Nv(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:s,phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:s}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Rv({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(`
964
964
  `);f=_.pop()||"";for(let T of _)m(T)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new we(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(pt(`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(Lv({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
965
- `),pt(`stream-json: prompt sent (${t.length} chars)`)})}var jv,Cv,bm=b(()=>{"use strict";Br();io();Un();je();Xt();jv={claude:"claude",qwen:"qwen"};Cv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as Mv,constants as Dv}from"node:fs";import{delimiter as Pv,join as Fv}from"node:path";function Uv(t,e=process.env){let r=e.PATH??"";for(let n of r.split(Pv))if(n)try{return Mv(Fv(n,t),Dv.X_OK),!0}catch{}return!1}function Wv(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Hr(t,e,r={}){if(Uv(t,r.env))return;(r.warn??console.warn)(Wv(t,e))}var ao=b(()=>{"use strict"});function lo(t={}){return Hr("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${qv}`]}var Bv,qv,El=b(()=>{"use strict";ao();Bv=864e5,qv=Bv/1e3});import{spawn as Hv}from"node:child_process";import{createInterface as Jv}from"node:readline";import{existsSync as Xv,readFileSync as Gv}from"node:fs";import{fileURLToPath as Vv}from"node:url";function Kv(t){return t==="plan"?"read-only":"danger-full-access"}function zv(){return{clientInfo:{name:"lmctl",title:"lmctl",version:Yv},capabilities:{experimentalApi:!1}}}function Kt(t,e){pt(`[codex:${t}] ${JSON.stringify(e)}`)}function Zv(){return{agentItems:new Map,resultText:""}}function Sm(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 Qv(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function e0(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 t0(){return{pendingCodexError:null}}function r0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
965
+ `),pt(`stream-json: prompt sent (${t.length} chars)`)})}var jv,Cv,Sm=b(()=>{"use strict";Br();io();Un();je();Xt();jv={claude:"claude",qwen:"qwen"};Cv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as Mv,constants as Dv}from"node:fs";import{delimiter as Pv,join as Fv}from"node:path";function Uv(t,e=process.env){let r=e.PATH??"";for(let n of r.split(Pv))if(n)try{return Mv(Fv(n,t),Dv.X_OK),!0}catch{}return!1}function Wv(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Hr(t,e,r={}){if(Uv(t,r.env))return;(r.warn??console.warn)(Wv(t,e))}var ao=b(()=>{"use strict"});function lo(t={}){return Hr("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${qv}`]}var Bv,qv,El=b(()=>{"use strict";ao();Bv=864e5,qv=Bv/1e3});import{spawn as Hv}from"node:child_process";import{createInterface as Jv}from"node:readline";import{existsSync as Xv,readFileSync as Gv}from"node:fs";import{fileURLToPath as Vv}from"node:url";function Kv(t){return t==="plan"?"read-only":"danger-full-access"}function zv(){return{clientInfo:{name:"lmctl",title:"lmctl",version:Yv},capabilities:{experimentalApi:!1}}}function Kt(t,e){pt(`[codex:${t}] ${JSON.stringify(e)}`)}function Zv(){return{agentItems:new Map,resultText:""}}function Tm(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 Qv(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function e0(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 t0(){return{pendingCodexError:null}}function r0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
966
966
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
967
967
  ${e}
968
968
 
969
- ${r}`:r}function n0(t,e){let r=e0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function s0(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 Tm(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";i&&o.push(...lo()),Se()&&ot(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:i}));let a=e.permissionMode??"yolo",l=Kv(a);try{Vt("codex",o,a)}catch(D){return n(D)}if(e.cwd&&!Xv(e.cwd))return Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Hv(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:"codex"}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Jv({input:c.stdout}),f=new Map,m=1,p=e.threadId||"",h="",g=!1,_=!1,T=Date.now(),E=Zv(),k=t0();function $(D,C={}){return new Promise((H,R)=>{let U=m++;f.set(U,{resolve:H,reject:R});let z=JSON.stringify({jsonrpc:"2.0",id:U,method:D,params:C});c.stdin?.write(z+`
969
+ ${r}`:r}function n0(t,e){let r=e0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function s0(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 km(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";i&&o.push(...lo()),Se()&&ot(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:i}));let a=e.permissionMode??"yolo",l=Kv(a);try{Vt("codex",o,a)}catch(D){return n(D)}if(e.cwd&&!Xv(e.cwd))return Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Hv(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:"codex"}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Jv({input:c.stdout}),f=new Map,m=1,p=e.threadId||"",h="",g=!1,_=!1,T=Date.now(),E=Zv(),k=t0();function $(D,C={}){return new Promise((H,R)=>{let U=m++;f.set(U,{resolve:H,reject:R});let z=JSON.stringify({jsonrpc:"2.0",id:U,method:D,params:C});c.stdin?.write(z+`
970
970
  `)})}function x(D,C={}){let H=JSON.stringify({jsonrpc:"2.0",method:D,params:C});c.stdin?.write(H+`
971
- `)}d.on("line",D=>{let C;try{C=JSON.parse(D)}catch{return}if(typeof C.id=="number"&&f.has(C.id)){let U=f.get(C.id);if(f.delete(C.id),C.error){let z=C.error,v=typeof z?.message=="string"&&z.message.length>0?z.message:JSON.stringify(C.error);U.reject(oo(`codex app-server error: ${v}`,z))}else U.resolve(C);e.onEvent?.(C);return}let H=C.method;if(!H){e.onEvent?.(C);return}if(H==="thread/started"){let z=C.params?.thread;z?.id&&(p=z.id)}let R=Se()?U=>{Kt("item.text/buffer-mismatch",{itemId:U.itemId,threadId:U.threadId??null,turnId:U.turnId??null,expectedFromItemText:U.expectedFromItemText,gotFromBuffer:U.gotFromBuffer,expectedLen:U.expectedFromItemText.length,gotLen:U.gotFromBuffer.length})}:void 0;if(H==="turn/started"){let U=C.params,z=U?.turn;z?.id&&(h=z.id),Sm(C,E,e.onDelta,R),Se()&&Kt("turn/started",{params:U??null})}if(Se()&&(H==="item/started"||H==="item/completed")){let U=C.params;U?.item?.type==="agentMessage"&&Kt(H,{params:U??null})}if(H==="item/started"||H==="item/agentMessage/delta"||H==="item/completed"){if(H==="item/agentMessage/delta"){let U=C.params;Se()&&Kt("agentMessage/delta",{params:U??null})}Sm(C,E,e.onDelta,R)}if(H==="turn/completed"){let U=C.params;if(Se())for(let[v,I]of E.agentItems.entries())I.buffer&&Kt("turn/completed/unflushed-item",{itemId:v,phase:I.phase,bufferLen:I.buffer.length});Qv(E),Se()&&Kt("turn/completed",{params:U??null});let z=s0(C,k);z.shouldReject?(Se()&&Kt("turn/completed/terminal-reject",{message:z.turnError.message}),_=!0,g=!0,c.stdin?.end(),n(z.turnError)):(g=!0,c.stdin?.end())}if(H==="error"){let U=n0(C,k);if(Se()){let z=C.params,v=z?.error,I=typeof v?.message=="string"?v.message:"(no message)";Kt(U.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:U.willRetry,params:z??null})}}e.onEvent?.(C)});let A="";c.stderr?.on("data",D=>{A+=D.toString()}),c.on("error",D=>{Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),n(new we(`Failed to spawn codex app-server: ${D.message}`,{cause:D}))}),c.on("exit",D=>{if(!u&&!_){if(g){r({result:E.resultText,threadId:p,turnId:h,durationMs:Date.now()-T,exitCode:D});return}if(k.pendingCodexError){n(k.pendingCodexError);return}Z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:D,stderr_tail:A.slice(0,500)}),n(new Error(r0({exitCode:D,stderr:A})))}}),(async()=>{try{if(await $("initialize",zv()),x("initialized",{}),e.threadId)try{let D=$("thread/resume",{threadId:e.threadId,sandbox:l,approvalPolicy:"never",...e.model?{model:e.model}:{}}),C=new Promise((H,R)=>setTimeout(()=>R(new Error("resume timeout")),5e3));await Promise.race([D,C]),p=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
972
- `);let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}else{let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}await $("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(D){it(c).catch(()=>{}),n(D instanceof Error?D:new Error(String(D)))}})()})}var Yv,km=b(()=>{"use strict";je();je();Br();io();Un();El();je();Xt();Yv=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(Gv(Vv(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Yt(t,e=["high","xhigh"]){return{name:t,reasoning:!0,provider:{npm:"@ai-sdk/github-copilot"},variants:Object.fromEntries(e.map(r=>[r,{reasoningEffort:r,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}}function bl(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:vm},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Im.map(t=>[t,{name:t}]))},openrouter:{npm:"@ai-sdk/openai-compatible",name:"OpenRouter",options:{baseURL:"https://openrouter.ai/api/v1",apiKey:"{env:OPENROUTER_API_KEY}"},models:Object.fromEntries(xm.map(t=>[t,{name:t}]))}})}function Nm(){return[...Object.keys(vm).map(t=>`github-copilot/${t}`),...Im.map(t=>`deepseek/${t}`),...xm.map(t=>`openrouter/${t}`)].sort()}var vm,Im,xm,Sl=b(()=>{"use strict";vm={"gpt-4.1":{name:"GPT-4.1"},"gpt-4.1-2025-04-14":{name:"GPT-4.1 (2025-04-14)"},"gpt-4o-mini":{name:"GPT-4o mini"},"gpt-4o-mini-2024-07-18":{name:"GPT-4o mini (2024-07-18)"},"gpt-5-mini":Yt("GPT-5 mini",["high"]),"gpt-5.2":Yt("GPT-5.2"),"gpt-5.2-codex":Yt("GPT-5.2 Codex"),"gpt-5.3-codex":Yt("GPT-5.3 Codex"),"gpt-5.4":Yt("GPT-5.4"),"gpt-5.4-mini":Yt("GPT-5.4 mini"),"gpt-5.4-nano":Yt("GPT-5.4 nano"),"gpt-5.5":Yt("GPT-5.5")},Im=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],xm=["qwen/qwen3-coder","qwen/qwen3-coder-plus","qwen/qwen3-coder-flash","qwen/qwen3.5-9b","qwen/qwen3.5-397b-a17b","qwen/qwen3.5-plus-20260420","qwen/qwen3.6-flash","qwen/qwen3.6-plus","qwen/qwen3.6-max-preview","qwen/qwen3.7-plus"]});import{existsSync as Rm,mkdirSync as o0,readFileSync as Om,writeFileSync as $m}from"node:fs";import{join as Wn,resolve as i0}from"node:path";function Am(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:a0}}function l0(t,e){return JSON.stringify(t)===JSON.stringify(e)}function co(t){return structuredClone(t)}function Lm(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 Tl(t,e,r={existsSync:Rm,readFileSync:Om}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=i0(e,s.sessiondir??e);for(let i of c0(o)){let a=u0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Lm(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 c0(t){return[Wn(t,".opencode","opencode.jsonc"),Wn(t,"opencode.jsonc"),Wn(t,"opencode.json")]}function u0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(d0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function d0(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]!==`
973
- `;)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 uo(t,e={}){let r=Wn(t,".opencode"),n=Wn(r,"opencode.json");if(Hr("lmctl","lmctl_chat",e),!Rm(n)){o0(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:bl(),mcp:{lmctl:Am()}},null,2);return $m(n,l+`
974
- `,"utf-8"),!0}let s;try{s=JSON.parse(Om(n,"utf-8"))}catch{return console.log(jm.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(jm.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;s.permission===void 0&&(s.permission="allow",o=!0),Lm(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.`}),f0(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=Am();return l0(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&$m(n,JSON.stringify(s,null,2)+`
975
- `,"utf-8"),o}function f0(t){let e=bl(),r=jt(t.provider)?t.provider:{},n=!jt(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=co(o),n=!0;continue}if(!jt(i))continue;let a={...i};a.npm===void 0&&(a.npm=o.npm,n=!0),a.name===void 0&&(a.name=o.name,n=!0);let l=jt(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=co(d),n=!0);a.options=l;let c=jt(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models)){if(c[u]===void 0){c[u]=co(d),n=!0;continue}let f=c[u];if(jt(f)&&jt(d)){let m={...f};Cm(m,d)&&(c[u]=m,n=!0)}}a.models=c,r[s]=a}return n&&(t.provider=r),n}function jt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Cm(t,e){let r=!1;for(let[n,s]of Object.entries(e)){if(t[n]===void 0){t[n]=co(s),r=!0;continue}jt(t[n])&&jt(s)&&Cm(t[n],s)&&(r=!0)}return r}var jm,a0,fo=b(()=>{"use strict";je();Sl();ao();jm={yellow:t=>t},a0=864e5});import{spawn as m0}from"node:child_process";import{existsSync as p0}from"node:fs";import{createInterface as h0}from"node:readline";function _0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
971
+ `)}d.on("line",D=>{let C;try{C=JSON.parse(D)}catch{return}if(typeof C.id=="number"&&f.has(C.id)){let U=f.get(C.id);if(f.delete(C.id),C.error){let z=C.error,v=typeof z?.message=="string"&&z.message.length>0?z.message:JSON.stringify(C.error);U.reject(oo(`codex app-server error: ${v}`,z))}else U.resolve(C);e.onEvent?.(C);return}let H=C.method;if(!H){e.onEvent?.(C);return}if(H==="thread/started"){let z=C.params?.thread;z?.id&&(p=z.id)}let R=Se()?U=>{Kt("item.text/buffer-mismatch",{itemId:U.itemId,threadId:U.threadId??null,turnId:U.turnId??null,expectedFromItemText:U.expectedFromItemText,gotFromBuffer:U.gotFromBuffer,expectedLen:U.expectedFromItemText.length,gotLen:U.gotFromBuffer.length})}:void 0;if(H==="turn/started"){let U=C.params,z=U?.turn;z?.id&&(h=z.id),Tm(C,E,e.onDelta,R),Se()&&Kt("turn/started",{params:U??null})}if(Se()&&(H==="item/started"||H==="item/completed")){let U=C.params;U?.item?.type==="agentMessage"&&Kt(H,{params:U??null})}if(H==="item/started"||H==="item/agentMessage/delta"||H==="item/completed"){if(H==="item/agentMessage/delta"){let U=C.params;Se()&&Kt("agentMessage/delta",{params:U??null})}Tm(C,E,e.onDelta,R)}if(H==="turn/completed"){let U=C.params;if(Se())for(let[v,I]of E.agentItems.entries())I.buffer&&Kt("turn/completed/unflushed-item",{itemId:v,phase:I.phase,bufferLen:I.buffer.length});Qv(E),Se()&&Kt("turn/completed",{params:U??null});let z=s0(C,k);z.shouldReject?(Se()&&Kt("turn/completed/terminal-reject",{message:z.turnError.message}),_=!0,g=!0,c.stdin?.end(),n(z.turnError)):(g=!0,c.stdin?.end())}if(H==="error"){let U=n0(C,k);if(Se()){let z=C.params,v=z?.error,I=typeof v?.message=="string"?v.message:"(no message)";Kt(U.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:U.willRetry,params:z??null})}}e.onEvent?.(C)});let A="";c.stderr?.on("data",D=>{A+=D.toString()}),c.on("error",D=>{Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),n(new we(`Failed to spawn codex app-server: ${D.message}`,{cause:D}))}),c.on("exit",D=>{if(!u&&!_){if(g){r({result:E.resultText,threadId:p,turnId:h,durationMs:Date.now()-T,exitCode:D});return}if(k.pendingCodexError){n(k.pendingCodexError);return}Z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:D,stderr_tail:A.slice(0,500)}),n(new Error(r0({exitCode:D,stderr:A})))}}),(async()=>{try{if(await $("initialize",zv()),x("initialized",{}),e.threadId)try{let D=$("thread/resume",{threadId:e.threadId,sandbox:l,approvalPolicy:"never",...e.model?{model:e.model}:{}}),C=new Promise((H,R)=>setTimeout(()=>R(new Error("resume timeout")),5e3));await Promise.race([D,C]),p=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
972
+ `);let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}else{let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}await $("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(D){it(c).catch(()=>{}),n(D instanceof Error?D:new Error(String(D)))}})()})}var Yv,vm=b(()=>{"use strict";je();je();Br();io();Un();El();je();Xt();Yv=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(Gv(Vv(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Yt(t,e=["high","xhigh"]){return{name:t,reasoning:!0,provider:{npm:"@ai-sdk/github-copilot"},variants:Object.fromEntries(e.map(r=>[r,{reasoningEffort:r,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}}function bl(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:Im},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(xm.map(t=>[t,{name:t}]))},openrouter:{npm:"@ai-sdk/openai-compatible",name:"OpenRouter",options:{baseURL:"https://openrouter.ai/api/v1",apiKey:"{env:OPENROUTER_API_KEY}"},models:Object.fromEntries(Nm.map(t=>[t,{name:t}]))}})}function $m(){return[...Object.keys(Im).map(t=>`github-copilot/${t}`),...xm.map(t=>`deepseek/${t}`),...Nm.map(t=>`openrouter/${t}`)].sort()}var Im,xm,Nm,Sl=b(()=>{"use strict";Im={"gpt-4.1":{name:"GPT-4.1"},"gpt-4.1-2025-04-14":{name:"GPT-4.1 (2025-04-14)"},"gpt-4o-mini":{name:"GPT-4o mini"},"gpt-4o-mini-2024-07-18":{name:"GPT-4o mini (2024-07-18)"},"gpt-5-mini":Yt("GPT-5 mini",["high"]),"gpt-5.2":Yt("GPT-5.2"),"gpt-5.2-codex":Yt("GPT-5.2 Codex"),"gpt-5.3-codex":Yt("GPT-5.3 Codex"),"gpt-5.4":Yt("GPT-5.4"),"gpt-5.4-mini":Yt("GPT-5.4 mini"),"gpt-5.4-nano":Yt("GPT-5.4 nano"),"gpt-5.5":Yt("GPT-5.5")},xm=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],Nm=["qwen/qwen3-coder","qwen/qwen3-coder-plus","qwen/qwen3-coder-flash","qwen/qwen3.5-9b","qwen/qwen3.5-397b-a17b","qwen/qwen3.5-plus-20260420","qwen/qwen3.6-flash","qwen/qwen3.6-plus","qwen/qwen3.6-max-preview","qwen/qwen3.7-plus"]});import{existsSync as Om,mkdirSync as o0,readFileSync as Lm,writeFileSync as jm}from"node:fs";import{join as Wn,resolve as i0}from"node:path";function Rm(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:a0}}function l0(t,e){return JSON.stringify(t)===JSON.stringify(e)}function co(t){return structuredClone(t)}function Cm(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 Tl(t,e,r={existsSync:Om,readFileSync:Lm}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=i0(e,s.sessiondir??e);for(let i of c0(o)){let a=u0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Cm(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 c0(t){return[Wn(t,".opencode","opencode.jsonc"),Wn(t,"opencode.jsonc"),Wn(t,"opencode.json")]}function u0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(d0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function d0(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]!==`
973
+ `;)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 uo(t,e={}){let r=Wn(t,".opencode"),n=Wn(r,"opencode.json");if(Hr("lmctl","lmctl_chat",e),!Om(n)){o0(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:bl(),mcp:{lmctl:Rm()}},null,2);return jm(n,l+`
974
+ `,"utf-8"),!0}let s;try{s=JSON.parse(Lm(n,"utf-8"))}catch{return console.log(Am.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Am.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;s.permission===void 0&&(s.permission="allow",o=!0),Cm(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.`}),f0(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=Rm();return l0(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&jm(n,JSON.stringify(s,null,2)+`
975
+ `,"utf-8"),o}function f0(t){let e=bl(),r=jt(t.provider)?t.provider:{},n=!jt(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=co(o),n=!0;continue}if(!jt(i))continue;let a={...i};a.npm===void 0&&(a.npm=o.npm,n=!0),a.name===void 0&&(a.name=o.name,n=!0);let l=jt(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=co(d),n=!0);a.options=l;let c=jt(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models)){if(c[u]===void 0){c[u]=co(d),n=!0;continue}let f=c[u];if(jt(f)&&jt(d)){let m={...f};Mm(m,d)&&(c[u]=m,n=!0)}}a.models=c,r[s]=a}return n&&(t.provider=r),n}function jt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Mm(t,e){let r=!1;for(let[n,s]of Object.entries(e)){if(t[n]===void 0){t[n]=co(s),r=!0;continue}jt(t[n])&&jt(s)&&Mm(t[n],s)&&(r=!0)}return r}var Am,a0,fo=b(()=>{"use strict";je();Sl();ao();Am={yellow:t=>t},a0=864e5});import{spawn as m0}from"node:child_process";import{existsSync as p0}from"node:fs";import{createInterface as h0}from"node:readline";function _0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
976
976
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
977
977
  ${e}
978
978
 
979
- ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Mm(t.slice(n).trimStart())}return Mm(v0(t.replace(E0,"")))}function v0(t){let e=b0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(S0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Mm(t){let e=[...t.matchAll(T0)];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 Pm(t,e){let r=g0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{uo(e.cwd)}catch(x){Z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:x instanceof Error?x.message:String(x)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let x=qr("gemini","plan"),A=qr("gemini","yolo");a=a.filter(D=>!(A??[]).includes(D)),x&&a.push(...x)}else e.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
979
+ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Dm(t.slice(n).trimStart())}return Dm(v0(t.replace(E0,"")))}function v0(t){let e=b0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(S0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Dm(t){let e=[...t.matchAll(T0)];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 Fm(t,e){let r=g0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{uo(e.cwd)}catch(x){Z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:x instanceof Error?x.message:String(x)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let x=qr("gemini","plan"),A=qr("gemini","yolo");a=a.filter(D=>!(A??[]).includes(D)),x&&a.push(...x)}else e.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
980
980
  `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Vt(e.tool,a,l)}catch(x){return s(x)}if(e.model&&e.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
981
981
  `),e.cwd&&!p0(e.cwd))return Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=m0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,Z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),it(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),it(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=h0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1,T=!1;function E(x,A={}){return new Promise((D,C)=>{let H=y0++;m.set(H,{resolve:D,reject:C});let R=JSON.stringify({jsonrpc:"2.0",id:H,method:x,params:A});It({event:"acp_send",direction:"SEND",provider:e.tool,method:x,id:H,params:A}),c.stdin?.write(R+`
982
982
  `)})}f.on("line",x=>{let A;try{A=JSON.parse(x)}catch{return}if(It({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof A.id=="number"?A.id:void 0,method:typeof A.method=="string"?A.method:void 0,preview:JSON.stringify(A).slice(0,300)}),e.onEvent?.(A),typeof A.id=="number"&&m.has(A.id)){let C=m.get(A.id);if(m.delete(A.id),A.error){let H=A.error,R=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(A.error);C.reject(oo(`ACP RPC error: ${R}`,H))}else C.resolve(A);return}let D=A.method;if(D){if(typeof A.id=="number"){Z({event:"acp_unhandled_request",provider:e.tool,method:D,id:A.id,params:A.params});let C=JSON.stringify({jsonrpc:"2.0",id:A.id,error:{code:-32601,message:`Method not found: ${D} (lmctl does not implement server-side ACP methods)`}});It({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:A.id,error:"method not found"}),c.stdin?.write(C+`
@@ -984,35 +984,35 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length
984
984
  `)}(async()=>{try{if(await E("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),$("notifications/initialized"),e.sessionId)try{p=(await E("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(A){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${A instanceof Error?A.message:String(A)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
985
985
  `),p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),pt(`acp: set_config_option(model=${e.model}) ok`)}catch(A){let D=A instanceof Error?A.message:String(A);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${D}
986
986
  `)}if(e.effort&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),pt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(A){let D=A instanceof Error?A.message:String(A);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${D}
987
- `)}h="",T=!0,pt(`acp: prompt sent (${t.length} chars)`),g=(await E("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,pt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(x){it(c).catch(()=>{}),s(x instanceof Error?x:new Error(String(x)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var g0,y0,Dm,w0,E0,b0,S0,T0,Fm=b(()=>{"use strict";je();Br();io();Un();fo();je();Xt();g0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},y0=1,Dm="(?:png|jpe?g|webp|heic|pdf)",w0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Dm}\\s*`,"gi"),E0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Dm}\\s*`,"i"),b0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,S0=/^STANCE:\s+\S+\s*$/gim,T0=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Um(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=I0){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 x0(){let t=new Map;return(e,r)=>{N0(e,Um(t,r))}}function N0(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(he(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:he(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
987
+ `)}h="",T=!0,pt(`acp: prompt sent (${t.length} chars)`),g=(await E("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,pt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(x){it(c).catch(()=>{}),s(x instanceof Error?x:new Error(String(x)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var g0,y0,Pm,w0,E0,b0,S0,T0,Um=b(()=>{"use strict";je();Br();io();Un();fo();je();Xt();g0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},y0=1,Pm="(?:png|jpe?g|webp|heic|pdf)",w0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Pm}\\s*`,"gi"),E0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Pm}\\s*`,"i"),b0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,S0=/^STANCE:\s+\S+\s*$/gim,T0=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Wm(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=I0){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 x0(){let t=new Map;return(e,r)=>{N0(e,Wm(t,r))}}function N0(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(he(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:he(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
988
988
  `).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(`
989
- `).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 mo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?x0():void 0,s=await Em(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 $0(){let t=new Map;return(e,r)=>{j0(e,Um(t,r))}}function j0(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:he(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:he(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=he(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:he(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${he(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function Jr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&It({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?$0():void 0,s=await Pm(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 A0(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${he(i,120)}`}:{kind:"other",summary:`codex error: ${he(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:he(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:he(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:he(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:he(s)}:{kind:"text",summary:he(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
989
+ `).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 mo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?x0():void 0,s=await bm(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 $0(){let t=new Map;return(e,r)=>{j0(e,Wm(t,r))}}function j0(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:he(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:he(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=he(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:he(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${he(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function Jr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&It({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?$0():void 0,s=await Fm(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 A0(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${he(i,120)}`}:{kind:"other",summary:`codex error: ${he(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:he(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:he(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:he(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:he(s)}:{kind:"text",summary:he(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
990
990
  `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let o=s.split(`
991
- `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Wm(t,e){let r=await Tm(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=>A0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var I0,wr=b(()=>{"use strict";bm();km();Fm();je();I0=256});function vl(t){return new kl(t)}var kl,Il=b(()=>{"use strict";dm();Gt();wr();xt();kl=class extends Oe{constructor(e){super({provider:new to(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Ne,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:mo})}}});import{readdir as R0,stat as Bm,unlink as O0}from"node:fs/promises";import{join as Bn,basename as L0}from"node:path";function C0(t,e,r){return`${t}|${e.toISOString()}|${r}`}function qn(t,e,r){let n=C0(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function qm(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function M0(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 po(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 po(r)}).filter(r=>r.length>0).join(`
992
- `);try{return JSON.stringify(t)}catch{return String(t)}}async function Hm(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Fe(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=M0(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 ho,Jm=b(()=>{"use strict";Jt();ho=class{name="codex";codexDirs;constructor(e={}){let r=[Bn(Te,".codex"),Bn(Te,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Bn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Bn(r,"sessions");try{await Bm(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 R0(e)}catch{return r}for(let s of n){let o=Bn(e,s),i=await Bm(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=L0(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await Le(e,30),n=await xe(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=V(h.text.trim(),80)),u=V(h.text.trim(),80))}}if(!o)return null;let m=await Hm(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:qm(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 xe(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Fe(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=qm(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let T of _.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let E=T.text.trim();c||(c=V(E,80)),u=V(E,80),qn(s,m,{role:"user",timestamp:g,content:de(E)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&qn(s,m,{role:"assistant",timestamp:g,content:de(T.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let T of _.content)(T.type==="input_text"||T.type==="output_text")&&typeof T.text=="string"&&T.text&&qn(s,m,{role:"system",timestamp:g,content:de(T.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?de(po(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:de(po(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let T=_.summary.map(E=>po(E.text)).join(`
993
- `);T.trim()&&qn(s,m,{role:"thinking",timestamp:g,content:de(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&qn(s,m,{role:"thinking",timestamp:g,content:de(_)})}}if(!o)return null;let p=await Hm(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 O0(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Le(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function Nl(t){return new xl(t)}var xl,$l=b(()=>{"use strict";Jm();Gt();wr();xt();xl=class extends Oe{constructor(e){super({provider:new ho(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${Ne}
994
- `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Wm})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Hn(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 _o(t){let e=Hn(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(`
995
- `).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?D0(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 D0(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&Xm(t.tokens)&&Xm(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function Xm(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Gm(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(`
991
+ `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Bm(t,e){let r=await km(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=>A0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var I0,wr=b(()=>{"use strict";Sm();vm();Um();je();I0=256});function vl(t){return new kl(t)}var kl,Il=b(()=>{"use strict";fm();Gt();wr();xt();kl=class extends Oe{constructor(e){super({provider:new to(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Ne,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:mo})}}});import{readdir as R0,stat as qm,unlink as O0}from"node:fs/promises";import{join as Bn,basename as L0}from"node:path";function C0(t,e,r){return`${t}|${e.toISOString()}|${r}`}function qn(t,e,r){let n=C0(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Hm(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function M0(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 po(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 po(r)}).filter(r=>r.length>0).join(`
992
+ `);try{return JSON.stringify(t)}catch{return String(t)}}async function Jm(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Fe(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=M0(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 ho,Xm=b(()=>{"use strict";Jt();ho=class{name="codex";codexDirs;constructor(e={}){let r=[Bn(Te,".codex"),Bn(Te,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Bn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Bn(r,"sessions");try{await qm(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 R0(e)}catch{return r}for(let s of n){let o=Bn(e,s),i=await qm(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=L0(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await Le(e,30),n=await xe(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=V(h.text.trim(),80)),u=V(h.text.trim(),80))}}if(!o)return null;let m=await Jm(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:Hm(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 xe(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Fe(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Hm(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let T of _.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let E=T.text.trim();c||(c=V(E,80)),u=V(E,80),qn(s,m,{role:"user",timestamp:g,content:de(E)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&qn(s,m,{role:"assistant",timestamp:g,content:de(T.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let T of _.content)(T.type==="input_text"||T.type==="output_text")&&typeof T.text=="string"&&T.text&&qn(s,m,{role:"system",timestamp:g,content:de(T.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?de(po(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:de(po(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let T=_.summary.map(E=>po(E.text)).join(`
993
+ `);T.trim()&&qn(s,m,{role:"thinking",timestamp:g,content:de(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&qn(s,m,{role:"thinking",timestamp:g,content:de(_)})}}if(!o)return null;let p=await Jm(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 O0(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Le(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function Nl(t){return new xl(t)}var xl,$l=b(()=>{"use strict";Xm();Gt();wr();xt();xl=class extends Oe{constructor(e){super({provider:new ho(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${Ne}
994
+ `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Bm})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Hn(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 _o(t){let e=Hn(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(`
995
+ `).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?D0(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 D0(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&Gm(t.tokens)&&Gm(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function Gm(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Vm(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(`
996
996
  `)+`
997
- `}var jl=b(()=>{"use strict"});import{createHash as P0}from"node:crypto";import{readdir as Jn,readFile as Vm,stat as go,unlink as F0}from"node:fs/promises";import{join as He,basename as U0,dirname as W0}from"node:path";import{cwd as B0}from"node:process";function Km(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ym(t){return t==="user"}function Al(t){return t==="gemini"||t==="assistant"}function Er(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function q0(t){return`${t.sessionId}\0${t.cwd}`}function H0(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 yo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function zm(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Al(a.type)||!a.tokens)continue;let l=yo(a.tokens.input),c=yo(a.tokens.cached),u=Math.max(l-c,0),d=yo(a.tokens.output),f=yo(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 J0(t){return P0("sha256").update(t).digest("hex")}function Xn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=W0(r);if(n===r)break;r=n}}var wo,Zm=b(()=>{"use strict";Jt();jl();je();wo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||He(Te,".gemini");this.geminiProjectsFile=He(r,"projects.json"),this.geminiTmpDir=He(r,"tmp");let n=e.claudeDir||He(Te,".claude");this.claudeProjectsDir=He(n,"projects");let s=[He(Te,".codex"),He(Te,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>He(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=q0(s),i=r.get(o);r.set(o,i?H0(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 xe(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 _=Er(g.timestamp),T=g.type,E=de(Km(g.content));if(Ym(T)){let $=E.trim();$&&(u||(u=V($,80)),d=V($,80)),o.push({role:"user",timestamp:_,content:$||E});continue}if(Al(T)){g.model&&(f=g.model);for(let $ of g.thoughts||[]){let x=[$.subject,$.description].filter(Boolean).join(`
998
- `).trim();x&&o.push({role:"thinking",timestamp:Er($.timestamp,_),content:de(x)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let k=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${k}${E}`.trim()})}let m=Er(n.startTime,s.createdAt),p=Er(n.lastUpdated,s.modifiedAt),h=zm(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 xe(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(Ym(m.type)){d++;let p=Km(m.content).trim();p&&(l||(l=V(de(p),80)),c=V(de(p),80))}else Al(m.type)&&(d++,m.model&&(u=m.model));let f=zm(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:Er(r.startTime,n.createdAt),modifiedAt:Er(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 Vm(e,"utf-8");if(Hn(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 _o(r)}catch{return null}}extractSessionIdFromFilename(e){let r=U0(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 Jn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=He(this.geminiTmpDir,n,"chats");if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(He(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await F0(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 xe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Er(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;Xn(e,B0());for(let n of this.extraWorkspacePaths)Xn(e,n);for(let n of await this.collectGeminiProjectPaths())Xn(e,n);for(let n of await this.collectCodexCwds())Xn(e,n);for(let n of await this.collectClaudeCwds())Xn(e,n);let r=new Map;for(let n of e)r.set(J0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Vm(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Le(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await Jn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=He(this.claudeProjectsDir,n);if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=He(s,a),u=(await Le(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await go(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await Jn(e)}catch{return r}for(let o of s){let i=He(e,o),a=await go(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 X0,writeFileSync as G0,mkdirSync as V0}from"node:fs";import{join as K0,dirname as Y0}from"node:path";import{randomUUID as z0}from"node:crypto";function Ol(t){return new Rl(t)}var Rl,Ll=b(()=>{"use strict";Zm();Gt();wr();xt();jl();Rl=class extends Oe{constructor(e){super({provider:new wo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",Ne,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Jr(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(`
999
- `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:no,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=X0(n,"utf-8"),o=Hn(s),i=_o(s),a=z0();i.sessionId=a,i.kind="main";let l=Y0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=K0(l,d);return V0(l,{recursive:!0}),G0(f,Gm(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 Qm,readFile as Z0,rm as Q0,stat as Xr}from"node:fs/promises";import{basename as eI,join as at}from"node:path";function tI(t){let e={};for(let r of t.split(`
1000
- `)){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 br(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function rI(t){let e=0;for await(let r of Fe(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Eo,ep=b(()=>{"use strict";Jt();Eo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||at(Te,".copilot");this.sessionStateDir=at(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Qm(this.sessionStateDir)}catch{return e}for(let n of r){let s=at(this.sessionStateDir,n);if((await Xr(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=at(r,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(r,"workspace.yaml"),a=await xe(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||eI(r)||e;if(o)for await(let _ of Fe(s)){let T=br(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=br(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let E=_.data.content||"",k=E.trim();k&&(m||(m=V(k,80)),p=V(k,80)),l.push({role:"user",timestamp:T,content:de(k||E)});continue}if(_.type==="assistant.message"&&_.data){let E=(_.data.content||"").trim();if(E&&l.push({role:"assistant",timestamp:T,content:de(E),model:u}),_.data.toolRequests)for(let k of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:k.name||"unknown tool",toolName:k.name,toolInput:k.arguments?JSON.stringify(k.arguments,null,2):void 0,toolCallId:k.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let E=_.data.result?.content||"",k=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:de(E),toolDetailedContent:k?de(k):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:de(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let E=_.data?.message||"";E.trim()&&l.push({role:"system",timestamp:T,content:de(E)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=V(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??br(n?.created_at)??a.createdAt,modifiedAt:br(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=at(e,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(e,"workspace.yaml"),a=await xe(o?s:e),l=o?await Le(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=br(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let T=(_.data.content||"").trim();T&&(p||(p=V(T,80)),h=V(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=V(_,80))}let g=o?await rI(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??br(n?.created_at)??a.createdAt,modifiedAt:br(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=at(e,"workspace.yaml");try{let n=await Z0(r,"utf-8");return tI(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await Q0(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Qm(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=at(this.sessionStateDir,e);if((await Xr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=at(this.sessionStateDir,s);(await Xr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=at(this.sessionStateDir,s);if(!(await Xr(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 Cl(t){return new Oe({provider:new Eo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Ne,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>Jr(e,{...r,acpTool:"copilot"})})}var Ml=b(()=>{"use strict";ep();Gt();wr();xt()});import{existsSync as tp}from"node:fs";import{join as bo}from"node:path";import{createRequire as nI}from"node:module";function rp(){return Dl===null&&(Dl=nI(import.meta.url)("node:sqlite").DatabaseSync),Dl}function sI(){let t=process.env.XDG_DATA_HOME||bo(Te,".local","share"),e=process.env.XDG_CONFIG_HOME||bo(Te,".config");return[bo(t,"opencode","opencode.db"),bo(e,"opencode","opencode.db")]}var Dl,So,np=b(()=>{"use strict";Jt();Dl=null;So=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=sI().find(r=>tp(r))??null}openDb(){return!this.dbPath||!tp(this.dbPath)?null:new(rp())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
997
+ `}var jl=b(()=>{"use strict"});import{createHash as P0}from"node:crypto";import{readdir as Jn,readFile as Km,stat as go,unlink as F0}from"node:fs/promises";import{join as He,basename as U0,dirname as W0}from"node:path";import{cwd as B0}from"node:process";function Ym(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function zm(t){return t==="user"}function Al(t){return t==="gemini"||t==="assistant"}function Er(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function q0(t){return`${t.sessionId}\0${t.cwd}`}function H0(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 yo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Zm(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Al(a.type)||!a.tokens)continue;let l=yo(a.tokens.input),c=yo(a.tokens.cached),u=Math.max(l-c,0),d=yo(a.tokens.output),f=yo(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 J0(t){return P0("sha256").update(t).digest("hex")}function Xn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=W0(r);if(n===r)break;r=n}}var wo,Qm=b(()=>{"use strict";Jt();jl();je();wo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||He(Te,".gemini");this.geminiProjectsFile=He(r,"projects.json"),this.geminiTmpDir=He(r,"tmp");let n=e.claudeDir||He(Te,".claude");this.claudeProjectsDir=He(n,"projects");let s=[He(Te,".codex"),He(Te,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>He(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=q0(s),i=r.get(o);r.set(o,i?H0(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 xe(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 _=Er(g.timestamp),T=g.type,E=de(Ym(g.content));if(zm(T)){let $=E.trim();$&&(u||(u=V($,80)),d=V($,80)),o.push({role:"user",timestamp:_,content:$||E});continue}if(Al(T)){g.model&&(f=g.model);for(let $ of g.thoughts||[]){let x=[$.subject,$.description].filter(Boolean).join(`
998
+ `).trim();x&&o.push({role:"thinking",timestamp:Er($.timestamp,_),content:de(x)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let k=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${k}${E}`.trim()})}let m=Er(n.startTime,s.createdAt),p=Er(n.lastUpdated,s.modifiedAt),h=Zm(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 xe(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(zm(m.type)){d++;let p=Ym(m.content).trim();p&&(l||(l=V(de(p),80)),c=V(de(p),80))}else Al(m.type)&&(d++,m.model&&(u=m.model));let f=Zm(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:Er(r.startTime,n.createdAt),modifiedAt:Er(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 Km(e,"utf-8");if(Hn(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 _o(r)}catch{return null}}extractSessionIdFromFilename(e){let r=U0(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 Jn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=He(this.geminiTmpDir,n,"chats");if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(He(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await F0(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 xe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Er(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;Xn(e,B0());for(let n of this.extraWorkspacePaths)Xn(e,n);for(let n of await this.collectGeminiProjectPaths())Xn(e,n);for(let n of await this.collectCodexCwds())Xn(e,n);for(let n of await this.collectClaudeCwds())Xn(e,n);let r=new Map;for(let n of e)r.set(J0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Km(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Le(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await Jn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=He(this.claudeProjectsDir,n);if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=He(s,a),u=(await Le(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await go(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await Jn(e)}catch{return r}for(let o of s){let i=He(e,o),a=await go(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 X0,writeFileSync as G0,mkdirSync as V0}from"node:fs";import{join as K0,dirname as Y0}from"node:path";import{randomUUID as z0}from"node:crypto";function Ol(t){return new Rl(t)}var Rl,Ll=b(()=>{"use strict";Qm();Gt();wr();xt();jl();Rl=class extends Oe{constructor(e){super({provider:new wo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",Ne,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Jr(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(`
999
+ `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:no,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=X0(n,"utf-8"),o=Hn(s),i=_o(s),a=z0();i.sessionId=a,i.kind="main";let l=Y0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=K0(l,d);return V0(l,{recursive:!0}),G0(f,Vm(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 ep,readFile as Z0,rm as Q0,stat as Xr}from"node:fs/promises";import{basename as eI,join as at}from"node:path";function tI(t){let e={};for(let r of t.split(`
1000
+ `)){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 br(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function rI(t){let e=0;for await(let r of Fe(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Eo,tp=b(()=>{"use strict";Jt();Eo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||at(Te,".copilot");this.sessionStateDir=at(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await ep(this.sessionStateDir)}catch{return e}for(let n of r){let s=at(this.sessionStateDir,n);if((await Xr(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=at(r,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(r,"workspace.yaml"),a=await xe(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||eI(r)||e;if(o)for await(let _ of Fe(s)){let T=br(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=br(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let E=_.data.content||"",k=E.trim();k&&(m||(m=V(k,80)),p=V(k,80)),l.push({role:"user",timestamp:T,content:de(k||E)});continue}if(_.type==="assistant.message"&&_.data){let E=(_.data.content||"").trim();if(E&&l.push({role:"assistant",timestamp:T,content:de(E),model:u}),_.data.toolRequests)for(let k of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:k.name||"unknown tool",toolName:k.name,toolInput:k.arguments?JSON.stringify(k.arguments,null,2):void 0,toolCallId:k.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let E=_.data.result?.content||"",k=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:de(E),toolDetailedContent:k?de(k):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:de(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let E=_.data?.message||"";E.trim()&&l.push({role:"system",timestamp:T,content:de(E)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=V(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??br(n?.created_at)??a.createdAt,modifiedAt:br(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=at(e,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(e,"workspace.yaml"),a=await xe(o?s:e),l=o?await Le(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=br(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let T=(_.data.content||"").trim();T&&(p||(p=V(T,80)),h=V(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=V(_,80))}let g=o?await rI(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??br(n?.created_at)??a.createdAt,modifiedAt:br(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=at(e,"workspace.yaml");try{let n=await Z0(r,"utf-8");return tI(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await Q0(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await ep(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=at(this.sessionStateDir,e);if((await Xr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=at(this.sessionStateDir,s);(await Xr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=at(this.sessionStateDir,s);if(!(await Xr(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 Cl(t){return new Oe({provider:new Eo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Ne,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>Jr(e,{...r,acpTool:"copilot"})})}var Ml=b(()=>{"use strict";tp();Gt();wr();xt()});import{existsSync as rp}from"node:fs";import{join as bo}from"node:path";import{createRequire as nI}from"node:module";function np(){return Dl===null&&(Dl=nI(import.meta.url)("node:sqlite").DatabaseSync),Dl}function sI(){let t=process.env.XDG_DATA_HOME||bo(Te,".local","share"),e=process.env.XDG_CONFIG_HOME||bo(Te,".config");return[bo(t,"opencode","opencode.db"),bo(e,"opencode","opencode.db")]}var Dl,So,sp=b(()=>{"use strict";Jt();Dl=null;So=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=sI().find(r=>rp(r))??null}openDb(){return!this.dbPath||!rp(this.dbPath)?null:new(np())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1001
1001
  s.time_created, s.time_updated
1002
1002
  FROM session s
1003
1003
  ORDER BY s.time_updated DESC`).all(),o=[];for(let i of s){let a=r.get(i.project_id),l=i.directory||a?.worktree||"(unknown)",c=e.prepare(`SELECT m.id, m.data, m.time_created FROM message m
1004
1004
  WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(i.id),u=0,d,f,m,p=[];for(let g of c){let _;try{_=JSON.parse(g.data)}catch{continue}m||(m=_.model?.modelID||_.modelID),(_.role==="user"||_.role==="assistant")&&u++,_.role==="user"&&p.push(g.id)}let h=[...p.length>0?[p[0]]:[],...p.length>1?[p[p.length-1]]:[]];for(let g of h){let _=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g),T=this.extractText(_);T&&(d||(d=V(T,80)),f=V(T,80))}o.push({provider:"opencode",sessionId:i.id,slug:i.slug,cwd:l,createdAt:new Date(i.time_created),modifiedAt:new Date(i.time_updated),model:m,startCommand:"opencode",firstUserMessage:d,lastUserMessage:f,messageCount:u,filePath:this.dbPath})}return o}finally{e.close()}}async loadSession(e){let r=this.openDb();if(!r)return null;try{let n=this.findSessionRow(r,e);return n?this.buildSessionDetail(r,n):null}finally{r.close()}}buildSessionDetail(e,r){let n=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),s=r.directory||n?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1005
1005
  FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),i=[],a=0,l,c,u;for(let d of o){let f;try{f=JSON.parse(d.data)}catch{continue}l||(l=f.model?.modelID||f.modelID);let m=f.model?.modelID||f.modelID,p=new Date(f.time?.created||d.time_created),h=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(d.id);if(f.role==="user"){let g=this.extractText(h);g&&(c||(c=V(g,80)),u=V(g,80)),i.push({role:"user",timestamp:p,content:g||"(empty)"}),a++}else if(f.role==="assistant"){for(let g of h){let _;try{_=JSON.parse(g.data)}catch{continue}_.type==="text"&&_.text?i.push({role:"assistant",timestamp:p,content:_.text,model:m}):_.type==="reasoning"&&_.text?i.push({role:"thinking",timestamp:p,content:_.text}):_.type==="tool"&&_.tool&&(i.push({role:"tool_use",timestamp:p,content:`${_.tool}`,toolName:_.tool,toolCallId:_.callID,toolInput:_.state?.input?JSON.stringify(_.state.input):void 0}),(_.state?.output||_.state?.error)&&i.push({role:"tool_result",timestamp:p,content:_.state.error||_.state.output||"",toolCallId:_.callID}))}a++}}return{provider:"opencode",sessionId:r.id,slug:r.slug,cwd:s,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:l,startCommand:"opencode",firstUserMessage:c,lastUserMessage:u,messageCount:a,filePath:this.dbPath,messages:i}}extractText(e){let r=[];for(let n of e){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
1006
- `).trim()}async resolveSessionPath(e){if(!this.dbPath)return null;let r=this.openDb();if(!r)return null;try{return this.findSessionRow(r,e)?this.dbPath:null}finally{r.close()}}async deleteSession(e){if(!this.dbPath)return!1;let r=new(rp())(this.dbPath,{open:!0});try{let n=this.findSessionRow(r,e);return n?r.prepare("DELETE FROM session WHERE id = ?").run(n.id).changes>0:!1}finally{r.close()}}findSessionRow(e,r){let n=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1006
+ `).trim()}async resolveSessionPath(e){if(!this.dbPath)return null;let r=this.openDb();if(!r)return null;try{return this.findSessionRow(r,e)?this.dbPath:null}finally{r.close()}}async deleteSession(e){if(!this.dbPath)return!1;let r=new(np())(this.dbPath,{open:!0});try{let n=this.findSessionRow(r,e);return n?r.prepare("DELETE FROM session WHERE id = ?").run(n.id).changes>0:!1}finally{r.close()}}findSessionRow(e,r){let n=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1007
1007
  s.time_created, s.time_updated
1008
1008
  FROM session s WHERE s.id = ?`).get(r);if(n)return n;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1009
1009
  s.time_created, s.time_updated
1010
1010
  FROM session s
1011
1011
  WHERE s.id LIKE ?
1012
1012
  ORDER BY s.time_updated DESC
1013
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Fl(){return new Pl}var Pl,Ul=b(()=>{"use strict";np();Gt();wr();xt();Pl=class extends Oe{constructor(){super({provider:new So,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",Ne],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Jr(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??Ne),r}}});import{readdir as To,readFile as oI,rm as iI}from"node:fs/promises";import{basename as sp,join as zt}from"node:path";function op(t){return t.type==="user"||t.message?.role==="user"}function ip(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function ap(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(`
1013
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Fl(){return new Pl}var Pl,Ul=b(()=>{"use strict";sp();Gt();wr();xt();Pl=class extends Oe{constructor(){super({provider:new So,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",Ne],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Jr(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??Ne),r}}});import{readdir as To,readFile as oI,rm as iI}from"node:fs/promises";import{basename as op,join as zt}from"node:path";function ip(t){return t.type==="user"||t.message?.role==="user"}function ap(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function lp(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(`
1014
1014
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
1015
- `):"":""}function lp(t){return t.model||t.message?.model}var ko,cp=b(()=>{"use strict";Jt();ko=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||zt(Te,".qwen")}async discoverSessions(){let e=zt(this.baseDir,"projects"),r;try{r=await To(e)}catch{return[]}let n=[];for(let s of r){let o=zt(e,s,"chats"),i;try{i=await To(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=zt(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Le(e,30);if(n.length===0)return null;let s=await xe(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)),op(d)){let f=ap(d).trim();f&&(l||(l=V(f,80)),c=V(f,80)),u++}if(ip(d)){let f=lp(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=sp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await xe(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Fe(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(op(f)){let h=ap(f);h.trim()&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(ip(f)){let h=lp(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=zt(this.baseDir,"projects");try{let n=await To(r),s=[];for(let o of n){let i=zt(r,o,"chats",`${e}.jsonl`);try{return await oI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=zt(r,o,"chats"),a;try{a=await To(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;sp(l,".jsonl").startsWith(e)&&s.push(zt(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 iI(r),!0}catch{return!1}}}});function Bl(){return new Wl}var Wl,ql=b(()=>{"use strict";cp();Gt();wr();xt();Wl=class extends Oe{constructor(){super({provider:new ko,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Ne,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:mo})}}});import{readdir as up,readFile as aI,rm as dp,stat as fp}from"node:fs/promises";import{basename as Hl,join as At}from"node:path";async function lI(t){let e=await Promise.all(t.map(r=>xe(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 cI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function mp(t){return t.type==="USER_INPUT"}function pp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function uI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function hp(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function _p(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 dI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function fI(t){for await(let e of Fe(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=mI(s);if(o)return o}let n=pI(e.content);if(n)return n}return null}function mI(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 pI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function gp(t){if(t.endsWith(".db"))return Hl(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var vo,yp=b(()=>{"use strict";Jt();vo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||At(Te,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:At(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=At(this.baseDir,"conversations"),r;try{r=await up(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Hl(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return At(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return At(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await fp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await lI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Le(n,80);for(let f of d){let m=_p(f.content);if(m&&(a=m),mp(f)){let p=hp(f.content).trim();p&&(l||(l=V(p,80)),c=V(p,80)),u++}else pp(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=gp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Fe(o)){let d=cI(u.created_at,s.modifiedAt),f=_p(u.content);if(f&&(a=f),mp(u)){let m=hp(u.content),p=m.trim();p&&(l||(l=V(p,80)),c=V(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:dI(m.args),toolName:m.name||"tool"});pp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):uI(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 fp(r),r}catch{}let n=At(this.baseDir,"conversations");try{let s=[];for(let o of await up(n)){if(!o.endsWith(".db"))continue;Hl(o,".db").startsWith(e)&&s.push(At(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=gp(r);return n?(await dp(this.conversationPath(n),{force:!0}),await dp(At(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 fI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=At(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await aI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as hI}from"node:child_process";function Xl(t){return new Jl(t)}async function _I(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",yI(e.timeoutMs)];e.model&&n.push("--model",e.model),Vt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await gI(e.binary,n,{cwd:e.cwd,env:Ke(e.env,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function gI(t,e,r){return new Promise((n,s)=>{let o;try{o=hI(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 yI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Jl,Gl=b(()=>{"use strict";yp();Gt();xt();Xt();Un();Jl=class extends Oe{constructor(e){super({provider:new vo(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",Ne,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:_I})}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 wI}from"node:crypto";import{join as EI}from"node:path";function bI(t){return wI("sha256").update(t).digest("hex").slice(0,8)}function SI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function TI(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 kI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Io(t){return Math.max(1,Math.ceil(t.length/4))}function wp(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 Yl(){return new Kl}var Sr,Vl,Kl,zl=b(()=>{"use strict";Sr=new Map;Vl=class{name="ClaudeMock";async discoverSessions(){return[...Sr.values()].map(wp)}async loadSession(e){let r=Sr.get(e);return r===void 0?null:{...wp(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Sr.get(e)?.filePath??null}async deleteSession(e){return Sr.delete(e)}},Kl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Vl;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=SI(TI(e,r)),s=`mock-${n}-${bI(`${e}:${n}`)}`,o=new Date,i=Sr.get(s),a=r?.prompt??"ClaudeMock seed",l=Io(a),c={sessionId:s,cwd:e,filePath:EI(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+=Io("ACK: ClaudeMock seeded"),Sr.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=Sr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${kI(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+=Io(e),s.totalOutputTokens+=Io(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 gt(t){let e=[vl({claudeDir:t?.claudeDir}),Nl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ol({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Cl({copilotDir:t?.copilotDir}),Fl(),Bl(),Xl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Yl()),e}var Zl=b(()=>{"use strict";Il();$l();Ll();Ml();Ul();ql();Gl();zl();Il();$l();Ll();Ml();Ul();ql();Gl();zl()});var rc={};ce(rc,{ProviderRegistry:()=>Fn,TransportConnectionError:()=>we,TransportError:()=>Ye,TransportJsonError:()=>so,TransportProcessError:()=>Nt,TransportRpcError:()=>$t,_resetDefaultRegistryForTests:()=>vI,chat:()=>Tr,countTokens:()=>tc,createAdapterRegistry:()=>_t,createAllAdapters:()=>gt,listSessions:()=>ec,seed:()=>Ql});function No(){return xo===null&&(xo=_t(gt())),xo}function vI(){xo=null}function bp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Tr(t){let e=t.registry??No(),r=bp(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 Ql(t){let e=t.registry??No(),r=bp(e,t.provider),n=await Ep(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await Ep(e,t.provider,t.cwd),i=II(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Ep(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 II(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 ec(t={}){return(t.registry??No()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function tc(t){let r=await(t.registry??No()).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 xo,Rt=b(()=>{"use strict";pl();Zl();pl();Zl();Br();xo=null});function xI(){return nc===null&&(nc=_t(gt())),nc}async function Vr(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 $I(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Gr.delete(r),e.setMemberState(r,"idle");else{let i=NI(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function NI(t,e){if(!(t instanceof Ee))return Gr.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=(Gr.get(e)??0)+1;return r>=3?(Gr.delete(e),"consecutive_timeouts"):(Gr.set(e,r),null)}return Gr.delete(e),null}async function $I(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=xI(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ee("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,sc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${Sp(u)}`,sc(t.sessionid,t.sessiondir,"unresolved")))}let o=sc(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 Tr({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ee("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ee("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):jI(u,o)}finally{a!==null&&clearTimeout(a)}}function sc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Sp(t){return t instanceof Error?t.message:String(t)}function jI(t,e){if(t instanceof Ee)return t;if(t instanceof we){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ee("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ee("enoent",null,t.message,e):new Ee("other",null,t.message,e)}return t instanceof Nt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new Ee("other",null,t.message,e):new Ee("other",null,Sp(t),e)}var Ee,nc,Gr,Gn=b(()=>{"use strict";Rt();Ee=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},nc=null;Gr=new Map});function Tp(){return oc===null&&(oc=_t(gt())),oc}function RI(t,e){if(!AI.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function Kr(t){let e=RI(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await OI({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function OI(t){let e=t.member.provider,r=t.member.sessiondir,n=ic("seed",r,e);try{let s=await Ql({provider:e,cwd:r,registry:Tp()});if(!s.success)throw CI(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:ac(s,n)}}async function kp(t){return LI(t)}async function LI(t){let e=Tp(),r=ic("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new ke("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof ke?o:ac(o,r)}let s=ic("tokens",t.sessionid,n);try{let o=await tc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof ke?o:ac(o,s)}}function ic(t,e,r){return["<library>",t,e,"--provider",r]}function CI(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,e)}return new ke("other",null,r,e)}function ac(t,e){return t instanceof ke?t:t instanceof we?t.cause?.code==="ENOENT"?new ke("enoent",null,t.message,e):new ke("other",null,t.message,e):t instanceof Nt?new ke("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new ke("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new ke("other",null,t.message,e):new ke("other",null,t instanceof Error?t.message:String(t),e)}var ke,oc,AI,$o=b(()=>{"use strict";Rt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},oc=null;AI=/^provider[123]$/});function jo(t){return Buffer.from(t,"utf8").toString("base64url")}function Kn(t){return Buffer.from(t,"base64url").toString("utf8")}async function vp(t,e=r=>kp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of MI(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 Ip(t,e,r){let n=xp(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Vn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Vr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Np(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 lc(t,e,r){let n=xp(t,e,r);if(n===null)throw new Error("session member not found");let s=await Kr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Np(t,e,r)}}function MI(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function xp(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 Np(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Vn,Ao=b(()=>{"use strict";Gn();$o();Vn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function cc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??PI(e),s=r-n,o=e.query(`
1015
+ `):"":""}function cp(t){return t.model||t.message?.model}var ko,up=b(()=>{"use strict";Jt();ko=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||zt(Te,".qwen")}async discoverSessions(){let e=zt(this.baseDir,"projects"),r;try{r=await To(e)}catch{return[]}let n=[];for(let s of r){let o=zt(e,s,"chats"),i;try{i=await To(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=zt(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Le(e,30);if(n.length===0)return null;let s=await xe(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)),ip(d)){let f=lp(d).trim();f&&(l||(l=V(f,80)),c=V(f,80)),u++}if(ap(d)){let f=cp(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=op(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await xe(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Fe(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(ip(f)){let h=lp(f);h.trim()&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(ap(f)){let h=cp(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=zt(this.baseDir,"projects");try{let n=await To(r),s=[];for(let o of n){let i=zt(r,o,"chats",`${e}.jsonl`);try{return await oI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=zt(r,o,"chats"),a;try{a=await To(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;op(l,".jsonl").startsWith(e)&&s.push(zt(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 iI(r),!0}catch{return!1}}}});function Bl(){return new Wl}var Wl,ql=b(()=>{"use strict";up();Gt();wr();xt();Wl=class extends Oe{constructor(){super({provider:new ko,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Ne,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:mo})}}});import{readdir as dp,readFile as aI,rm as fp,stat as mp}from"node:fs/promises";import{basename as Hl,join as At}from"node:path";async function lI(t){let e=await Promise.all(t.map(r=>xe(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 cI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function pp(t){return t.type==="USER_INPUT"}function hp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function uI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function _p(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function gp(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 dI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function fI(t){for await(let e of Fe(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=mI(s);if(o)return o}let n=pI(e.content);if(n)return n}return null}function mI(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 pI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function yp(t){if(t.endsWith(".db"))return Hl(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var vo,wp=b(()=>{"use strict";Jt();vo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||At(Te,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:At(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=At(this.baseDir,"conversations"),r;try{r=await dp(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Hl(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return At(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return At(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await mp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await lI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Le(n,80);for(let f of d){let m=gp(f.content);if(m&&(a=m),pp(f)){let p=_p(f.content).trim();p&&(l||(l=V(p,80)),c=V(p,80)),u++}else hp(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=yp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Fe(o)){let d=cI(u.created_at,s.modifiedAt),f=gp(u.content);if(f&&(a=f),pp(u)){let m=_p(u.content),p=m.trim();p&&(l||(l=V(p,80)),c=V(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:dI(m.args),toolName:m.name||"tool"});hp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):uI(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 mp(r),r}catch{}let n=At(this.baseDir,"conversations");try{let s=[];for(let o of await dp(n)){if(!o.endsWith(".db"))continue;Hl(o,".db").startsWith(e)&&s.push(At(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=yp(r);return n?(await fp(this.conversationPath(n),{force:!0}),await fp(At(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 fI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=At(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await aI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as hI}from"node:child_process";function Xl(t){return new Jl(t)}async function _I(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",yI(e.timeoutMs)];e.model&&n.push("--model",e.model),Vt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await gI(e.binary,n,{cwd:e.cwd,env:Ke(e.env,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function gI(t,e,r){return new Promise((n,s)=>{let o;try{o=hI(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 yI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Jl,Gl=b(()=>{"use strict";wp();Gt();xt();Xt();Un();Jl=class extends Oe{constructor(e){super({provider:new vo(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",Ne,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:_I})}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 wI}from"node:crypto";import{join as EI}from"node:path";function bI(t){return wI("sha256").update(t).digest("hex").slice(0,8)}function SI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function TI(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 kI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Io(t){return Math.max(1,Math.ceil(t.length/4))}function Ep(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 Yl(){return new Kl}var Sr,Vl,Kl,zl=b(()=>{"use strict";Sr=new Map;Vl=class{name="ClaudeMock";async discoverSessions(){return[...Sr.values()].map(Ep)}async loadSession(e){let r=Sr.get(e);return r===void 0?null:{...Ep(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Sr.get(e)?.filePath??null}async deleteSession(e){return Sr.delete(e)}},Kl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Vl;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=SI(TI(e,r)),s=`mock-${n}-${bI(`${e}:${n}`)}`,o=new Date,i=Sr.get(s),a=r?.prompt??"ClaudeMock seed",l=Io(a),c={sessionId:s,cwd:e,filePath:EI(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+=Io("ACK: ClaudeMock seeded"),Sr.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=Sr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${kI(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+=Io(e),s.totalOutputTokens+=Io(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 gt(t){let e=[vl({claudeDir:t?.claudeDir}),Nl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ol({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Cl({copilotDir:t?.copilotDir}),Fl(),Bl(),Xl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Yl()),e}var Zl=b(()=>{"use strict";Il();$l();Ll();Ml();Ul();ql();Gl();zl();Il();$l();Ll();Ml();Ul();ql();Gl();zl()});var rc={};ce(rc,{ProviderRegistry:()=>Fn,TransportConnectionError:()=>we,TransportError:()=>Ye,TransportJsonError:()=>so,TransportProcessError:()=>Nt,TransportRpcError:()=>$t,_resetDefaultRegistryForTests:()=>vI,chat:()=>Tr,countTokens:()=>tc,createAdapterRegistry:()=>_t,createAllAdapters:()=>gt,listSessions:()=>ec,seed:()=>Ql});function No(){return xo===null&&(xo=_t(gt())),xo}function vI(){xo=null}function Sp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Tr(t){let e=t.registry??No(),r=Sp(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 Ql(t){let e=t.registry??No(),r=Sp(e,t.provider),n=await bp(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await bp(e,t.provider,t.cwd),i=II(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function bp(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 II(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 ec(t={}){return(t.registry??No()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function tc(t){let r=await(t.registry??No()).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 xo,Rt=b(()=>{"use strict";pl();Zl();pl();Zl();Br();xo=null});function xI(){return nc===null&&(nc=_t(gt())),nc}async function Vr(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 $I(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Gr.delete(r),e.setMemberState(r,"idle");else{let i=NI(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function NI(t,e){if(!(t instanceof Ee))return Gr.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=(Gr.get(e)??0)+1;return r>=3?(Gr.delete(e),"consecutive_timeouts"):(Gr.set(e,r),null)}return Gr.delete(e),null}async function $I(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=xI(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ee("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,sc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${Tp(u)}`,sc(t.sessionid,t.sessiondir,"unresolved")))}let o=sc(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 Tr({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ee("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ee("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):jI(u,o)}finally{a!==null&&clearTimeout(a)}}function sc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Tp(t){return t instanceof Error?t.message:String(t)}function jI(t,e){if(t instanceof Ee)return t;if(t instanceof we){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ee("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ee("enoent",null,t.message,e):new Ee("other",null,t.message,e)}return t instanceof Nt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new Ee("other",null,t.message,e):new Ee("other",null,Tp(t),e)}var Ee,nc,Gr,Gn=b(()=>{"use strict";Rt();Ee=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},nc=null;Gr=new Map});function kp(){return oc===null&&(oc=_t(gt())),oc}function RI(t,e){if(!AI.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function Kr(t){let e=RI(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await OI({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function OI(t){let e=t.member.provider,r=t.member.sessiondir,n=ic("seed",r,e);try{let s=await Ql({provider:e,cwd:r,registry:kp()});if(!s.success)throw CI(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:ac(s,n)}}async function vp(t){return LI(t)}async function LI(t){let e=kp(),r=ic("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new ke("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof ke?o:ac(o,r)}let s=ic("tokens",t.sessionid,n);try{let o=await tc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof ke?o:ac(o,s)}}function ic(t,e,r){return["<library>",t,e,"--provider",r]}function CI(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,e)}return new ke("other",null,r,e)}function ac(t,e){return t instanceof ke?t:t instanceof we?t.cause?.code==="ENOENT"?new ke("enoent",null,t.message,e):new ke("other",null,t.message,e):t instanceof Nt?new ke("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new ke("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new ke("other",null,t.message,e):new ke("other",null,t instanceof Error?t.message:String(t),e)}var ke,oc,AI,$o=b(()=>{"use strict";Rt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},oc=null;AI=/^provider[123]$/});function jo(t){return Buffer.from(t,"utf8").toString("base64url")}function Kn(t){return Buffer.from(t,"base64url").toString("utf8")}async function Ip(t,e=r=>vp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of MI(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 xp(t,e,r){let n=Np(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Vn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Vr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:$p(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 lc(t,e,r){let n=Np(t,e,r);if(n===null)throw new Error("session member not found");let s=await Kr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:$p(t,e,r)}}function MI(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Np(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 $p(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Vn,Ao=b(()=>{"use strict";Gn();$o();Vn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function cc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??PI(e),s=r-n,o=e.query(`
1016
1016
  SELECT
1017
1017
  isess.id AS interactive_session_id,
1018
1018
  isess.run_id,
@@ -1038,16 +1038,16 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length
1038
1038
  JOIN step s ON s.id = isess.step_id
1039
1039
  WHERE isess.status = 'waiting_agent'
1040
1040
  AND r.terminal_state IS NULL
1041
- `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=WI(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=FI(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:Ie(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,UI(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 PI(t){return $p(t.getConfig(Ro),DI)*1e3}function uc(t,e){return $p(t.getConfig(Oo),e)}function $p(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 FI(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function UI(t,e,r,n){return t.query(`SELECT * FROM attention
1041
+ `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=WI(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=FI(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:Ie(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,UI(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 PI(t){return jp(t.getConfig(Ro),DI)*1e3}function uc(t,e){return jp(t.getConfig(Oo),e)}function jp(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 FI(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function UI(t,e,r,n){return t.query(`SELECT * FROM attention
1042
1042
  WHERE kind = 'session_hung'
1043
1043
  AND run_id = ?
1044
- AND acknowledged_at IS NULL`,e).some(o=>{let i=jp(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function WI(t,e,r){let n=jp(t);return n===null?null:BI(n,e,r)??qI(n,e,r)}function BI(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(HI),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=kr(s.members)?s.members:null,i=o!==null&&kr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function qI(t,e,r){if(!kr(t.states))return null;let n=t.states[e]??t.states[r];if(!kr(n))return null;let s=n;if(!kr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function HI(t){return kr(t)}function jp(t){if(t===null)return null;try{let e=JSON.parse(t);return kr(e)?e:null}catch{return null}}function kr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ro,Oo,DI,dc=b(()=>{"use strict";Pe();Ro="monitor.session_hung.elapsed_threshold_seconds",Oo="monitor.session_hung.check_interval_ms",DI=600});function Co(t){let e=t.query(`
1044
+ AND acknowledged_at IS NULL`,e).some(o=>{let i=Ap(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function WI(t,e,r){let n=Ap(t);return n===null?null:BI(n,e,r)??qI(n,e,r)}function BI(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(HI),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=kr(s.members)?s.members:null,i=o!==null&&kr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function qI(t,e,r){if(!kr(t.states))return null;let n=t.states[e]??t.states[r];if(!kr(n))return null;let s=n;if(!kr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function HI(t){return kr(t)}function Ap(t){if(t===null)return null;try{let e=JSON.parse(t);return kr(e)?e:null}catch{return null}}function kr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ro,Oo,DI,dc=b(()=>{"use strict";Pe();Ro="monitor.session_hung.elapsed_threshold_seconds",Oo="monitor.session_hung.check_interval_ms",DI=600});function Co(t){let e=t.query(`
1045
1045
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1046
1046
  `),r={queued:Lo(e,"queued"),running:Lo(e,"running"),done:Lo(e,"done"),failed:Lo(e,"failed"),total:mc(e)},n=t.query(`
1047
1047
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
1048
1048
  `),s=t.query(`
1049
1049
  SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
1050
- `);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:mc(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:mc(s)},projects:fc(t,"project"),teams:fc(t,"team"),workflows:fc(t,"workflow")}}function Mo(t){return t.listProjects()}function Op(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function Do(t){return t.query(`
1050
+ `);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:mc(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:mc(s)},projects:fc(t,"project"),teams:fc(t,"team"),workflows:fc(t,"workflow")}}function Mo(t){return t.listProjects()}function Lp(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function Do(t){return t.query(`
1051
1051
  SELECT w.*
1052
1052
  FROM workflow w
1053
1053
  JOIN (
@@ -1056,10 +1056,10 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length
1056
1056
  GROUP BY name
1057
1057
  ) latest ON latest.name = w.name AND latest.version = w.version
1058
1058
  ORDER BY w.name ASC
1059
- `)}function Lp(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 Cp(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 Mp(t,e){return t.getSubmittedPr(e)}function Po(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Yr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function vr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:Po(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:JI(t,r.id)}}function JI(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Dp(t,r.id)}))}function pc(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:Dp(t,n.id)}}function Dp(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Ir(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 Pp(t,e,r){let n=pc(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 Fp(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 Up(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 Qt(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 Fo(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(`${Wp}
1059
+ `)}function Cp(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 Mp(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 Dp(t,e){return t.getSubmittedPr(e)}function Po(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Yr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function vr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:Po(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:JI(t,r.id)}}function JI(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Pp(t,r.id)}))}function pc(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:Pp(t,n.id)}}function Pp(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Ir(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 Fp(t,e,r){let n=pc(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 Up(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 Wp(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 Qt(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 Fo(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(`${Bp}
1060
1060
  WHERE ${n}
1061
- ORDER BY a.created_at DESC`,...r).map(Bp)}function yt(t,e){let n=t.query(`${Wp}
1062
- WHERE a.id = ?`,e)[0];return n===void 0?null:Bp(n)}function Bp(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 qp(t){return t.query(`
1061
+ ORDER BY a.created_at DESC`,...r).map(qp)}function yt(t,e){let n=t.query(`${Bp}
1062
+ WHERE a.id = ?`,e)[0];return n===void 0?null:qp(n)}function qp(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 Hp(t){return t.query(`
1063
1063
  SELECT w.name AS workflow_name, r.terminal_state, COUNT(*) AS count
1064
1064
  FROM run r
1065
1065
  JOIN workflow w ON w.id = r.workflow_id
@@ -1129,12 +1129,12 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length
1129
1129
  AND json_extract(payload, '$.elapsedMs') > 0
1130
1130
  AND payload_truncated = 0
1131
1131
  ORDER BY json_extract(payload, '$.tool') ASC,
1132
- 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 Hp(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 zr(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?Hp(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
1132
+ 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 Jp(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 zr(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?Jp(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
1133
1133
  FROM interactive_session
1134
1134
  WHERE run_id = ? AND status = 'waiting_operator'
1135
1135
  ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,T=l.get(g),E="pending",k=null;if(g.startsWith("@terminal:"))E=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?E=_&&u===g?"paused":"running":T.outcome===null?E="failed":E="done",T.ended_at!==null)){let $=Date.parse(T.started_at),x=Date.parse(T.ended_at);!Number.isNaN($)&&!Number.isNaN(x)&&(k=x-$)}_&&u===g&&(E="paused"),h.push({id:g,status:E,is_current:_,elapsed_ms:k,prompt:_&&E==="paused"?f:null,expected:_&&E==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function Uo(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(...XI(o));return`${e.join(`
1136
1136
  `)}
1137
- `}function XI(t){let e=[],r=GI(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 GI(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Wo(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?Hp(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=$=>c.schema==="v3"&&c.nameToId.has($)?c.nameToId.get($):$,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let $ of d)f.set(u($.state_name),$);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let $ of m)p.set(u($.state_name),$);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 $ of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1137
+ `}function XI(t){let e=[],r=GI(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 GI(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Wo(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?Jp(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=$=>c.schema==="v3"&&c.nameToId.has($)?c.nameToId.get($):$,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let $ of d)f.set(u($.state_name),$);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let $ of m)p.set(u($.state_name),$);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 $ of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1138
1138
  FROM session_event
1139
1139
  WHERE run_id = ? AND step_id IS NOT NULL
1140
1140
  GROUP BY step_id`,e))$.step_id!==null&&h.set($.step_id,$.timestamp_ms);let _=VI(c,d,u),T=KI(s.current_state),E=t.query(`SELECT kind, severity, payload
@@ -1142,9 +1142,9 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length
1142
1142
  WHERE run_id = ?
1143
1143
  AND kind = 'session_hung'
1144
1144
  AND acknowledged_at IS NULL
1145
- ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:rx($.payload)})),k=_.map($=>{let x=f.get($),A=p.get($),D=YI(s,$,T,x,A),C=x===void 0?null:Date.parse(x.started_at),H=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),R=x===void 0||Number.isNaN(C??NaN)?null:H!==null&&!Number.isNaN(H)?H-C:D==="running"||D==="paused"?n-C:null,U=x===void 0?null:h.get(x.id)??null,z=nx(A?.last_activity_at??null,U,g),v=o===null||A===void 0?void 0:QI(t,s.team_id,o.definition,A.state_name,x?.state_name??$);return{step_id:x?.id??null,state_id:$,status:D,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:z,elapsed_ms:R,...v!==void 0?{member:v}:{},...A!==void 0?{interactive_session:{id:A.id,status:A.status,turn_count:A.turn_count,state_name:A.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:ZI(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:zI(k,s.terminal_state!==null),related_attentions:E}}function Bo(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} (${Rp(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Ap(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Ap(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${qo(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 ${Rp(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}${sx(a.payload)}`)}return`${n.join(`
1145
+ ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:rx($.payload)})),k=_.map($=>{let x=f.get($),A=p.get($),D=YI(s,$,T,x,A),C=x===void 0?null:Date.parse(x.started_at),H=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),R=x===void 0||Number.isNaN(C??NaN)?null:H!==null&&!Number.isNaN(H)?H-C:D==="running"||D==="paused"?n-C:null,U=x===void 0?null:h.get(x.id)??null,z=nx(A?.last_activity_at??null,U,g),v=o===null||A===void 0?void 0:QI(t,s.team_id,o.definition,A.state_name,x?.state_name??$);return{step_id:x?.id??null,state_id:$,status:D,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:z,elapsed_ms:R,...v!==void 0?{member:v}:{},...A!==void 0?{interactive_session:{id:A.id,status:A.status,turn_count:A.turn_count,state_name:A.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:ZI(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:zI(k,s.terminal_state!==null),related_attentions:E}}function Bo(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} (${Op(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Rp(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Rp(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${qo(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 ${Op(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}${sx(a.payload)}`)}return`${n.join(`
1146
1146
  `)}
1147
- `}function VI(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 KI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function YI(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 zI(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 ZI(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 QI(t,e,r,n,s){let o=ex(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:Ie(i)}}function ex(t,e,r){let n=tx(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Zt(a)?a.id===e||a.name===e||a.name===r:!1),o=Zt(s?.members)?s.members:null,i=o!==null&&Zt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Zt(n.states)){let s=n.states[e]??n.states[r];if(!Zt(s))return null;let o=Zt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function tx(t){try{let e=JSON.parse(t);return Zt(e)?e:null}catch{return null}}function rx(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Zt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function nx(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Ap(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${qo(Math.max(0,n-r)).padEnd(6)}]`}function Rp(t,e){return Number.isNaN(t)?"?":qo(Math.max(0,e-t))}function qo(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 sx(t){if(!Zt(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${qo(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Wp,Ot=b(()=>{"use strict";Pe();Wp=`SELECT a.id AS attention_id,
1147
+ `}function VI(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 KI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function YI(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 zI(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 ZI(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 QI(t,e,r,n,s){let o=ex(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:Ie(i)}}function ex(t,e,r){let n=tx(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Zt(a)?a.id===e||a.name===e||a.name===r:!1),o=Zt(s?.members)?s.members:null,i=o!==null&&Zt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Zt(n.states)){let s=n.states[e]??n.states[r];if(!Zt(s))return null;let o=Zt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function tx(t){try{let e=JSON.parse(t);return Zt(e)?e:null}catch{return null}}function rx(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Zt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function nx(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Rp(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${qo(Math.max(0,n-r)).padEnd(6)}]`}function Op(t,e){return Number.isNaN(t)?"?":qo(Math.max(0,e-t))}function qo(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 sx(t){if(!Zt(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${qo(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Bp,Ot=b(()=>{"use strict";Pe();Bp=`SELECT a.id AS attention_id,
1148
1148
  a.kind AS kind,
1149
1149
  a.severity AS severity,
1150
1150
  a.created_at AS created_at,
@@ -1166,11 +1166,11 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length
1166
1166
  ON isess.run_id = a.run_id
1167
1167
  AND isess.id = (
1168
1168
  SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
1169
- )`});var ih={};ce(ih,{parseApiArgs:()=>Kp,readApiClientConfig:()=>zn,runApi:()=>ux});import{readFileSync as ox}from"node:fs";import{basename as ix,extname as ax}from"node:path";async function ux(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(cx),0;if(t[0]==="config")return fx(t.slice(1),e);let r=sh(t,"--direct");if(r.rest[0]==="escalations")return mx(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Xo(r.rest.slice(2)))return e.stdout.write(`${gx}
1169
+ )`});var ah={};ce(ah,{parseApiArgs:()=>Yp,readApiClientConfig:()=>zn,runApi:()=>ux});import{readFileSync as ox}from"node:fs";import{basename as ix,extname as ax}from"node:path";async function ux(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(cx),0;if(t[0]==="config")return fx(t.slice(1),e);let r=oh(t,"--direct");if(r.rest[0]==="escalations")return mx(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Xo(r.rest.slice(2)))return e.stdout.write(`${gx}
1170
1170
  `),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
1171
1171
  `),2):dN(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Xo(r.rest.slice(2)))return e.stdout.write(`${hx}
1172
1172
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Xo(r.rest.slice(2)))return e.stdout.write(`${_x}
1173
- `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?aN(r.rest.slice(2),e):lN(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?cN(r.rest.slice(2),e):uN(r.rest.slice(2),e);if(r.present)return Xx(r.rest,e);let n=Kp(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1173
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?aN(r.rest.slice(2),e):lN(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?cN(r.rest.slice(2),e):uN(r.rest.slice(2),e);if(r.present)return Xx(r.rest,e);let n=Yp(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1174
1174
  `),2;let s=xr(e),o=s.baseUrl,i=er(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=vx(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1175
1175
  `),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)}
1176
1176
  `),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
@@ -1181,7 +1181,7 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length
1181
1181
  `):e.stdout.write(`${JSON.stringify(f)}
1182
1182
  `)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1183
1183
  `):(e.stdout.write(await l.text()),e.stdout.write(`
1184
- `));return 0}function Kp(t){let e=Zp(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"?Jo(o,"/api/status",n):s==="projects"?Jo(o,"/api/projects",n):s==="teams"?Jo(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?Cx(o.slice(1),e.format):Jo(o,"/api/workflows",n):s==="workflow"?Lx(o,n):s==="upload"?Rx(o,n):s==="submit-job"?Ox(o,n):s==="issues"?Ax(o,n):s==="jobs"?Yn(o,"--status","/api/jobs","status",n):s==="job"?jx(o,n):s==="project"?Mx(o,n):s==="artifact"?Fx(o,n):s==="runs"?Yn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Yn(o,"--type","/api/external-objects","type",n):s==="external-signals"?Xp(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?Ux(o,n):Xp(o,"--unacked","/api/attentions","unacked",n):s==="stats"?Wx(o,n):s==="daemon"?Bx(o,n):s==="intake"?qx(o,n):s==="session"?Hx(o,n):s==="run"?Jx(o,e.format):s==="prs"?Yn(o,"--status","/api/submitted-prs","status",n):s==="pr"?Nx(o,n):`unknown subcommand: ${s}`}function er(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function xr(t){if(t.dal!==void 0)return zn(t.dal,process.env,t);let e=pe({path:ue()});try{return zn(e,process.env,t)}finally{e.close()}}function zn(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=lx;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: ${dx(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1184
+ `));return 0}function Yp(t){let e=Qp(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"?Jo(o,"/api/status",n):s==="projects"?Jo(o,"/api/projects",n):s==="teams"?Jo(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?Cx(o.slice(1),e.format):Jo(o,"/api/workflows",n):s==="workflow"?Lx(o,n):s==="upload"?Rx(o,n):s==="submit-job"?Ox(o,n):s==="issues"?Ax(o,n):s==="jobs"?Yn(o,"--status","/api/jobs","status",n):s==="job"?jx(o,n):s==="project"?Mx(o,n):s==="artifact"?Fx(o,n):s==="runs"?Yn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Yn(o,"--type","/api/external-objects","type",n):s==="external-signals"?Gp(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?Ux(o,n):Gp(o,"--unacked","/api/attentions","unacked",n):s==="stats"?Wx(o,n):s==="daemon"?Bx(o,n):s==="intake"?qx(o,n):s==="session"?Hx(o,n):s==="run"?Jx(o,e.format):s==="prs"?Yn(o,"--status","/api/submitted-prs","status",n):s==="pr"?Nx(o,n):`unknown subcommand: ${s}`}function er(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function xr(t){if(t.dal!==void 0)return zn(t.dal,process.env,t);let e=pe({path:ue()});try{return zn(e,process.env,t)}finally{e.close()}}function zn(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=lx;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: ${dx(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1185
1185
  `);return{baseUrl:o,token:a}}function dx(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 fx(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1186
1186
  `),2;let s=e.dal===void 0,o=e.dal??pe({path:ue()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
1187
1187
  `),2;let i=n[0];if(!Ho.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Ho].join(", ")})
@@ -1190,18 +1190,18 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length
1190
1190
  `),0)}if(r==="set"){if(n.length!==2)return e.stderr.write(`usage: lmctl api config set <key> <value>
1191
1191
  `),2;let[i,a]=n;if(!Ho.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Ho].join(", ")})
1192
1192
  `),2;let l=kx(i,a);return l!==null?(e.stderr.write(`error: ${l}
1193
- `),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${Jp(i,a,!1)}
1193
+ `),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${Xp(i,a,!1)}
1194
1194
  `),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}
1195
1195
  `),2}let a=o.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return e.stdout.write(`(no config rows)
1196
- `),0;for(let c of l)e.stdout.write(`${c} = ${Jp(c,a[c],i)}
1196
+ `),0;for(let c of l)e.stdout.write(`${c} = ${Xp(c,a[c],i)}
1197
1197
  `);return 0}return e.stderr.write(`error: unknown api config verb: ${r}
1198
1198
  `),2}finally{s&&o.close()}}async function mx(t,e,r){if(Xo(t))return e.stdout.write(`${px}
1199
- `),0;let n=sh(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>
1199
+ `),0;let n=oh(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>
1200
1200
  `),2):s?yx(i,a,e):i==="list"?Ex(a,e):i==="show"?Sx(a,e):i==="respond"?Tx(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
1201
- `),2)}function Xo(t){return t.some(e=>e==="--help"||e==="-h")}function yx(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:ue()});try{return oh(s,[t,...e],r)}finally{n&&s.close()}}function Yp(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=wx(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return ne(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function wx(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 Ex(t,e){let r=Yp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1201
+ `),2)}function Xo(t){return t.some(e=>e==="--help"||e==="-h")}function yx(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:ue()});try{return ih(s,[t,...e],r)}finally{n&&s.close()}}function zp(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=wx(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return ne(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function wx(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 Ex(t,e){let r=zp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1202
1202
  `),2;let n=xr(e),s=er("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)}
1203
1203
  `),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1204
- `),a.status===400?2:1;let l=await a.json();return zp(l,r.json,e)}function zp(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
1204
+ `),a.status===400?2:1;let l=await a.json();return Zp(l,r.json,e)}function Zp(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
1205
1205
  `),0;if(t.length===0)return r.stdout.write(`No pending escalations.
1206
1206
  `),0;r.stdout.write(`${t.length} pending escalation${t.length===1?"":"s"}:
1207
1207
 
@@ -1224,32 +1224,32 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length
1224
1224
  `),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
1225
1225
  `),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
1226
1226
  `):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
1227
- `),0}function Jp(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function kx(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===Ro||t===Oo){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function vx(t,e){let r=ox(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Ix(t)}),ix(t)),e!==void 0&&s.append("project",e),s}function Ix(t){switch(ax(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 xx(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 Nx(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Yn(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 Zp(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 Jo(t,e,r){return t.length>0?ne(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Yn(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function Xp(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return ne(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function $x(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=se(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function jx(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return $x([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;o=p}else if(f==="--source")i=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return ne(f)}if(s===void 0&&o===void 0)return"usage: lmctl api job enqueue --project NAME [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=gc(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function Ax(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return ne(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?Qp(n,e):r==="claim"?eh(n,e):r==="claim-next"?th(n,e):r==="close"?rh(n,e):r==="reopen"?nh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Qp(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=gc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function eh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=se(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return ne(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function th(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(i)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function rh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=se(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function nh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Rx(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return ne(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function Ox(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return ne(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function gc(t){try{return JSON.parse(t)}catch{return t}}function Lx(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 Cx(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ne(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function Mx(t,e){let[r,n,...s]=t;return r==="workflow"?Dx([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 Dx(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=se(n[0],"id");if(typeof s=="string")return s;let o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=Px(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 Px(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=gc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(i)}return{project:e,body:s}}function Fx(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=se(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return ne(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function Ux(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=se(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function Wx(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 Bx(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 qx(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 Hx(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=jo(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function Jx(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=se(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=se(n,"run_id");if(typeof i=="string")return i;let a=se(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return ne(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function se(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ne(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function sh(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 Xx(t,e){let r=Zp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1227
+ `),0}function Xp(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function kx(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===Ro||t===Oo){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function vx(t,e){let r=ox(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Ix(t)}),ix(t)),e!==void 0&&s.append("project",e),s}function Ix(t){switch(ax(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 xx(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 Nx(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Yn(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 Qp(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 Jo(t,e,r){return t.length>0?ne(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Yn(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function Gp(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return ne(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function $x(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=se(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function jx(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return $x([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;o=p}else if(f==="--source")i=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return ne(f)}if(s===void 0&&o===void 0)return"usage: lmctl api job enqueue (--project NAME | --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=gc(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function Ax(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 ne(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?eh(n,e):r==="claim"?th(n,e):r==="claim-next"?rh(n,e):r==="close"?nh(n,e):r==="reopen"?sh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function eh(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=gc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function th(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=se(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return ne(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function rh(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(i)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function nh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=se(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function sh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Rx(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return ne(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function Ox(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return ne(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function gc(t){try{return JSON.parse(t)}catch{return t}}function Lx(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 Cx(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ne(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function Mx(t,e){let[r,n,...s]=t;return r==="workflow"?Dx([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 Dx(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=se(n[0],"id");if(typeof s=="string")return s;let o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=Px(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 Px(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=gc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(i)}return{project:e,body:s}}function Fx(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=se(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return ne(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function Ux(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=se(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function Wx(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 Bx(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 qx(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 Hx(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=jo(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function Jx(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=se(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=se(n,"run_id");if(typeof i=="string")return i;let a=se(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return ne(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function se(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ne(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function oh(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 Xx(t,e){let r=Qp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1228
1228
  `),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)
1229
1229
  `),2;let a=e.dal===void 0,l=e.dal??pe({path:ue()});try{if(o==="issues"){let[c,...u]=i;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1230
1230
  `),2):c==="create"?Gx(l,u,e,s):c==="claim"?Vx(l,u,e,s):c==="claim-next"?Kx(l,u,e,s):c==="close"?Yx(l,u,e,s):c==="reopen"?zx(l,u,e,s):c==="list"?tN(l,u,e,s):c==="show"?rN(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1231
- `),2)}return o==="status"?nN(l,i,e,s):o==="projects"?sN(l,i,e,s):o==="workflows"?oN(l,i,e,s):o==="runs"?iN(l,i,e,s):o==="attentions"||o==="attention"?fN(l,i,e,s):o==="escalations"?oh(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1231
+ `),2)}return o==="status"?nN(l,i,e,s):o==="projects"?sN(l,i,e,s):o==="workflows"?oN(l,i,e,s):o==="runs"?iN(l,i,e,s):o==="attentions"||o==="attention"?fN(l,i,e,s):o==="escalations"?ih(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1232
1232
  `),2)}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
1233
1233
  `),1}finally{a&&l.close()}}function Je(t,e,r){t.stdout.write(`${r?JSON.stringify(e,null,2):JSON.stringify(e)}
1234
- `)}function Gx(t,e,r,n){let s=Qp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1234
+ `)}function Gx(t,e,r,n){let s=eh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1235
1235
  `),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
1236
1236
  `),1;let a=JSON.parse(s.body),l=Zx(a.severity);if(typeof l=="object"&&l!==null&&"error"in l)return r.stderr.write(`error: ${l.error}
1237
1237
  `),2;let c=Qx(a.labels);if(typeof c=="string"&&c.startsWith("error:"))return r.stderr.write(`error: ${c.slice(6)}
1238
- `),2;let u=t.createIssue({project_id:i.id,title:a.title,body:a.body,...l!==void 0?{severity:l}:{},labels:c,ai_test_path:typeof a.ai_test_path=="string"?a.ai_test_path:null,source_run_id:typeof a.source_run_id=="number"?a.source_run_id:null});return Je(r,u,n),0}function Vx(t,e,r,n){let s=eh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1238
+ `),2;let u=t.createIssue({project_id:i.id,title:a.title,body:a.body,...l!==void 0?{severity:l}:{},labels:c,ai_test_path:typeof a.ai_test_path=="string"?a.ai_test_path:null,source_run_id:typeof a.source_run_id=="number"?a.source_run_id:null});return Je(r,u,n),0}function Vx(t,e,r,n){let s=th(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1239
1239
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/claim$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1240
1240
  `),1;let l=t.claimIssue(o,i.assigned_run_id);return l===null?(r.stderr.write(`error: issue ${o} is not in a claimable state (status=${a.status})
1241
- `),1):(Je(r,l,n),0)}function Kx(t,e,r,n){let s=th(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1241
+ `),1):(Je(r,l,n),0)}function Kx(t,e,r,n){let s=rh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1242
1242
  `),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues\/claim-next$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
1243
- `),1;let a=JSON.parse(s.body),l=t.claimNextIssue(i.id,a.assigned_run_id);return l===null?(Je(r,{status:"queue_empty"},n),1):(Je(r,l,n),0)}function Yx(t,e,r,n){let s=rh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1243
+ `),1;let a=JSON.parse(s.body),l=t.claimNextIssue(i.id,a.assigned_run_id);return l===null?(Je(r,{status:"queue_empty"},n),1):(Je(r,l,n),0)}function Yx(t,e,r,n){let s=nh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1244
1244
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/close$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1245
1245
  `),1;let l=typeof i.closed_run_id=="number"?i.closed_run_id:a.assigned_run_id;if(l===null)return r.stderr.write(`error: missing closed_run_id
1246
- `),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Je(r,c,n),0}function zx(t,e,r,n){let s=nh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1246
+ `),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Je(r,c,n),0}function zx(t,e,r,n){let s=sh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1247
1247
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/reopen$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1248
1248
  `),1;let l=typeof i.source_run_id=="number"?i.source_run_id:a.closed_run_id??a.source_run_id;if(l===null)return r.stderr.write(`error: missing source_run_id
1249
- `),2;let c=t.reopenIssue(o,l);return Je(r,c,n),0}function Zx(t){if(t!=null)return typeof t=="string"&&Vp.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function Qx(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 tN(t,e,r,n){let[s,...o]=e;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1249
+ `),2;let c=t.reopenIssue(o,l);return Je(r,c,n),0}function Zx(t){if(t!=null)return typeof t=="string"&&Kp.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function Qx(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 tN(t,e,r,n){let[s,...o]=e;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1250
1250
  `),2;let i,a,l;for(let d=0;d<o.length;d+=1){let f=o[d],m=o[++d];if(m===void 0||m.startsWith("--"))return r.stderr.write(`error: missing value for ${f}
1251
- `),2;if(f==="--status"){let p=Gp(m,eN);if(typeof p=="string")return r.stderr.write(`error: ${p}
1252
- `),2;i=p}else if(f==="--severity"){let p=Gp(m,Vp);if(typeof p=="string")return r.stderr.write(`error: ${p}
1251
+ `),2;if(f==="--status"){let p=Vp(m,eN);if(typeof p=="string")return r.stderr.write(`error: ${p}
1252
+ `),2;i=p}else if(f==="--severity"){let p=Vp(m,Kp);if(typeof p=="string")return r.stderr.write(`error: ${p}
1253
1253
  `),2;a=p}else if(f==="--ai-test-path")l=m;else return r.stderr.write(`error: ${ne(f)}
1254
1254
  `),2}let c=t.findProjectByName(s);if(c===null)return r.stderr.write(`error: project not found: ${s}
1255
1255
  `),1;let u=t.listIssues(c.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Je(r,u,n),0}function rN(t,e,r,n){if(e.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
@@ -1291,9 +1291,9 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length
1291
1291
  `):(e.stdout.write(await i.text()),i.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1292
1292
  `)),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1293
1293
  `),i.status===400?2:1)}function fN(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${ne(o)}
1294
- `),2}return Je(r,Qt(t,{unacked:s}),n),0}function oh(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1295
- `),2;if(n==="list"){let o=Yp(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
1296
- `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=Fo(t,i);return zp(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]
1294
+ `),2}return Je(r,Qt(t,{unacked:s}),n),0}function ih(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1295
+ `),2;if(n==="list"){let o=zp(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
1296
+ `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=Fo(t,i);return Zp(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]
1297
1297
  `),2;let i=se(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1298
1298
  `),2;let a=yt(t,i);return a===null?(r.stderr.write(`error: escalation not found: ${i}
1299
1299
  `),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
@@ -1311,12 +1311,12 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length
1311
1311
  `),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})
1312
1312
  `),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)}
1313
1313
  `):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1314
- `),0}function Gp(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 lx,cx,Vp,Ho,px,hx,_x,gx,eN,yc=b(()=>{"use strict";Pe();Ve();Ao();dc();Ot();lx="http://127.0.0.1:8787",cx=`usage: lmctl api [--direct] <subcommand> ...
1314
+ `),0}function Vp(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 lx,cx,Kp,Ho,px,hx,_x,gx,eN,yc=b(()=>{"use strict";Pe();Ve();Ao();dc();Ot();lx="http://127.0.0.1:8787",cx=`usage: lmctl api [--direct] <subcommand> ...
1315
1315
 
1316
1316
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1317
1317
  workflow shellstep-safe commands also support --direct to use the local DAL
1318
1318
  without an HTTP round trip.
1319
- `,Vp=["low","medium","high","critical"];Ho=new Set(["api.url","api.port","api.token","project.docroot",Ro,Oo]);px=`usage: lmctl api escalations <list|show|respond>
1319
+ `,Kp=["low","medium","high","critical"];Ho=new Set(["api.url","api.port","api.token","project.docroot",Ro,Oo]);px=`usage: lmctl api escalations <list|show|respond>
1320
1320
 
1321
1321
  list [--project P] [--all] [--since DURATION] [--json]
1322
1322
  Print pending operator escalations (interactive_waiting_operator
@@ -1328,7 +1328,7 @@ without an HTTP round trip.
1328
1328
  single-record output is always JSON.
1329
1329
 
1330
1330
  respond <attention_id> "<answer>" [--done] [--json]
1331
- Reply to an interactive escalation. --done ends the chat.`,hx=`usage: lmctl api run where <run_id> [--json|--text]
1331
+ Reply to an interactive escalation. --done ends the chat.`,hx=`usage: lmctl api run where <run_id> [--json]
1332
1332
 
1333
1333
  Print the workflow-position view (which state of which workflow the run is
1334
1334
  at, and any pending operator prompt). Default output is the TTY tree; --json
@@ -1341,7 +1341,7 @@ without an HTTP round trip.
1341
1341
 
1342
1342
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1343
1343
  and report the first step that would be started. Default output is the TTY
1344
- table; --json emits the structured WorkflowVerifyReport payload.`;eN=["open","assigned","closed","reopened"]});import{existsSync as ah,mkdirSync as pN,readdirSync as hN,readFileSync as lh,writeFileSync as _N}from"node:fs";import{join as Zr}from"node:path";import{fileURLToPath as gN}from"node:url";function Zn(t){try{return yN.some(e=>ah(Zr(t,e)))}catch{return!1}}function wN(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 Go(t,e){t.durable_memory_mode!=="db"?EN(t):bN(t,e)}function ch(t){let e=Zn(t),r;try{r=hN(wc).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function EN(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Zr(e,"durable-memory");try{pN(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=ch(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Zr(r,i);if(!ah(a))try{let l=lh(Zr(wc,o),"utf8");_N(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 bN(t,e){let r=t.local_path??"",n=ch(r),s=[];for(let o of n){let i=Zr(wc,o),a;try{a=lh(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=wN(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var wc,yN,Qn=b(()=>{"use strict";wc=Zr(gN(import.meta.url),"../../config/durable_memory_templates"),yN=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as SN,mkdirSync as TN,readdirSync as kN,readFileSync as vN,writeFileSync as IN}from"node:fs";import{join as Vo}from"node:path";import{fileURLToPath as xN}from"node:url";function Ko(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Zn(e))return;let r=Vo(e,"ai-test");try{TN(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of NN()){let o=s.replace(/\.template$/,""),i=Vo(r,o);if(!SN(i))try{IN(i,$N(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 NN(){try{return kN(uh).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function $N(t){try{return vN(Vo(uh,t),"utf8")}catch{return jN(t)}}function jN(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1344
+ table; --json emits the structured WorkflowVerifyReport payload.`;eN=["open","assigned","closed","reopened"]});import{existsSync as lh,mkdirSync as pN,readdirSync as hN,readFileSync as ch,writeFileSync as _N}from"node:fs";import{join as Zr}from"node:path";import{fileURLToPath as gN}from"node:url";function Zn(t){try{return yN.some(e=>lh(Zr(t,e)))}catch{return!1}}function wN(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 Go(t,e){t.durable_memory_mode!=="db"?EN(t):bN(t,e)}function uh(t){let e=Zn(t),r;try{r=hN(wc).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function EN(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Zr(e,"durable-memory");try{pN(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=uh(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Zr(r,i);if(!lh(a))try{let l=ch(Zr(wc,o),"utf8");_N(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 bN(t,e){let r=t.local_path??"",n=uh(r),s=[];for(let o of n){let i=Zr(wc,o),a;try{a=ch(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=wN(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var wc,yN,Qn=b(()=>{"use strict";wc=Zr(gN(import.meta.url),"../../config/durable_memory_templates"),yN=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as SN,mkdirSync as TN,readdirSync as kN,readFileSync as vN,writeFileSync as IN}from"node:fs";import{join as Vo}from"node:path";import{fileURLToPath as xN}from"node:url";function Ko(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Zn(e))return;let r=Vo(e,"ai-test");try{TN(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of NN()){let o=s.replace(/\.template$/,""),i=Vo(r,o);if(!SN(i))try{IN(i,$N(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 NN(){try{return kN(dh).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function $N(t){try{return vN(Vo(dh,t),"utf8")}catch{return jN(t)}}function jN(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1345
1345
 
1346
1346
  Add test chapters in this directory.
1347
1347
  `:`---
@@ -1363,7 +1363,7 @@ last_run_id: 0
1363
1363
  ## Expected
1364
1364
 
1365
1365
  ## Cleanup
1366
- `}var uh,Ec=b(()=>{"use strict";Qn();uh=Vo(xN(import.meta.url),"../../config/ai_test_templates")});var Qr,bc=b(()=>{"use strict";Qr=`---
1366
+ `}var dh,Ec=b(()=>{"use strict";Qn();dh=Vo(xN(import.meta.url),"../../config/ai_test_templates")});var Qr,bc=b(()=>{"use strict";Qr=`---
1367
1367
 
1368
1368
  # Durable memory \u2014 how to use it
1369
1369
 
@@ -1374,21 +1374,21 @@ ON EVERY NEW TASK:
1374
1374
  2. Pull only the chapters relevant to your current task. Don't load everything.
1375
1375
  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.
1376
1376
 
1377
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Yo(t){return AN.has(t)}function Tc(){return Sc===null&&(Sc=_t(gt())),Sc}function kc(t,e,r={}){if(!Yo(t))return null;try{let n=Tc().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?lo({warn:()=>{}}):[];return[...o,...i,...dh[t]??[]]}catch{return null}}function en(t,e){let r=kc(t,e);return r===null?null:r.join(" ")}function Nr(t,e){return Tc().getSession(t,e)}async function zo(t){return(await Tc().resolveSessions(t)).map(r=>r.provider.name)}var dh,AN,fh,Sc,tn=b(()=>{"use strict";Rt();El();dh={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},AN=new Set(Object.keys(dh)),fh=/^[\w.:-]+$/;Sc=null});import{createHash as RN}from"node:crypto";import{existsSync as es,mkdirSync as ph,readFileSync as Qo,readdirSync as ON,renameSync as LN,statSync as CN,unlinkSync as MN,writeFileSync as Zo}from"node:fs";import{homedir as DN}from"node:os";import{dirname as Ic,isAbsolute as mh,join as ze,relative as PN,resolve as rn}from"node:path";import{fileURLToPath as FN}from"node:url";function _h(t){let e=rn(t);for(;;){let r=ze(e,xc);try{if(CN(r).isDirectory())return r}catch{}let n=Ic(e);if(n===e)return null;e=n}}function ei(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return rn(e);let r=_h(t);return r!==null?r:ze(hh(),xc)}function gh(t){return ze(ei(t),"templates","workflows")}function yh(){return rn(Ic(FN(import.meta.url)),"..","..","workflows")}function UN(t){let e=ze(t,wh);try{let r=JSON.parse(Qo(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 WN(t,e){ph(t,{recursive:!0});let r=ze(t,wh),n=`${r}.tmp-${process.pid}`;Zo(n,`${JSON.stringify(e,null,2)}
1378
- `,"utf8"),LN(n,r)}function BN(t,e){if(mh(e)||Ic(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=rn(t,"templates","workflows"),s=rn(t,"templates",e),o=PN(n,s);return o.length===0||o.startsWith("..")||mh(o)||o.includes("/")||o.includes("\\")?null:s}function qN(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=BN(t,n);if(o===null){delete e.files[n];continue}if(!es(o)){delete e.files[n];continue}try{if(vc(Qo(o))!==s)continue;MN(o),delete e.files[n]}catch{}}}function ti(t={}){let e=ei(t.cwd),r=ze(e,"templates","workflows"),n=yh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=es(n)?ON(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;ph(r,{recursive:!0});let i=UN(e),a=st(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=Qo(ze(n,c)),f=vc(d),m=ze(r,c);if(!es(m)){try{Zo(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=vc(Qo(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)Zo(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=ze(r,`${c}.dist-${a}`);Zo(g,d),s.preserved.push(c),s.shadowed.push(`${c}.dist-${a}`)}}qN(e,i,l),WN(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function Nc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(rn(r));let n=_h(t??process.cwd());return n!==null&&e.push(n),e.push(ze(hh(),xc)),e}function ri(t,e){let r=Nc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=ze(s,"templates","workflows",o);if(es(i))return i}for(let s of n){let o=ze(yh(),s);if(es(o))return o}return null}var xc,hh,vc,wh,ni=b(()=>{"use strict";Cn();xc=".lmctl",hh=()=>process.env.HOME??DN(),vc=t=>RN("sha256").update(t).digest("hex");wh=".dist-manifest.json"});import{createHash as HN}from"node:crypto";import{existsSync as JN,mkdirSync as XN,writeFileSync as GN}from"node:fs";import{dirname as VN,join as nn}from"node:path";function tr(t){return typeof t=="string"&&t.startsWith(Eh)}function e$(t){if(!tr(t))throw new lt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Eh.length),r=e.indexOf("/");if(r<=0)throw new lt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!ZN.has(n))throw new lt(`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 lt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new lt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function t$(t,e,r){if(t==="workflow")return ri(e,r);let n=t==="mcp"?nn("templates","mcp",`${e}.json`):nn("templates","skills",e,"SKILL.md");for(let s of Nc(r)){let o=nn(s,n);if(JN(o))return o}return null}function r$(t,e,r){let n=nn(ei(r),YN,t);return t==="skill"?nn(n,e,"SKILL.md"):nn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function n$(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 ts(t,e){let{kind:r,name:n,ref:s}=e$(t),o=t$(r,n,e);if(o!==null)return o;let i=`${KN}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(zN)})}catch(u){throw new lt(`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 lt(`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=QN.exec(s);if(u!==null){let d=HN("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new lt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!n$(r,l))throw new lt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=r$(r,n,e);return XN(VN(c),{recursive:!0}),GN(c,l,"utf8"),c}var Eh,KN,YN,zN,ZN,lt,QN,$c=b(()=>{"use strict";ni();Eh="lmctl://",KN="https://lmctl.com/templates/",YN=".cache",zN=8e3,ZN=new Set(["workflow","mcp","skill"]),lt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},QN=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as s$,mkdirSync as o$,readFileSync as i$,renameSync as a$,unlinkSync as l$,writeFileSync as c$}from"node:fs";import{homedir as Th}from"node:os";import{dirname as rs,join as Ue,resolve as u$}from"node:path";function Ac(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function f$(t){let e=Ue(t,".mcp.json"),r=Ac();if(!be.existsSync(e))return be.writeFileSync(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
1377
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Yo(t){return AN.has(t)}function Tc(){return Sc===null&&(Sc=_t(gt())),Sc}function kc(t,e,r={}){if(!Yo(t))return null;try{let n=Tc().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?lo({warn:()=>{}}):[];return[...o,...i,...fh[t]??[]]}catch{return null}}function en(t,e){let r=kc(t,e);return r===null?null:r.join(" ")}function Nr(t,e){return Tc().getSession(t,e)}async function zo(t){return(await Tc().resolveSessions(t)).map(r=>r.provider.name)}var fh,AN,mh,Sc,tn=b(()=>{"use strict";Rt();El();fh={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},AN=new Set(Object.keys(fh)),mh=/^[\w.:-]+$/;Sc=null});import{createHash as RN}from"node:crypto";import{existsSync as es,mkdirSync as hh,readFileSync as Qo,readdirSync as ON,renameSync as LN,statSync as CN,unlinkSync as MN,writeFileSync as Zo}from"node:fs";import{homedir as DN}from"node:os";import{dirname as Ic,isAbsolute as ph,join as ze,relative as PN,resolve as rn}from"node:path";import{fileURLToPath as FN}from"node:url";function gh(t){let e=rn(t);for(;;){let r=ze(e,xc);try{if(CN(r).isDirectory())return r}catch{}let n=Ic(e);if(n===e)return null;e=n}}function ei(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return rn(e);let r=gh(t);return r!==null?r:ze(_h(),xc)}function yh(t){return ze(ei(t),"templates","workflows")}function wh(){return rn(Ic(FN(import.meta.url)),"..","..","workflows")}function UN(t){let e=ze(t,Eh);try{let r=JSON.parse(Qo(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 WN(t,e){hh(t,{recursive:!0});let r=ze(t,Eh),n=`${r}.tmp-${process.pid}`;Zo(n,`${JSON.stringify(e,null,2)}
1378
+ `,"utf8"),LN(n,r)}function BN(t,e){if(ph(e)||Ic(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=rn(t,"templates","workflows"),s=rn(t,"templates",e),o=PN(n,s);return o.length===0||o.startsWith("..")||ph(o)||o.includes("/")||o.includes("\\")?null:s}function qN(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=BN(t,n);if(o===null){delete e.files[n];continue}if(!es(o)){delete e.files[n];continue}try{if(vc(Qo(o))!==s)continue;MN(o),delete e.files[n]}catch{}}}function ti(t={}){let e=ei(t.cwd),r=ze(e,"templates","workflows"),n=wh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=es(n)?ON(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;hh(r,{recursive:!0});let i=UN(e),a=st(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=Qo(ze(n,c)),f=vc(d),m=ze(r,c);if(!es(m)){try{Zo(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=vc(Qo(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)Zo(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=ze(r,`${c}.dist-${a}`);Zo(g,d),s.preserved.push(c),s.shadowed.push(`${c}.dist-${a}`)}}qN(e,i,l),WN(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function Nc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(rn(r));let n=gh(t??process.cwd());return n!==null&&e.push(n),e.push(ze(_h(),xc)),e}function ri(t,e){let r=Nc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=ze(s,"templates","workflows",o);if(es(i))return i}for(let s of n){let o=ze(wh(),s);if(es(o))return o}return null}var xc,_h,vc,Eh,ni=b(()=>{"use strict";Cn();xc=".lmctl",_h=()=>process.env.HOME??DN(),vc=t=>RN("sha256").update(t).digest("hex");Eh=".dist-manifest.json"});import{createHash as HN}from"node:crypto";import{existsSync as JN,mkdirSync as XN,writeFileSync as GN}from"node:fs";import{dirname as VN,join as nn}from"node:path";function tr(t){return typeof t=="string"&&t.startsWith(bh)}function e$(t){if(!tr(t))throw new lt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(bh.length),r=e.indexOf("/");if(r<=0)throw new lt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!ZN.has(n))throw new lt(`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 lt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new lt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function t$(t,e,r){if(t==="workflow")return ri(e,r);let n=t==="mcp"?nn("templates","mcp",`${e}.json`):nn("templates","skills",e,"SKILL.md");for(let s of Nc(r)){let o=nn(s,n);if(JN(o))return o}return null}function r$(t,e,r){let n=nn(ei(r),YN,t);return t==="skill"?nn(n,e,"SKILL.md"):nn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function n$(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 ts(t,e){let{kind:r,name:n,ref:s}=e$(t),o=t$(r,n,e);if(o!==null)return o;let i=`${KN}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(zN)})}catch(u){throw new lt(`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 lt(`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=QN.exec(s);if(u!==null){let d=HN("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new lt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!n$(r,l))throw new lt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=r$(r,n,e);return XN(VN(c),{recursive:!0}),GN(c,l,"utf8"),c}var bh,KN,YN,zN,ZN,lt,QN,$c=b(()=>{"use strict";ni();bh="lmctl://",KN="https://lmctl.com/templates/",YN=".cache",zN=8e3,ZN=new Set(["workflow","mcp","skill"]),lt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},QN=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as s$,mkdirSync as o$,readFileSync as i$,renameSync as a$,unlinkSync as l$,writeFileSync as c$}from"node:fs";import{homedir as kh}from"node:os";import{dirname as rs,join as Ue,resolve as u$}from"node:path";function Ac(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function f$(t){let e=Ue(t,".mcp.json"),r=Ac();if(!be.existsSync(e))return be.writeFileSync(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
1379
1379
  `,"utf8"),!0;let n;try{n=JSON.parse(be.readFileSync(e,"utf8"))}catch{return!1}if(n===null||typeof n!="object"||Array.isArray(n))return!1;let s=ct(n.mcpServers)?{...n.mcpServers}:{},o=ct(s.lmctl)?s.lmctl:void 0;return o!==void 0&&o.type===r.type&&o.command===r.command&&JSON.stringify(o.args)===JSON.stringify(r.args)?!1:(s.lmctl=r,n.mcpServers=s,be.writeFileSync(e,JSON.stringify(n,null,2)+`
1380
- `,"utf8"),!0)}function Rc(t,e){if(t==="copilot"){let n=m$();return n.present&&h$(e,ns),n}if(t==="codex")return{scope:"codex-cli-flags",path:"codex app-server -c mcp_servers.lmctl.*",changed:!1,present:!1};let r=Ue(e,".mcp.json");try{let n=f$(e);return{scope:"workspace",path:r,changed:n,present:bh(e)}}catch(n){return{scope:"workspace",path:r,changed:!1,present:bh(e),error:n instanceof Error?n.message:String(n)}}}function oi(t,e,r,n,s){if(!e)return;let o=Rc(n,s);o.error!==void 0&&t.stderr.write(`warning: MCP bridge self-heal failed: ${o.error}
1380
+ `,"utf8"),!0)}function Rc(t,e){if(t==="copilot"){let n=m$();return n.present&&h$(e,ns),n}if(t==="codex")return{scope:"codex-cli-flags",path:"codex app-server -c mcp_servers.lmctl.*",changed:!1,present:!1};let r=Ue(e,".mcp.json");try{let n=f$(e);return{scope:"workspace",path:r,changed:n,present:Sh(e)}}catch(n){return{scope:"workspace",path:r,changed:!1,present:Sh(e),error:n instanceof Error?n.message:String(n)}}}function oi(t,e,r,n,s){if(!e)return;let o=Rc(n,s);o.error!==void 0&&t.stderr.write(`warning: MCP bridge self-heal failed: ${o.error}
1381
1381
  `),Z({event:"lead_mcp_precheck",alias:r,provider:n,cwd:s,mcp_scope:o.scope,mcp_path:o.path,mcp_present:o.present,mcp_json_exists:o.present}),!o.present&&o.scope!=="codex-cli-flags"&&t.stderr.write(`warning: Lead MCP bridge config missing after self-heal: ${o.path}
1382
- `)}function ii(t,e,r){let n=rs(u$(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries()){let l=new Set([rr]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(ns),nr(Ue(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)_$(i)}function m$(){let t=ai();try{let{changed:e}=Oc(t,{[ns]:Ac()});return{scope:"copilot-user",path:t,changed:e,present:jc(t)}}catch(e){return{scope:"copilot-user",path:t,changed:!1,present:jc(t),error:e instanceof Error?e.message:String(e)}}}function ai(t=kh??Th()){return Ue(t,".copilot","mcp-config.json")}function Oc(t,e){let r={};if(be.existsSync(t)){let o=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(o))throw new Error(`${t} is not a JSON object`);r=o}let n=ct(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=ct(n[o])?n[o]:void 0;xh(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,vh(t,r),{changed:!0}):{changed:!1}}function vh(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,`${JSON.stringify(e,null,2)}
1383
- `,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function p$(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,e,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function bh(t){return jc(Ue(t,".mcp.json"))}function h$(t,e){let r=Ue(t,".mcp.json");nr(r,"mcpServers",[e])}function nr(t,e,r){try{if(!be.existsSync(t))return;let n=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(n)||!ct(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,vh(t,n),Z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function _$(t){let e=kh??Th();switch(t){case"copilot":nr(ai(e),"mcpServers",[rr]);return;case"claude":nr(Ue(e,".claude.json"),"mcpServers",[rr]);return;case"gemini":nr(Ue(e,".gemini","settings.json"),"mcpServers",[rr]);return;case"qwen":nr(Ue(e,".qwen","settings.json"),"mcpServers",[rr]);return;case"agy":nr(Ue(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[rr]);return;case"opencode":nr(Ue(e,".config","opencode","opencode.json"),"mcp",[rr]);return;case"codex":g$(Ue(e,".codex","config.toml"),rr);return;default:return}}function g$(t,e){try{if(!be.existsSync(t))return;let n=be.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=y$(a);if(l===null)return;if(l!==void 0){if(Sh(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=w$(a);if(c===null)return;if(c!==void 0&&Sh(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;p$(t,s.join(`
1384
- `)),Z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Sh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function y$(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Ih(e[1])}function w$(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 Ih(r)}function Ih(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function jc(t){try{if(!be.existsSync(t))return!1;let e=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(e)||!ct(e.mcpServers))return!1;let r=ct(e.mcpServers[ns])?e.mcpServers[ns]:void 0;return xh(r,Ac())}catch{return!1}}function xh(t,e){return t!==void 0&&si(t)===si(e)}function si(t){return Array.isArray(t)?`[${t.map(e=>si(e)).join(",")}]`:ct(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${si(t[e])}`).join(",")}}`:JSON.stringify(t)}function ct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ns,rr,d$,be,kh,ss=b(()=>{"use strict";je();ns="lmctl",rr="lmctl0",d$={existsSync:s$,mkdirSync:o$,readFileSync:i$,writeFileSync:c$,renameSync:a$,unlinkSync:l$},be=d$});import{spawnSync as Oh}from"node:child_process";import{cpSync as Nh,existsSync as Mc,mkdirSync as Lh,mkdtempSync as E$,readFileSync as Ch,statSync as b$,writeFileSync as Lc}from"node:fs";import{homedir as S$,tmpdir as T$}from"node:os";import{basename as $h,join as Ze}from"node:path";function Lt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Cc(t,e,r){if(Array.isArray(t)){for(let n of t)Cc(n,e,r);return}if(Lt(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))Cc(n,e,r)}}function x$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Lt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Lt(l)&&l.members!==void 0&&Cc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(I$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function Mh(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(k$)})}catch(s){throw new Qe(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new Qe(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>jh)throw new Qe(e,`fetched ${t} exceeds ${jh} bytes`);return n}async function N$(t,e){if(typeof t!="string")return[t];tr(t)&&(t=await ts(t));let r;if(Dc.test(t))r=await Mh(t,e);else{if(!Mc(t))throw new Qe(e,`mcp file not found: ${t}`);r=Ch(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new Qe(e,`mcp source is not JSON: ${t}`)}if(Lt(n)&&Lt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Lt(o)?o:{}}));if(Lt(n)&&typeof n.name=="string")return[n];throw new Qe(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 li(t,e,r,n){let s=Oh(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new Qe(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Qe(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function $$(t,e,r){Oh(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function j$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function A$(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 R$(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 O$(t){let e=Ze(process.env.XDG_CONFIG_HOME??Ze(sn(),".config"),"opencode"),r=Ze(e,"opencode.json"),n={};if(Mc(r))try{let o=JSON.parse(Ch(r,"utf8"));Lt(o)&&(n=o)}catch{}let s=Lt(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"),Lh(e,{recursive:!0}),Lc(r,`${JSON.stringify(n,null,2)}
1385
- `,"utf8")}function L$(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{Oc(ai(sn()),r)}catch(n){throw new Qe(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function C$(t){if(typeof t!="string")return t.name;let e=$h(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?$h(t.replace(/\/skill\.md$/i,"")):e}async function Ah(t,e,r){let n=C$(t),s=Ze(e,n);if(Lh(s,{recursive:!0}),typeof t!="string")return Lc(Ze(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(tr(t)&&(t=await ts(t)),Dc.test(t))return Lc(Ze(s,"SKILL.md"),await Mh(t,r),"utf8"),{name:n,dir:s};if(!Mc(t))throw new Qe(r,`skill path not found: ${t}`);return b$(t).isDirectory()?(Nh(t,s,{recursive:!0}),{name:n,dir:s}):(Nh(t,Ze(s,"SKILL.md")),{name:n,dir:s})}async function ui(t){let{dal:e,member:r,stderr:n}=t,s=x$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ie(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1386
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await N$(c,r.alias));if(o==="opencode")O$(l);else if(o==="copilot")L$(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if($$(o,j$(o,c.name),i),o==="claude"){let{name:u,...d}=c;li("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?li("codex",R$(c),i,r.alias):li(o,A$(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(v$.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=E$(Ze(T$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Dc.test(c)?c:(await Ah(c,l,r.alias)).dir;li(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(Rh[o]!==void 0){let l=Rh[o]();for(let c of s.skills)await Ah(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var Qe,Dc,k$,jh,v$,I$,sn,Rh,Pc=b(()=>{"use strict";Pe();$c();ss();Qe=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Dc=/^https?:\/\//i,k$=8e3,jh=1e6,v$=new Set(["opencode"]),I$=t=>JSON.stringify(t),sn=()=>process.env.HOME??S$();Rh={claude:()=>Ze(sn(),".claude","skills"),qwen:()=>Ze(sn(),".qwen","skills"),codex:()=>Ze(sn(),".codex","skills"),copilot:()=>Ze(sn(),".copilot","skills")}});async function G(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:ue()});try{return await e(r)}finally{r.close()}}function F(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function N(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function q(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1382
+ `)}function ii(t,e,r){let n=rs(u$(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries()){let l=new Set([rr]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(ns),nr(Ue(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)_$(i)}function m$(){let t=ai();try{let{changed:e}=Oc(t,{[ns]:Ac()});return{scope:"copilot-user",path:t,changed:e,present:jc(t)}}catch(e){return{scope:"copilot-user",path:t,changed:!1,present:jc(t),error:e instanceof Error?e.message:String(e)}}}function ai(t=vh??kh()){return Ue(t,".copilot","mcp-config.json")}function Oc(t,e){let r={};if(be.existsSync(t)){let o=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(o))throw new Error(`${t} is not a JSON object`);r=o}let n=ct(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=ct(n[o])?n[o]:void 0;Nh(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,Ih(t,r),{changed:!0}):{changed:!1}}function Ih(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,`${JSON.stringify(e,null,2)}
1383
+ `,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function p$(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,e,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function Sh(t){return jc(Ue(t,".mcp.json"))}function h$(t,e){let r=Ue(t,".mcp.json");nr(r,"mcpServers",[e])}function nr(t,e,r){try{if(!be.existsSync(t))return;let n=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(n)||!ct(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,Ih(t,n),Z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function _$(t){let e=vh??kh();switch(t){case"copilot":nr(ai(e),"mcpServers",[rr]);return;case"claude":nr(Ue(e,".claude.json"),"mcpServers",[rr]);return;case"gemini":nr(Ue(e,".gemini","settings.json"),"mcpServers",[rr]);return;case"qwen":nr(Ue(e,".qwen","settings.json"),"mcpServers",[rr]);return;case"agy":nr(Ue(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[rr]);return;case"opencode":nr(Ue(e,".config","opencode","opencode.json"),"mcp",[rr]);return;case"codex":g$(Ue(e,".codex","config.toml"),rr);return;default:return}}function g$(t,e){try{if(!be.existsSync(t))return;let n=be.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=y$(a);if(l===null)return;if(l!==void 0){if(Th(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=w$(a);if(c===null)return;if(c!==void 0&&Th(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;p$(t,s.join(`
1384
+ `)),Z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Th(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function y$(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:xh(e[1])}function w$(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 xh(r)}function xh(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function jc(t){try{if(!be.existsSync(t))return!1;let e=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(e)||!ct(e.mcpServers))return!1;let r=ct(e.mcpServers[ns])?e.mcpServers[ns]:void 0;return Nh(r,Ac())}catch{return!1}}function Nh(t,e){return t!==void 0&&si(t)===si(e)}function si(t){return Array.isArray(t)?`[${t.map(e=>si(e)).join(",")}]`:ct(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${si(t[e])}`).join(",")}}`:JSON.stringify(t)}function ct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ns,rr,d$,be,vh,ss=b(()=>{"use strict";je();ns="lmctl",rr="lmctl0",d$={existsSync:s$,mkdirSync:o$,readFileSync:i$,writeFileSync:c$,renameSync:a$,unlinkSync:l$},be=d$});import{spawnSync as Lh}from"node:child_process";import{cpSync as $h,existsSync as Mc,mkdirSync as Ch,mkdtempSync as E$,readFileSync as Mh,statSync as b$,writeFileSync as Lc}from"node:fs";import{homedir as S$,tmpdir as T$}from"node:os";import{basename as jh,join as Ze}from"node:path";function Lt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Cc(t,e,r){if(Array.isArray(t)){for(let n of t)Cc(n,e,r);return}if(Lt(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))Cc(n,e,r)}}function x$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Lt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Lt(l)&&l.members!==void 0&&Cc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(I$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function Dh(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(k$)})}catch(s){throw new Qe(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new Qe(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>Ah)throw new Qe(e,`fetched ${t} exceeds ${Ah} bytes`);return n}async function N$(t,e){if(typeof t!="string")return[t];tr(t)&&(t=await ts(t));let r;if(Dc.test(t))r=await Dh(t,e);else{if(!Mc(t))throw new Qe(e,`mcp file not found: ${t}`);r=Mh(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new Qe(e,`mcp source is not JSON: ${t}`)}if(Lt(n)&&Lt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Lt(o)?o:{}}));if(Lt(n)&&typeof n.name=="string")return[n];throw new Qe(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 li(t,e,r,n){let s=Lh(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new Qe(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Qe(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function $$(t,e,r){Lh(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function j$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function A$(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 R$(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 O$(t){let e=Ze(process.env.XDG_CONFIG_HOME??Ze(sn(),".config"),"opencode"),r=Ze(e,"opencode.json"),n={};if(Mc(r))try{let o=JSON.parse(Mh(r,"utf8"));Lt(o)&&(n=o)}catch{}let s=Lt(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"),Ch(e,{recursive:!0}),Lc(r,`${JSON.stringify(n,null,2)}
1385
+ `,"utf8")}function L$(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{Oc(ai(sn()),r)}catch(n){throw new Qe(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function C$(t){if(typeof t!="string")return t.name;let e=jh(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?jh(t.replace(/\/skill\.md$/i,"")):e}async function Rh(t,e,r){let n=C$(t),s=Ze(e,n);if(Ch(s,{recursive:!0}),typeof t!="string")return Lc(Ze(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(tr(t)&&(t=await ts(t)),Dc.test(t))return Lc(Ze(s,"SKILL.md"),await Dh(t,r),"utf8"),{name:n,dir:s};if(!Mc(t))throw new Qe(r,`skill path not found: ${t}`);return b$(t).isDirectory()?($h(t,s,{recursive:!0}),{name:n,dir:s}):($h(t,Ze(s,"SKILL.md")),{name:n,dir:s})}async function ui(t){let{dal:e,member:r,stderr:n}=t,s=x$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ie(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1386
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await N$(c,r.alias));if(o==="opencode")O$(l);else if(o==="copilot")L$(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if($$(o,j$(o,c.name),i),o==="claude"){let{name:u,...d}=c;li("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?li("codex",R$(c),i,r.alias):li(o,A$(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(v$.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=E$(Ze(T$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Dc.test(c)?c:(await Rh(c,l,r.alias)).dir;li(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(Oh[o]!==void 0){let l=Oh[o]();for(let c of s.skills)await Rh(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var Qe,Dc,k$,Ah,v$,I$,sn,Oh,Pc=b(()=>{"use strict";Pe();$c();ss();Qe=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Dc=/^https?:\/\//i,k$=8e3,Ah=1e6,v$=new Set(["opencode"]),I$=t=>JSON.stringify(t),sn=()=>process.env.HOME??S$();Oh={claude:()=>Ze(sn(),".claude","skills"),qwen:()=>Ze(sn(),".qwen","skills"),codex:()=>Ze(sn(),".codex","skills"),copilot:()=>Ze(sn(),".copilot","skills")}});async function G(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:ue()});try{return await e(r)}finally{r.close()}}function F(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function N(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function q(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1387
1387
  `)}function y(t,e){return t.stderr.write(`error: ${e}
1388
1388
  `),1}function me(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1389
- `),2}var $e=b(()=>{"use strict";Pe();Ve()});var Wh={};ce(Wh,{defaultTeamNameForProject:()=>ej,resolveAlias:()=>mi,resolveProject:()=>di,resolveTeam:()=>fi,runCode:()=>P$});import{execFileSync as M$}from"node:child_process";import{basename as D$,resolve as Dh}from"node:path";import*as Uc from"node:readline";import{setTimeout as Fc}from"node:timers/promises";async function P$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return F$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Fh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return V$(e);try{return await G(e,async s=>{switch(r){case"team":return U$(n,e,s);case"chat":return J$(n,e,s);case"spec":return X$(n,e,s);default:return y(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return me(e,s)}}function F$(t){return t.stdout.write(["usage: lmctl code <team|chat> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1390
- `)),0}function U$(t,e,r){let[n,...s]=t;switch(n){case"add":return W$(s,e,r);case"list":return B$(s,e,r);case"show":return q$(s,e,r);case"rm":return H$(s,e,r);default:return y(e,"usage: lmctl code team <add|list|show|rm>")}}function W$(t,e,r){let n=F(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]");let o=N(n,"--provider");if(o===void 0)return y(e,"code team add requires --provider");let i=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:N(n,"--model")??null,role:N(n,"--role")??"agent",sessiondir:N(n,"--sessiondir")??i.project.local_path});return M(n,"--json")?q(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1391
- `),0}function B$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=Uh(r.listTeamMembers(s.team.id));if(M(n,"--json"))q(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${Ie(i)} ${i.sessionid??"(unseeded)"}
1389
+ `),2}var $e=b(()=>{"use strict";Pe();Ve()});var Bh={};ce(Bh,{defaultTeamNameForProject:()=>ej,resolveAlias:()=>mi,resolveProject:()=>di,resolveTeam:()=>fi,runCode:()=>P$});import{execFileSync as M$}from"node:child_process";import{basename as D$,resolve as Ph}from"node:path";import*as Uc from"node:readline";import{setTimeout as Fc}from"node:timers/promises";async function P$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return F$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Uh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return V$(e);try{return await G(e,async s=>{switch(r){case"team":return U$(n,e,s);case"chat":return J$(n,e,s);case"spec":return X$(n,e,s);default:return y(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return me(e,s)}}function F$(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(`
1390
+ `)),0}function U$(t,e,r){let[n,...s]=t;switch(n){case"add":return W$(s,e,r);case"list":return B$(s,e,r);case"show":return q$(s,e,r);case"rm":return H$(s,e,r);default:return y(e,"usage: lmctl code team <add|list|show|rm>")}}function W$(t,e,r){let n=F(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=N(n,"--provider");if(o===void 0)return y(e,"code team add requires --provider");let i=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:N(n,"--model")??null,role:N(n,"--role")??"agent",sessiondir:N(n,"--sessiondir")??i.project.local_path});return M(n,"--json")?q(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1391
+ `),0}function B$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=Wh(r.listTeamMembers(s.team.id));if(M(n,"--json"))q(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${Ie(i)} ${i.sessionid??"(unseeded)"}
1392
1392
  `);return 0}function q$(t,e,r){let n=F(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=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?y(e,`member not found: ${s}`):(M(n,"--json")?q(e,i):(e.stdout.write(`member ${i.alias}
1393
1393
  `),e.stdout.write(`role: ${i.role}
1394
1394
  `),e.stdout.write(`provider: ${Ie(i)}
@@ -1396,13 +1396,13 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1396
1396
  `),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
1397
1397
  `),e.stdout.write(`sessiondir: ${i.sessiondir}
1398
1398
  `)),0)}function H$(t,e,r){let n=F(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=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return y(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return M(n,"--json")?q(e,a):e.stdout.write(`retired member ${i.alias}
1399
- `),0}async function J$(t,e,r){if(t.includes("--help")||t.includes("-h"))return Fh(e);let n=F(t,["--project","--team","--alias"]);if(n.error!==void 0)return y(e,n.error);let s=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=mi(e,r,s.team,N(n,"--alias"));if(typeof o=="number")return o;let i=await Q$(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1399
+ `),0}async function J$(t,e,r){if(t.includes("--help")||t.includes("-h"))return Uh(e);let n=F(t,["--project","--team","--alias"]);if(n.error!==void 0)return y(e,n.error);let s=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=mi(e,r,s.team,N(n,"--alias"));if(typeof o=="number")return o;let i=await Q$(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1400
1400
  `);let a=e.stdin??process.stdin,l=Uc.createInterface({input:a,terminal:!1}),c=i;os(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){os(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1401
1401
  `),0;if(d==="/help"){Z$(e),os(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
1402
1402
  `),os(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
1403
1403
  `);let f=await Vr({sessionid:c.sessionid,sessiondir:c.sessiondir,prompt:d,dal:r,team_member_id:c.id});e.stdout.write(`${f.text.trimEnd()}
1404
- `);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),os(e,c,s.project)}}finally{l.close()}return 0}async function X$(t,e,r){let n=F(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return y(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=N(n,"--template")??Ph,a=r.getWorkflowByName(i);if(a===null)return y(e,`workflow not found: ${i}`);let l=N(n,"--slug")??z$(s),c={task_description:s,slug:l},u=N(n,"--from-requirement"),d=N(n,"--from-plan"),f=N(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=G$(r,e),p=await is(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
1405
- `),K$(e,m,p.id)}function G$(t,e){let r=zn(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function V$(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Ph}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
1404
+ `);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),os(e,c,s.project)}}finally{l.close()}return 0}async function X$(t,e,r){let n=F(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return y(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=N(n,"--template")??Fh,a=r.getWorkflowByName(i);if(a===null)return y(e,`workflow not found: ${i}`);let l=N(n,"--slug")??z$(s),c={task_description:s,slug:l},u=N(n,"--from-requirement"),d=N(n,"--from-plan"),f=N(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=G$(r,e),p=await is(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
1405
+ `),K$(e,m,p.id)}function G$(t,e){let r=zn(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function V$(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Fh}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
1406
1406
  `)),0}async function K$(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await is(e,`/api/jobs/${r}/run`,"POST");if(o.run_id!==null&&(n=o.run_id),o.status==="done")return t.stdout.write(`code spec complete: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1407
1407
  `),o.terminal_state==="done"?0:1;if(o.status==="failed")return t.stderr.write(`code spec failed: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1408
1408
  `),1;if(o.status==="paused"&&o.run_id!==null){n=o.run_id;let i=await Y$(t,e,r,n);if(i!=="continue")return i;continue}await Fc(1e3)}return t.stderr.write(`error: code spec polling exceeded step limit for job ${r}
@@ -1410,34 +1410,34 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1410
1410
  `),await Fc(1e3),"continue";let i=[...s.steps].reverse().find(l=>l.state_name===o);if(i===void 0)return t.stderr.write(`[code spec] paused state ${o} has no step; polling will continue
1411
1411
  `),await Fc(1e3),"continue";t.stderr.write(`[code spec] interactive stage ${o}; type /done to advance or /exit to leave paused
1412
1412
  `);let a=Uc.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}
1413
- `),0;if(c==="/done")return await is(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await is(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function is(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 z$(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Fh(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(`
1413
+ `),0;if(c==="/done")return await is(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await is(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function is(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 z$(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Uh(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(`
1414
1414
  `)),0}function Z$(t){t.stderr.write(`commands: /help, /exit
1415
- `)}function os(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=M$("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=Dh(s),i=e.listProjects().find(a=>Dh(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 fi(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 mi(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=Uh(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 on(t,e,r,n){let s=di(t,e,r);if(typeof s=="number")return s;let o=fi(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function Uh(t){return t.filter(e=>e.state!=="retired")}async function Q$(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1415
+ `)}function os(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=M$("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=Ph(s),i=e.listProjects().find(a=>Ph(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 fi(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 mi(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=Wh(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 on(t,e,r,n){let s=di(t,e,r);if(typeof s=="number")return s;let o=fi(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function Wh(t){return t.filter(e=>e.state!=="retired")}async function Q$(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1416
1416
  `),Go(r,e),Ko(r);let s=await Kr({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=en(Ie(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
1417
1417
  ${i}
1418
1418
  `),await ui({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
1419
1419
 
1420
- ${Qr}`:Qr;return e.setMemberPromptSnapshot(o.id,l)??o}function ej(t){return`${D$(t.local_path)}-code`}var Ph,Wc=b(()=>{"use strict";Gn();$o();Qn();Ec();bc();Pe();tn();Pc();$e();yc();Ph="spec-driven-task"});import Bh from"jexl";function sr(t){Bh.compile(qh(t))}async function $r(t,e){return Bh.eval(qh(t),e)}function qh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var an=b(()=>{"use strict"});import{z as w}from"zod";function Vc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var tj,Hh,Bc,qc,Hc,Jc,Xc,Gc,Jh,rj,nj,sj,as,oj,pi,hi,_i,gi,yi,Xh,ij,aj,lj,cj,wi,ln=b(()=>{"use strict";an();tj=w.object({kind:w.enum(["success","neutral","failure"])}),Hh=w.enum(["string","number","boolean","object","array"]),Bc=w.object({name:w.string().min(1),type:Hh,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),qc=w.object({name:w.string().min(1),type:Hh,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),Hc=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),Jc="__failure__",Xc=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),Gc=w.object({on_unhandled_failure:w.object({attention_kind:w.string().min(1).default("workflow_failed"),severity:w.enum(["warn","error","critical"]).default("warn"),capture_evidence:w.boolean().default(!0),recommend_recovery:w.string().min(1).optional()}).optional(),on_unhandled_failure_state:w.string().min(1).optional()}).optional(),Jh=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),rj=w.object({name:w.string().min(1),command:w.string().min(1).optional(),args:w.array(w.string()).optional(),env:w.record(w.string(),w.string()).optional(),type:w.enum(["stdio","http","sse"]).optional(),url:w.string().min(1).optional(),headers:w.record(w.string(),w.string()).optional()}).strict(),nj=w.union([w.string().min(1),rj]),sj=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),as=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(nj).optional(),skills:w.array(sj).optional()}),oj=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),pi=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:as,pre_checks:w.array(oj).optional(),reviewers:w.array(as.extend({rubric_artifact:w.string().optional()})).optional(),outcomes:w.object({approve:w.string().min(1),request_changes:w.string().optional(),fail_pre_check:w.string().optional(),max_loops_exceeded:w.string().optional()}),writes_to_project_path:w.boolean().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional(),max_loops:w.number().int().positive().default(5),loop_feedback_artifact:w.string().optional(),outcomes_from_stance:w.record(w.string(),w.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),hi=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(as.extend({topic:w.string().min(1)})).optional(),consolidator:as,outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),research_artifact_prefix:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),_i=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:as.extend({initial_prompt_template:w.string().min(1)}),termination:w.object({operator_signal:w.boolean().default(!0),agent_signal:w.string().optional(),max_turns:w.number().int().positive().default(20),timeout_seconds:w.number().int().positive().optional()}),outcomes:w.object({done:w.string().min(1),timeout:w.string().optional()}),artifact_name:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),gi=w.object({type:w.literal("Loop"),state_name:w.string().min(1),over:w.string().min(1),item_var:w.string().min(1),body:w.string().min(1),outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),stop_on_error:w.boolean().default(!0),max_items:w.number().int().positive().default(1e3)}),yi=w.object({type:w.literal("ShellStep"),state_name:w.string().min(1),command:w.string().min(1),outcomes_from_exit:w.record(w.string(),w.string().min(1)),timeout_ms:w.number().int().nonnegative().optional(),capture_output_to:w.string().optional(),writes_to_project_path:w.boolean().optional()}),Xh=w.object({type:w.literal("Choice"),state_name:w.string().min(1),branches:w.array(w.object({when:w.string().min(1),next:w.string().min(1)})).default([]),default_next:w.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{sr(Vc(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}`})}}),ij=w.discriminatedUnion("type",[Jh,pi,hi,_i,gi,yi,Xh]),aj=w.object({type:w.literal("ForEach"),state_name:w.string().min(1),items_from:w.string().min(1),mode:w.enum(["sequential","parallel"]).default("sequential"),max_concurrency:w.number().int().positive().default(1),on_item_failure:w.enum(["continue","stop"]).default("stop"),body:ij,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((t,e)=>{try{sr(Vc(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}`})}}),lj=w.object({type:w.literal("Subflow"),state_name:w.string().min(1),workflow_name:w.string().min(1),inputs:w.record(w.string(),w.string().min(1)).optional(),outcomes:w.record(w.string(),w.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{sr(Vc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),cj=w.discriminatedUnion("type",[Jh,pi,hi,_i,gi,yi,Xh,aj,lj]),wi=w.object({name:w.string().min(1),version:w.number().int().positive(),definition_schema_version:w.union([w.literal(1),w.literal(2)]),description:w.string().optional(),estimated_duration_ms:w.number().int().nonnegative().optional(),primitive_version:w.union([w.literal(1),w.literal(2)]).default(1),start_at:w.string().min(1),states:w.record(w.string().min(1),cj),terminals:w.record(w.string().min(1),tj),errors:Gc,concurrency_key:w.string().min(1).optional(),concurrent_limit:w.number().int().positive().optional(),default_task_timeout_ms:w.number().int().positive().max(216e5).optional(),inputs:w.array(Bc).optional(),outputs:w.array(qc).optional(),triggers:w.array(Hc).optional(),read_only:w.boolean().optional(),requires:Xc}).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 uj,Ei,dj,fj,mj,wt,cn=b(()=>{"use strict";ln();uj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ei=Q.string().regex(uj),dj=Q.object({step_id:Ei,type:Q.literal("main"),index:Q.number().int().min(0)}),fj=Q.record(Ei,Q.record(Q.string().min(1),Q.array(Q.array(dj)))),mj=Q.object({id:Ei,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),wt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:Gc,inputs:Q.array(Bc).optional(),outputs:Q.array(qc).optional(),steps:Q.array(mj).min(1),connections:fj.default({}),entry_step_id:Ei,triggers:Q.array(Hc).optional(),read_only:Q.boolean().optional(),requires:Xc}).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 bi(t){return Yc(t)}function Yc(t){if(Array.isArray(t))return t.map(Yc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Yc(e[n]);if(typeof r.type=="string"){let n=hj[r.type];n!==void 0&&(r.type=n)}return r}var Kc,pj,hj,zc=b(()=>{"use strict";Kc="lmctl.builtin.",pj={Review:`${Kc}Review`,Research:`${Kc}Research`,Consolidate:`${Kc}Consolidate`},hj=Object.fromEntries(Object.entries(pj).map(([t,e])=>[e,t]))});import{readFileSync as _j}from"node:fs";function Kh(t){return gj(t)}function gj(t){let e=bi(Ej(t));if(wj(e),Yh(e)===3)return yj(e);let r=wi.safeParse(e);if(!r.success)throw new Ct({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=bj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Ct(n);return r.data}function yj(t){let e=wt.safeParse(t);if(!e.success)throw new Ct({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function wj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Yh(t);if(!(e===null||Gh.includes(e)))throw new Ct({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Gh.join(", ")}`}]})}function Yh(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 Ej(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1421
- `)||e.startsWith("{")||e.startsWith("[")?Vh(t,"$"):e.endsWith(".json")?Vh(_j(e,"utf8"),e):t}function Vh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Ct({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function bj(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"}),Sj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function Sj(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 Gh,Ct,zh=b(()=>{"use strict";ln();cn();zc();Gh=[1,2,3],Ct=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 Tj}from"node:crypto";function Zh(t,e){let r=kj(e),n=Tj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function kj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Qh=b(()=>{"use strict";cn()});function xj(t,e){let r=Ij[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 n_(t){let e=[],r=(v,I)=>{throw new un([{line:v,message:I}])},n=t.split(`
1422
- `),s=[];for(let v=0;v<n.length;v+=1){let O=jj(n[v]).trim();O.length>0&&s.push({n:v+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,_=(v,I,O,J,W,L)=>{l.has(v)&&r(J,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(J,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:I,params:O,line:J,isTerminal:W,...L?{members:L}:{}}),u.push(v)},T=v=>{let I=[],O=v+1;for(;O<s.length;O+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(J===null)break;I.push({label:J[1],dst:J[2]})}return{branches:I,nextIdx:O-1}};for(let v=1;v<s.length;v+=1){let{n:I,text:O}=s[v],J=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){v!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),L=or(W[1],I,r);for(let te of Object.keys(L))t_.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...t_].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(J==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=e_[te];ie===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(e_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:ye,members:Tt}=xj(ie,or(_e,I,r));_(L,ie,ye,I,!1,Object.keys(Tt).length>0?Tt:void 0);continue}if(J==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=r_[te];ie===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(r_).join(", ")})`),p.has(L)&&r(I,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:ie,parameters:or(_e,I,r)});continue}if(J==="mcp"||J==="skill"){let W=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(I,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${O}`),L=W[1],te=W[2].trim(),_e=J==="mcp"?h:g;_e.has(L)&&r(I,`duplicate ${J} declaration: ${L}`);let ie;if(te.startsWith("{")){let ye=or(te,I,r);J==="mcp"?ie={...ye,name:L}:((typeof ye.content!="string"||ye.content.length===0)&&r(I,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:L,content:ye.content})}else{let ye=s_(te);(typeof ye!="string"||ye.length===0)&&r(I,`\`${J} ${L}\`: string form must be a non-empty file path or http(s) URL`),ie=ye}_e.set(L,ie);continue}if(J==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},I,!0);continue}if(J==="seq"){let L=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(L.length<3||L.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<L.length+1&&!(te+2>L.length-1);te+=2){let _e=L[te],ie=L[te+1],ye=L[te+2],Tt=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Tt,dstDeclId:ye,line:I})}continue}if(J==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],_e,ie=v+1;for(;ie<s.length;ie+=1){let ye=s[ie].text,Tt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(Tt!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Tt[2];te.push({when:Tt[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:L,port:jn,dstDeclId:Tt[3],line:s[ie].n});continue}let Ja=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(Ja!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\` has more than one \`default\``);let jn=Ja[1];_e=`@terminal:${jn}`,c.push({srcDeclId:L,port:jn,dstDeclId:Ja[2],line:s[ie].n});continue}break}te.length===0&&r(I,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},I,!1),v=ie-1;continue}if(J==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(W[1],"lmctl/loop",or(W[2],I,r),I,!1);continue}if(J==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),L=or(W[2],I,r);"mode"in L&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(W[1],"lmctl/foreach",L,I,!1);continue}if(J==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),L=W[1],te=or(W[2],I,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(I,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...ye}=te;_(L,"lmctl/subflow",{workflow_name:_e,...ye},I,!1),d.push({declId:L,target:_e,line:I});continue}if(J==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),L=W[1],te=or(W[2],I,r),{branches:_e,nextIdx:ie}=T(v);_e.length===0&&r(I,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let ye of _e)c.push({srcDeclId:L,port:ye.label,dstDeclId:ye.dst,line:I});v=ie;continue}if(J==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}r(I,`unknown statement \`${J}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=v=>{if(Array.isArray(v)){for(let O of v)E(O);return}if(typeof v!="object"||v===null)return;let I=v;if(typeof I.alias=="string")for(let[O,J]of[["mcp",h],["skills",g]]){let W=I[O];Array.isArray(W)&&(I[O]=W.map(L=>typeof L=="string"&&J.has(L)?structuredClone(J.get(L)):L))}for(let O of Object.values(I))E(O)};for(let v of u){let I=l.get(v);I.members!==void 0&&E(I.members)}let k=v=>Zh(i,v),$=u.map(v=>{let I=l.get(v);return{id:k(v),name:v,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),x={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let I=k(v.srcDeclId);x[I]??={},x[I][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),x[I][v.port]=[[{step_id:k(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let I=l.get(v);Nj.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.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 A=new Map;for(let v of c){let I=A.get(v.srcDeclId);I===void 0?A.set(v.srcDeclId,[v.dstDeclId]):I.push(v.dstDeclId)}for(let v of u){let I=l.get(v);if(I.type!=="lmctl/loop")continue;let O=I.params.body;if(typeof O=="string"&&l.has(O)){let J=A.get(v);J===void 0?A.set(v,[O]):J.push(O)}}let D=new Set([f]),C=[f];for(;C.length>0;){let v=C.shift();for(let I of A.get(v)??[])D.has(I)||(D.add(I),C.push(I))}for(let v of u)D.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let H=new Map;for(let v of c){let I=H.get(v.srcDeclId);I===void 0&&(I=new Set,H.set(v.srcDeclId,I)),I.add(v.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let I=l.get(v);if(I.isTerminal)continue;let O=H.get(v)??new Set;if(I.type==="lmctl/review"){let W=[...O].some(L=>!R.has(L));!O.has("approve")&&!W&&r(I.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -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 J=$j[I.type];if(J!==void 0)for(let W of J)O.has(W)||r(I.line,`uncovered outcome: required outcome \`${W}\` of step \`${v}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${v} -${W}-> <target|terminal>\`)`);else O.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${v}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let I=l.get(v),O=vj[I.type];if(O===void 0)continue;let J={...I.params,...I.members??{},type:O.v2type,state_name:v,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},W=O.schema.safeParse(J);if(!W.success){let L=W.error.issues[0],te=L.path.length===0?"$":L.path.map(String).join(".");r(I.line,`step \`${v}\` (\`${I.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let U={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:$,connections:x,entry_step_id:k(f)},z=wt.safeParse(U);if(!z.success)throw new un(z.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return z.data}function jj(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 or(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 Aj(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]=s_(l)}return s}function Aj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function s_(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 vj,Ij,e_,un,Nj,$j,t_,r_,o_=b(()=>{"use strict";cn();Qh();ln();vj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:pi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:hi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:_i},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:gi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:yi}},Ij={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};e_={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"},un=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1420
+ ${Qr}`:Qr;return e.setMemberPromptSnapshot(o.id,l)??o}function ej(t){return`${D$(t.local_path)}-code`}var Fh,Wc=b(()=>{"use strict";Gn();$o();Qn();Ec();bc();Pe();tn();Pc();$e();yc();Fh="spec-driven-task"});import qh from"jexl";function sr(t){qh.compile(Hh(t))}async function $r(t,e){return qh.eval(Hh(t),e)}function Hh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var an=b(()=>{"use strict"});import{z as w}from"zod";function Vc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var tj,Jh,Bc,qc,Hc,Jc,Xc,Gc,Xh,rj,nj,sj,as,oj,pi,hi,_i,gi,yi,Gh,ij,aj,lj,cj,wi,ln=b(()=>{"use strict";an();tj=w.object({kind:w.enum(["success","neutral","failure"])}),Jh=w.enum(["string","number","boolean","object","array"]),Bc=w.object({name:w.string().min(1),type:Jh,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),qc=w.object({name:w.string().min(1),type:Jh,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),Hc=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),Jc="__failure__",Xc=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),Gc=w.object({on_unhandled_failure:w.object({attention_kind:w.string().min(1).default("workflow_failed"),severity:w.enum(["warn","error","critical"]).default("warn"),capture_evidence:w.boolean().default(!0),recommend_recovery:w.string().min(1).optional()}).optional(),on_unhandled_failure_state:w.string().min(1).optional()}).optional(),Xh=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),rj=w.object({name:w.string().min(1),command:w.string().min(1).optional(),args:w.array(w.string()).optional(),env:w.record(w.string(),w.string()).optional(),type:w.enum(["stdio","http","sse"]).optional(),url:w.string().min(1).optional(),headers:w.record(w.string(),w.string()).optional()}).strict(),nj=w.union([w.string().min(1),rj]),sj=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),as=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(nj).optional(),skills:w.array(sj).optional()}),oj=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),pi=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:as,pre_checks:w.array(oj).optional(),reviewers:w.array(as.extend({rubric_artifact:w.string().optional()})).optional(),outcomes:w.object({approve:w.string().min(1),request_changes:w.string().optional(),fail_pre_check:w.string().optional(),max_loops_exceeded:w.string().optional()}),writes_to_project_path:w.boolean().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional(),max_loops:w.number().int().positive().default(5),loop_feedback_artifact:w.string().optional(),outcomes_from_stance:w.record(w.string(),w.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),hi=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(as.extend({topic:w.string().min(1)})).optional(),consolidator:as,outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),research_artifact_prefix:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),_i=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:as.extend({initial_prompt_template:w.string().min(1)}),termination:w.object({operator_signal:w.boolean().default(!0),agent_signal:w.string().optional(),max_turns:w.number().int().positive().default(20),timeout_seconds:w.number().int().positive().optional()}),outcomes:w.object({done:w.string().min(1),timeout:w.string().optional()}),artifact_name:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),gi=w.object({type:w.literal("Loop"),state_name:w.string().min(1),over:w.string().min(1),item_var:w.string().min(1),body:w.string().min(1),outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),stop_on_error:w.boolean().default(!0),max_items:w.number().int().positive().default(1e3)}),yi=w.object({type:w.literal("ShellStep"),state_name:w.string().min(1),command:w.string().min(1),outcomes_from_exit:w.record(w.string(),w.string().min(1)),timeout_ms:w.number().int().nonnegative().optional(),capture_output_to:w.string().optional(),writes_to_project_path:w.boolean().optional()}),Gh=w.object({type:w.literal("Choice"),state_name:w.string().min(1),branches:w.array(w.object({when:w.string().min(1),next:w.string().min(1)})).default([]),default_next:w.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{sr(Vc(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}`})}}),ij=w.discriminatedUnion("type",[Xh,pi,hi,_i,gi,yi,Gh]),aj=w.object({type:w.literal("ForEach"),state_name:w.string().min(1),items_from:w.string().min(1),mode:w.enum(["sequential","parallel"]).default("sequential"),max_concurrency:w.number().int().positive().default(1),on_item_failure:w.enum(["continue","stop"]).default("stop"),body:ij,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((t,e)=>{try{sr(Vc(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}`})}}),lj=w.object({type:w.literal("Subflow"),state_name:w.string().min(1),workflow_name:w.string().min(1),inputs:w.record(w.string(),w.string().min(1)).optional(),outcomes:w.record(w.string(),w.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{sr(Vc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),cj=w.discriminatedUnion("type",[Xh,pi,hi,_i,gi,yi,Gh,aj,lj]),wi=w.object({name:w.string().min(1),version:w.number().int().positive(),definition_schema_version:w.union([w.literal(1),w.literal(2)]),description:w.string().optional(),estimated_duration_ms:w.number().int().nonnegative().optional(),primitive_version:w.union([w.literal(1),w.literal(2)]).default(1),start_at:w.string().min(1),states:w.record(w.string().min(1),cj),terminals:w.record(w.string().min(1),tj),errors:Gc,concurrency_key:w.string().min(1).optional(),concurrent_limit:w.number().int().positive().optional(),default_task_timeout_ms:w.number().int().positive().max(216e5).optional(),inputs:w.array(Bc).optional(),outputs:w.array(qc).optional(),triggers:w.array(Hc).optional(),read_only:w.boolean().optional(),requires:Xc}).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 uj,Ei,dj,fj,mj,wt,cn=b(()=>{"use strict";ln();uj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ei=Q.string().regex(uj),dj=Q.object({step_id:Ei,type:Q.literal("main"),index:Q.number().int().min(0)}),fj=Q.record(Ei,Q.record(Q.string().min(1),Q.array(Q.array(dj)))),mj=Q.object({id:Ei,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),wt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:Gc,inputs:Q.array(Bc).optional(),outputs:Q.array(qc).optional(),steps:Q.array(mj).min(1),connections:fj.default({}),entry_step_id:Ei,triggers:Q.array(Hc).optional(),read_only:Q.boolean().optional(),requires:Xc}).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 bi(t){return Yc(t)}function Yc(t){if(Array.isArray(t))return t.map(Yc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Yc(e[n]);if(typeof r.type=="string"){let n=hj[r.type];n!==void 0&&(r.type=n)}return r}var Kc,pj,hj,zc=b(()=>{"use strict";Kc="lmctl.builtin.",pj={Review:`${Kc}Review`,Research:`${Kc}Research`,Consolidate:`${Kc}Consolidate`},hj=Object.fromEntries(Object.entries(pj).map(([t,e])=>[e,t]))});import{readFileSync as _j}from"node:fs";function Yh(t){return gj(t)}function gj(t){let e=bi(Ej(t));if(wj(e),zh(e)===3)return yj(e);let r=wi.safeParse(e);if(!r.success)throw new Ct({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=bj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Ct(n);return r.data}function yj(t){let e=wt.safeParse(t);if(!e.success)throw new Ct({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function wj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=zh(t);if(!(e===null||Vh.includes(e)))throw new Ct({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Vh.join(", ")}`}]})}function zh(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 Ej(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1421
+ `)||e.startsWith("{")||e.startsWith("[")?Kh(t,"$"):e.endsWith(".json")?Kh(_j(e,"utf8"),e):t}function Kh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Ct({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function bj(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"}),Sj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function Sj(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 Vh,Ct,Zh=b(()=>{"use strict";ln();cn();zc();Vh=[1,2,3],Ct=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 Tj}from"node:crypto";function Qh(t,e){let r=kj(e),n=Tj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function kj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var e_=b(()=>{"use strict";cn()});function xj(t,e){let r=Ij[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 s_(t){let e=[],r=(v,I)=>{throw new un([{line:v,message:I}])},n=t.split(`
1422
+ `),s=[];for(let v=0;v<n.length;v+=1){let O=jj(n[v]).trim();O.length>0&&s.push({n:v+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,_=(v,I,O,J,W,L)=>{l.has(v)&&r(J,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(J,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:I,params:O,line:J,isTerminal:W,...L?{members:L}:{}}),u.push(v)},T=v=>{let I=[],O=v+1;for(;O<s.length;O+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(J===null)break;I.push({label:J[1],dst:J[2]})}return{branches:I,nextIdx:O-1}};for(let v=1;v<s.length;v+=1){let{n:I,text:O}=s[v],J=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){v!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),L=or(W[1],I,r);for(let te of Object.keys(L))r_.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...r_].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(J==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=t_[te];ie===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(t_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:ye,members:Tt}=xj(ie,or(_e,I,r));_(L,ie,ye,I,!1,Object.keys(Tt).length>0?Tt:void 0);continue}if(J==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=n_[te];ie===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(n_).join(", ")})`),p.has(L)&&r(I,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:ie,parameters:or(_e,I,r)});continue}if(J==="mcp"||J==="skill"){let W=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(I,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${O}`),L=W[1],te=W[2].trim(),_e=J==="mcp"?h:g;_e.has(L)&&r(I,`duplicate ${J} declaration: ${L}`);let ie;if(te.startsWith("{")){let ye=or(te,I,r);J==="mcp"?ie={...ye,name:L}:((typeof ye.content!="string"||ye.content.length===0)&&r(I,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:L,content:ye.content})}else{let ye=o_(te);(typeof ye!="string"||ye.length===0)&&r(I,`\`${J} ${L}\`: string form must be a non-empty file path or http(s) URL`),ie=ye}_e.set(L,ie);continue}if(J==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},I,!0);continue}if(J==="seq"){let L=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(L.length<3||L.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<L.length+1&&!(te+2>L.length-1);te+=2){let _e=L[te],ie=L[te+1],ye=L[te+2],Tt=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Tt,dstDeclId:ye,line:I})}continue}if(J==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],_e,ie=v+1;for(;ie<s.length;ie+=1){let ye=s[ie].text,Tt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(Tt!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Tt[2];te.push({when:Tt[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:L,port:jn,dstDeclId:Tt[3],line:s[ie].n});continue}let Ja=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(Ja!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\` has more than one \`default\``);let jn=Ja[1];_e=`@terminal:${jn}`,c.push({srcDeclId:L,port:jn,dstDeclId:Ja[2],line:s[ie].n});continue}break}te.length===0&&r(I,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},I,!1),v=ie-1;continue}if(J==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(W[1],"lmctl/loop",or(W[2],I,r),I,!1);continue}if(J==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),L=or(W[2],I,r);"mode"in L&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(W[1],"lmctl/foreach",L,I,!1);continue}if(J==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),L=W[1],te=or(W[2],I,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(I,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...ye}=te;_(L,"lmctl/subflow",{workflow_name:_e,...ye},I,!1),d.push({declId:L,target:_e,line:I});continue}if(J==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),L=W[1],te=or(W[2],I,r),{branches:_e,nextIdx:ie}=T(v);_e.length===0&&r(I,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let ye of _e)c.push({srcDeclId:L,port:ye.label,dstDeclId:ye.dst,line:I});v=ie;continue}if(J==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}r(I,`unknown statement \`${J}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=v=>{if(Array.isArray(v)){for(let O of v)E(O);return}if(typeof v!="object"||v===null)return;let I=v;if(typeof I.alias=="string")for(let[O,J]of[["mcp",h],["skills",g]]){let W=I[O];Array.isArray(W)&&(I[O]=W.map(L=>typeof L=="string"&&J.has(L)?structuredClone(J.get(L)):L))}for(let O of Object.values(I))E(O)};for(let v of u){let I=l.get(v);I.members!==void 0&&E(I.members)}let k=v=>Qh(i,v),$=u.map(v=>{let I=l.get(v);return{id:k(v),name:v,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),x={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let I=k(v.srcDeclId);x[I]??={},x[I][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),x[I][v.port]=[[{step_id:k(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let I=l.get(v);Nj.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.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 A=new Map;for(let v of c){let I=A.get(v.srcDeclId);I===void 0?A.set(v.srcDeclId,[v.dstDeclId]):I.push(v.dstDeclId)}for(let v of u){let I=l.get(v);if(I.type!=="lmctl/loop")continue;let O=I.params.body;if(typeof O=="string"&&l.has(O)){let J=A.get(v);J===void 0?A.set(v,[O]):J.push(O)}}let D=new Set([f]),C=[f];for(;C.length>0;){let v=C.shift();for(let I of A.get(v)??[])D.has(I)||(D.add(I),C.push(I))}for(let v of u)D.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let H=new Map;for(let v of c){let I=H.get(v.srcDeclId);I===void 0&&(I=new Set,H.set(v.srcDeclId,I)),I.add(v.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let I=l.get(v);if(I.isTerminal)continue;let O=H.get(v)??new Set;if(I.type==="lmctl/review"){let W=[...O].some(L=>!R.has(L));!O.has("approve")&&!W&&r(I.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -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 J=$j[I.type];if(J!==void 0)for(let W of J)O.has(W)||r(I.line,`uncovered outcome: required outcome \`${W}\` of step \`${v}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${v} -${W}-> <target|terminal>\`)`);else O.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${v}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let I=l.get(v),O=vj[I.type];if(O===void 0)continue;let J={...I.params,...I.members??{},type:O.v2type,state_name:v,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},W=O.schema.safeParse(J);if(!W.success){let L=W.error.issues[0],te=L.path.length===0?"$":L.path.map(String).join(".");r(I.line,`step \`${v}\` (\`${I.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let U={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:$,connections:x,entry_step_id:k(f)},z=wt.safeParse(U);if(!z.success)throw new un(z.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return z.data}function jj(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 or(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 Aj(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]=o_(l)}return s}function Aj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function o_(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 vj,Ij,t_,un,Nj,$j,r_,n_,i_=b(()=>{"use strict";cn();e_();ln();vj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:pi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:hi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:_i},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:gi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:yi}},Ij={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};t_={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"},un=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1423
1423
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1424
- `)}`),this.issues=e,this.name="DslCompileError"}},Nj=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"]),$j={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},t_=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),r_={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as Rj}from"node:fs";function Oj(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function Lj(t){for(let e of t.split(`
1425
- `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Ce(t){if(typeof t=="string"&&Oj()&&Lj(t)){let r;try{r=n_(t)}catch(s){throw s instanceof un?new Mt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=wt.safeParse(r);if(!n.success)throw new Mt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=bi(Mj(t));if(Dj(e)&&e.definition_schema_version===3){let r=wt.safeParse(e);if(!r.success)throw new Mt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return Cj(e)}function Cj(t){let e=wi.safeParse(t);if(!e.success)throw new Mt(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 Mt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Kh(r)}catch(s){throw s instanceof Ct?new Zc(s):s}}function Mj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1426
- `)||e.startsWith("{")||e.startsWith("[")?i_(t):e.endsWith(".json")?i_(Rj(e,"utf8")):t}function i_(t){return JSON.parse(t)}function Dj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Zc,Mt,dn=b(()=>{"use strict";ln();zh();zc();cn();o_();Zc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Mt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Si(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:Pj(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:Uj(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function Pj(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=Fj(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function Fj(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 Uj(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Qc=b(()=>{"use strict"});var a_={};ce(a_,{enqueueFromAgentOutput:()=>Bj,enqueueFromGitHubIssue:()=>eu,enqueueManual:()=>Wj,enqueueScheduled:()=>qj});function eu(t,e){return ki(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:Ti(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function Wj(t,e){return ki(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:Ti(e.payload),concurrency_key:e.concurrency_key})}function Bj(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return ki(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:Ti(e.payload),concurrency_key:e.concurrency_key})}function qj(t,e){return ki(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:Ti(e.payload),concurrency_key:e.concurrency_key})}function Ti(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function ki(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Ce(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Si({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var tu=b(()=>{"use strict";dn();Qc()});async function c_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return l_(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 Hj(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...Jj(o.parameters_override)},l=l_(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 l_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[eu(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function Hj(t,e){if(t===null||t.trim().length===0)return!0;try{return await $r(t,e)===!0}catch{return!1}}function Jj(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 u_=b(()=>{"use strict";an();tu()});import{spawnSync as Xj}from"node:child_process";async function nu(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=Xj(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(!Vj(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await c_({dal:t.dal,project:t.project,issue:Kj(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function fn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=Gj(r.intake_config);try{let s=await nu({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 Gj(t){if(t===null)return{};try{let e=JSON.parse(t);if(!ru(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 Vj(t){return Array.isArray(t)&&t.every(e=>{if(!ru(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:ru(n)&&typeof n.name=="string"))})}function Kj(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 ru(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var vi=b(()=>{"use strict";u_()});function f_(t){return async e=>zj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function zj(t,e,r={}){let n=Zj(e.path),s={"content-type":"application/json",...e.headers??{},[Ii]:su},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 Qj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${d_(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} ${d_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function d_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function Zj(t){let e=t.startsWith("/")?t:`/${t}`;return`${Yj}${e}`}async function Qj(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()!==Ii&&(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 Ii,su,Yj,ou=b(()=>{"use strict";Ii="x-mailbox-channel",su="1",Yj="http://mailbox.local"});import{createHash as m_,createHmac as eA,timingSafeEqual as tA}from"node:crypto";function p_(){return async(t,e)=>{let r=h_();if(r===null||iA(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Ii)===su){await e();return}let n=t.req.query("token");if(n!==void 0&&xi(n,r)){au(t,r),await e();return}if(oA(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 h_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function __(t){let e=h_();return e!==null&&xi(t,e)}function au(t,e,r=new Date){t.header("Set-Cookie",`${iu}=${nA(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function g_(t){t.header("Set-Cookie",`${iu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function nA(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+rA*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${y_(t,n)}`,"utf8").toString("base64url")}function sA(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:xi(s[2],y_(e,`${s[0]}|${s[1]}`))}function xi(t,e){return tA(m_("sha256").update(t).digest(),m_("sha256").update(e).digest())}function oA(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&xi(r,e))return!0;let n=aA(t.req.header("cookie")??"")[iu];return n!==void 0&&sA(n,e)}function iA(t){return t==="/login"||t==="/logout"}function aA(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 y_(t,e){return eA("sha256",t).update(e).digest("hex")}var iu,rA,w_=b(()=>{"use strict";ou();iu="lmctl_next_session",rA=30});import{existsSync as mn,mkdirSync as lA,readdirSync as cA,readFileSync as Ni,unlinkSync as uA,writeFileSync as uu}from"node:fs";import{join as jr}from"node:path";function et(t){if(!dA.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function b_(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 hA(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:E_,updated_at:E_}:null}function fA(t,e,r,n){let s=r!==null?`
1424
+ `)}`),this.issues=e,this.name="DslCompileError"}},Nj=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"]),$j={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},r_=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),n_={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as Rj}from"node:fs";function Oj(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function Lj(t){for(let e of t.split(`
1425
+ `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Ce(t){if(typeof t=="string"&&Oj()&&Lj(t)){let r;try{r=s_(t)}catch(s){throw s instanceof un?new Mt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=wt.safeParse(r);if(!n.success)throw new Mt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=bi(Mj(t));if(Dj(e)&&e.definition_schema_version===3){let r=wt.safeParse(e);if(!r.success)throw new Mt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return Cj(e)}function Cj(t){let e=wi.safeParse(t);if(!e.success)throw new Mt(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 Mt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Yh(r)}catch(s){throw s instanceof Ct?new Zc(s):s}}function Mj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1426
+ `)||e.startsWith("{")||e.startsWith("[")?a_(t):e.endsWith(".json")?a_(Rj(e,"utf8")):t}function a_(t){return JSON.parse(t)}function Dj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Zc,Mt,dn=b(()=>{"use strict";ln();Zh();zc();cn();i_();Zc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Mt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Si(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:Pj(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:Uj(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function Pj(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=Fj(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function Fj(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 Uj(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Qc=b(()=>{"use strict"});var l_={};ce(l_,{enqueueFromAgentOutput:()=>Bj,enqueueFromGitHubIssue:()=>eu,enqueueManual:()=>Wj,enqueueScheduled:()=>qj});function eu(t,e){return ki(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:Ti(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function Wj(t,e){return ki(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:Ti(e.payload),concurrency_key:e.concurrency_key})}function Bj(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return ki(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:Ti(e.payload),concurrency_key:e.concurrency_key})}function qj(t,e){return ki(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:Ti(e.payload),concurrency_key:e.concurrency_key})}function Ti(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function ki(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Ce(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Si({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var tu=b(()=>{"use strict";dn();Qc()});async function u_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return c_(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 Hj(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...Jj(o.parameters_override)},l=c_(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 c_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[eu(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function Hj(t,e){if(t===null||t.trim().length===0)return!0;try{return await $r(t,e)===!0}catch{return!1}}function Jj(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 d_=b(()=>{"use strict";an();tu()});import{spawnSync as Xj}from"node:child_process";async function nu(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=Xj(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(!Vj(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await u_({dal:t.dal,project:t.project,issue:Kj(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function fn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=Gj(r.intake_config);try{let s=await nu({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 Gj(t){if(t===null)return{};try{let e=JSON.parse(t);if(!ru(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 Vj(t){return Array.isArray(t)&&t.every(e=>{if(!ru(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:ru(n)&&typeof n.name=="string"))})}function Kj(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 ru(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var vi=b(()=>{"use strict";d_()});function m_(t){return async e=>zj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function zj(t,e,r={}){let n=Zj(e.path),s={"content-type":"application/json",...e.headers??{},[Ii]:su},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 Qj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${f_(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} ${f_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function f_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function Zj(t){let e=t.startsWith("/")?t:`/${t}`;return`${Yj}${e}`}async function Qj(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()!==Ii&&(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 Ii,su,Yj,ou=b(()=>{"use strict";Ii="x-mailbox-channel",su="1",Yj="http://mailbox.local"});import{createHash as p_,createHmac as eA,timingSafeEqual as tA}from"node:crypto";function h_(){return async(t,e)=>{let r=__();if(r===null||iA(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Ii)===su){await e();return}let n=t.req.query("token");if(n!==void 0&&xi(n,r)){au(t,r),await e();return}if(oA(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 __(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function g_(t){let e=__();return e!==null&&xi(t,e)}function au(t,e,r=new Date){t.header("Set-Cookie",`${iu}=${nA(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function y_(t){t.header("Set-Cookie",`${iu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function nA(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+rA*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${w_(t,n)}`,"utf8").toString("base64url")}function sA(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:xi(s[2],w_(e,`${s[0]}|${s[1]}`))}function xi(t,e){return tA(p_("sha256").update(t).digest(),p_("sha256").update(e).digest())}function oA(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&xi(r,e))return!0;let n=aA(t.req.header("cookie")??"")[iu];return n!==void 0&&sA(n,e)}function iA(t){return t==="/login"||t==="/logout"}function aA(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 w_(t,e){return eA("sha256",t).update(e).digest("hex")}var iu,rA,E_=b(()=>{"use strict";ou();iu="lmctl_next_session",rA=30});import{existsSync as mn,mkdirSync as lA,readdirSync as cA,readFileSync as Ni,unlinkSync as uA,writeFileSync as uu}from"node:fs";import{join as jr}from"node:path";function et(t){if(!dA.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function S_(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 hA(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:b_,updated_at:b_}:null}function fA(t,e,r,n){let s=r!==null?`
1427
1427
  description: ${r}`:"";return`---
1428
1428
  name: ${t}${s}
1429
1429
  type: ${e}
1430
1430
  ---
1431
- ${n}`}function mA(t,e,r,n){let s=jr(t,du),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=mn(s)?Ni(s,"utf8"):"",a=new RegExp(`^- \\[${S_(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1431
+ ${n}`}function mA(t,e,r,n){let s=jr(t,du),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=mn(s)?Ni(s,"utf8"):"",a=new RegExp(`^- \\[${T_(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1432
1432
  `)?`${i}
1433
1433
  ${o}
1434
1434
  `:`${i}${o}
1435
- `,uu(s,i,"utf8")}function pA(t,e){let r=jr(t,du);if(!mn(r))return;let n=Ni(r,"utf8"),s=new RegExp(`^- \\[${S_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&uu(r,n.replace(s,""),"utf8")}function S_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function hA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ut(t,e){return t.durable_memory_mode==="db"?new cu(e,t.id):new lu(t.local_path)}var dA,du,E_,lu,cu,fu=b(()=>{"use strict";dA=/^[a-zA-Z0-9_-]+$/;du="MEMORY.md",E_="1970-01-01T00:00:00.000Z",lu=class{dir;constructor(e){this.dir=jr(e,"durable-memory")}read(e){et(e);let r=jr(this.dir,`${e}.md`);if(!mn(r))return null;let n=Ni(r,"utf8");return b_(e,n)}write(e){et(e.name),lA(this.dir,{recursive:!0});let r=jr(this.dir,`${e.name}.md`),n=!mn(r),s=fA(e.name,e.type,e.description??null,e.body);return uu(r,s,"utf8"),mA(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){et(e);let r=jr(this.dir,`${e}.md`);return mn(r)?(uA(r),pA(this.dir,e),!0):!1}listFiles(){if(!mn(this.dir))return[];let e=cA(this.dir).filter(n=>n.endsWith(".md")&&n!==du),r=[];for(let n of e){let s=n.slice(0,-3),o=Ni(jr(this.dir,n),"utf8"),i=b_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};cu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){et(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(e){et(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return et(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function k_(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=ut(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=ut(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||!T_.has(a))return n.json({error:`invalid type: must be one of ${[...T_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ut(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=ut(o,r),a=n.req.query("type");return n.json(i.list(a))})}var T_,v_=b(()=>{"use strict";fu();T_=new Set(["user","feedback","project","reference"])});function gA(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(_A[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function yA(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 I_(t,e=new Date){let{time:r,date:n}=yA(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=gA(h.data),T=h.data.length,E=new Uint8Array(30+g.length),k=new DataView(E.buffer);k.setUint32(0,67324752,!0),k.setUint16(4,20,!0),k.setUint16(6,0,!0),k.setUint16(8,0,!0),k.setUint16(10,r,!0),k.setUint16(12,n,!0),k.setUint32(14,_,!0),k.setUint32(18,T,!0),k.setUint32(22,T,!0),k.setUint16(26,g.length,!0),k.setUint16(28,0,!0),E.set(g,30),s.push(E,h.data);let $=new Uint8Array(46+g.length),x=new DataView($.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,_,!0),x.setUint32(20,T,!0),x.setUint32(24,T,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,i,!0),$.set(g,46),o.push($),i+=E.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var _A,x_=b(()=>{"use strict";_A=(()=>{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 Ai,mkdirSync as wA,readdirSync as EA,readFileSync as j_,statSync as bA,unlinkSync as SA,writeFileSync as TA}from"node:fs";import{join as us}from"node:path";function A_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(i===null||i.length===0)return j(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return j(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return j(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return j(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return j(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return j(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return j(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return j(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?j(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return j(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return j(n,"missing or empty alias",400);if(a===null||a.length===0)return j(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return j(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return j(n,"member not found",404);let i=await dt(n);if(typeof i=="string")return j(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return j(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return j(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return j(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return j(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?j(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!$i.includes(l))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{et(i)}catch(d){return j(n,d.message,400)}let c=ut(s,r);try{if(c.read(i)!==null)return j(n,`chapter already exists: ${i}`,409)}catch(d){return j(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return j(n,d.message,400)}let u=c.read(i);return u===null?j(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i===null?j(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter"),i=await dt(n);if(typeof i=="string")return j(n,i,400);let a=ut(s,r),l;try{l=a.read(o)}catch(m){return j(n,m.message,400)}if(l===null)return j(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!$i.includes(d))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return j(n,m.message,400)}let f=a.read(o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i?n.json({removed:!0}):j(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?j(n,"project not found",404):n.json(vA(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!ji.has(l))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);try{et(i)}catch(f){return j(n,f.message,400)}let c=ls(s.local_path),u=us(c,`${i}.md`);if(Ai(u))return j(n,`chapter already exists: ${i}`,409);wA(c,{recursive:!0}),$_(u,i,l,ae(o,"description"),a);let d=cs(c,i);return d===null?j(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);try{et(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=cs(ls(s.local_path),n.req.param("chapter"));return o===null?j(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(m){return j(n,m.message,400)}let i=ls(s.local_path),a=cs(i,o);if(a===null)return j(n,"chapter not found",404);let l=await dt(n);if(typeof l=="string")return j(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!ji.has(d))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);$_(us(i,`${o}.md`),o,d,u,c);let f=cs(i,o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(a){return j(n,a.message,400)}let i=us(ls(s.local_path),`${o}.md`);return Ai(i)?(SA(i),n.json({removed:!0})):j(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>j(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await dt(n);return typeof s=="string"?j(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(N_))),t.post("/api/chat/sessions",async n=>{let s=await kA(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(N_,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?j(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return j(n,"chat session not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return j(n,"role must be one of user|assistant|tool",400);if(a===null)return j(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return j(n,"invalid run id",400);if(r.getRun(s)===null)return j(n,"run not found",404);let i=Ir(r,s),a=[];for(let c of i){let u=xA(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=j_(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=I_(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function j(t,e,r){return t.json({error:e},r)}async function dt(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 kA(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(t,e){let r=t[e];return typeof r!="string"?null:r}function ls(t){return us(t,"ai-test")}function cs(t,e){let r=us(t,`${e}.md`);if(!Ai(r))return null;let n=j_(r,"utf8"),s=IA(n),o=bA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function vA(t){let e=ls(t);return Ai(e)?EA(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 $_(t,e,r,n,s){let o=n!==null&&n.length>0?`
1435
+ `,uu(s,i,"utf8")}function pA(t,e){let r=jr(t,du);if(!mn(r))return;let n=Ni(r,"utf8"),s=new RegExp(`^- \\[${T_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&uu(r,n.replace(s,""),"utf8")}function T_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function hA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ut(t,e){return t.durable_memory_mode==="db"?new cu(e,t.id):new lu(t.local_path)}var dA,du,b_,lu,cu,fu=b(()=>{"use strict";dA=/^[a-zA-Z0-9_-]+$/;du="MEMORY.md",b_="1970-01-01T00:00:00.000Z",lu=class{dir;constructor(e){this.dir=jr(e,"durable-memory")}read(e){et(e);let r=jr(this.dir,`${e}.md`);if(!mn(r))return null;let n=Ni(r,"utf8");return S_(e,n)}write(e){et(e.name),lA(this.dir,{recursive:!0});let r=jr(this.dir,`${e.name}.md`),n=!mn(r),s=fA(e.name,e.type,e.description??null,e.body);return uu(r,s,"utf8"),mA(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){et(e);let r=jr(this.dir,`${e}.md`);return mn(r)?(uA(r),pA(this.dir,e),!0):!1}listFiles(){if(!mn(this.dir))return[];let e=cA(this.dir).filter(n=>n.endsWith(".md")&&n!==du),r=[];for(let n of e){let s=n.slice(0,-3),o=Ni(jr(this.dir,n),"utf8"),i=S_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};cu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){et(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(e){et(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return et(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function v_(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=ut(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=ut(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||!k_.has(a))return n.json({error:`invalid type: must be one of ${[...k_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ut(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=ut(o,r),a=n.req.query("type");return n.json(i.list(a))})}var k_,I_=b(()=>{"use strict";fu();k_=new Set(["user","feedback","project","reference"])});function gA(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(_A[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function yA(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 x_(t,e=new Date){let{time:r,date:n}=yA(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=gA(h.data),T=h.data.length,E=new Uint8Array(30+g.length),k=new DataView(E.buffer);k.setUint32(0,67324752,!0),k.setUint16(4,20,!0),k.setUint16(6,0,!0),k.setUint16(8,0,!0),k.setUint16(10,r,!0),k.setUint16(12,n,!0),k.setUint32(14,_,!0),k.setUint32(18,T,!0),k.setUint32(22,T,!0),k.setUint16(26,g.length,!0),k.setUint16(28,0,!0),E.set(g,30),s.push(E,h.data);let $=new Uint8Array(46+g.length),x=new DataView($.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,_,!0),x.setUint32(20,T,!0),x.setUint32(24,T,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,i,!0),$.set(g,46),o.push($),i+=E.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var _A,N_=b(()=>{"use strict";_A=(()=>{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 Ai,mkdirSync as wA,readdirSync as EA,readFileSync as A_,statSync as bA,unlinkSync as SA,writeFileSync as TA}from"node:fs";import{join as us}from"node:path";function R_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(i===null||i.length===0)return j(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return j(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return j(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return j(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return j(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return j(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return j(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return j(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?j(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return j(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return j(n,"missing or empty alias",400);if(a===null||a.length===0)return j(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return j(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return j(n,"member not found",404);let i=await dt(n);if(typeof i=="string")return j(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return j(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return j(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return j(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return j(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?j(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!$i.includes(l))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{et(i)}catch(d){return j(n,d.message,400)}let c=ut(s,r);try{if(c.read(i)!==null)return j(n,`chapter already exists: ${i}`,409)}catch(d){return j(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return j(n,d.message,400)}let u=c.read(i);return u===null?j(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i===null?j(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter"),i=await dt(n);if(typeof i=="string")return j(n,i,400);let a=ut(s,r),l;try{l=a.read(o)}catch(m){return j(n,m.message,400)}if(l===null)return j(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!$i.includes(d))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return j(n,m.message,400)}let f=a.read(o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i?n.json({removed:!0}):j(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?j(n,"project not found",404):n.json(vA(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!ji.has(l))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);try{et(i)}catch(f){return j(n,f.message,400)}let c=ls(s.local_path),u=us(c,`${i}.md`);if(Ai(u))return j(n,`chapter already exists: ${i}`,409);wA(c,{recursive:!0}),j_(u,i,l,ae(o,"description"),a);let d=cs(c,i);return d===null?j(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);try{et(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=cs(ls(s.local_path),n.req.param("chapter"));return o===null?j(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(m){return j(n,m.message,400)}let i=ls(s.local_path),a=cs(i,o);if(a===null)return j(n,"chapter not found",404);let l=await dt(n);if(typeof l=="string")return j(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!ji.has(d))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);j_(us(i,`${o}.md`),o,d,u,c);let f=cs(i,o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(a){return j(n,a.message,400)}let i=us(ls(s.local_path),`${o}.md`);return Ai(i)?(SA(i),n.json({removed:!0})):j(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>j(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await dt(n);return typeof s=="string"?j(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions($_))),t.post("/api/chat/sessions",async n=>{let s=await kA(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession($_,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?j(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return j(n,"chat session not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return j(n,"role must be one of user|assistant|tool",400);if(a===null)return j(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return j(n,"invalid run id",400);if(r.getRun(s)===null)return j(n,"run not found",404);let i=Ir(r,s),a=[];for(let c of i){let u=xA(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=A_(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=x_(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function j(t,e,r){return t.json({error:e},r)}async function dt(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 kA(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(t,e){let r=t[e];return typeof r!="string"?null:r}function ls(t){return us(t,"ai-test")}function cs(t,e){let r=us(t,`${e}.md`);if(!Ai(r))return null;let n=A_(r,"utf8"),s=IA(n),o=bA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function vA(t){let e=ls(t);return Ai(e)?EA(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 j_(t,e,r,n,s){let o=n!==null&&n.length>0?`
1436
1436
  description: ${n}`:"",i=`---
1437
1437
  name: ${e}${o}
1438
1438
  type: ${r}
1439
1439
  ---
1440
- ${s}`;TA(t,i,"utf8")}function IA(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 xA(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?NA(t.path):$A(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function NA(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function $A(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var $i,ji,N_,R_=b(()=>{"use strict";Ot();x_();fu();$i=["user","feedback","project","reference"],ji=new Set(["smoke","integration","vision","scenario","regression"]),N_="operator"});function Ae(t,e){return`<!doctype html>
1440
+ ${s}`;TA(t,i,"utf8")}function IA(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 xA(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?NA(t.path):$A(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function NA(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function $A(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var $i,ji,$_,O_=b(()=>{"use strict";Ot();N_();fu();$i=["user","feedback","project","reference"],ji=new Set(["smoke","integration","vision","scenario","regression"]),$_="operator"});function Ae(t,e){return`<!doctype html>
1441
1441
  <html lang="en">
1442
1442
  <head>
1443
1443
  <meta charset="utf-8">
@@ -1498,46 +1498,46 @@ ${s}`;TA(t,i,"utf8")}function IA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1498
1498
  </nav>
1499
1499
  <main>${e}</main>
1500
1500
  </body>
1501
- </html>`}function S(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function fe(t,e){let r=t.map(s=>`<th>${S(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(o=>`<td>${o}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function le(t){return`<pre>${S(JSON.stringify(t,null,2))}</pre>`}var mu=b(()=>{"use strict"});function O_(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
1501
+ </html>`}function S(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function fe(t,e){let r=t.map(s=>`<th>${S(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(o=>`<td>${o}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function le(t){return`<pre>${S(JSON.stringify(t,null,2))}</pre>`}var mu=b(()=>{"use strict"});function L_(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
1502
1502
  JOIN step s ON s.id = sa.step_id
1503
1503
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,t).length>0)return;let n=e.getRun(t);if(n===null)return;let s=e.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t);if(s.length===0)return;let o=s[0].id,i=e.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",t),a=e.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
1504
1504
  JOIN step s ON s.id = sa.step_id
1505
1505
  WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let R of a){let U=l.get(R.step_id)??[];U.push({kind:R.kind,id:R.id}),l.set(R.step_id,U)}let c=i.map(R=>({id:R.id,state_name:R.state_name,outcome:R.outcome,duration_ms:R.started_at!==null&&R.ended_at!==null?Math.max(0,new Date(R.ended_at).getTime()-new Date(R.started_at).getTime()):null,artifacts:l.get(R.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let R of d)try{let U=JSON.parse(R.payload);typeof U.elapsedMs=="number"&&U.elapsedMs>0&&(f+=U.elapsedMs)}catch{}let m=u.map(R=>({kind:R.kind,count:R.count,total_elapsed_ms:R.kind==="tool_result"?f:0})),p=c.filter(R=>R.outcome==="request_changes"),h=[...new Set(p.map(R=>R.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),E=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,k=E!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1506
1506
  WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,E,g,_):[],x=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1507
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],A=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",D=e.getWorkflow(n.workflow_id),C=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,H={run_id:t,workflow_name:D?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:C,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:k,token_totals:A};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(H)})}var L_=b(()=>{"use strict"});import{spawnSync as M_}from"node:child_process";function pu(t){return jA[t]??`no install hint; ensure '${t}' is on PATH`}function AA(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 C_(t){return M_("which",[t],{encoding:"utf8"}).status===0}function D_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!C_(e)){let r=pu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!C_(e)){let s=pu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=AA(e);if(r===null)continue;let n=M_(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:pu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var jA,P_=b(()=>{"use strict";jA={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 RA,readdirSync as OA,readFileSync as LA}from"node:fs";import{join as F_}from"node:path";function CA(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(`
1508
- `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function U_(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 W_(t,e){if(e.length===0)return null;let r=F_(t,"durable-memory");if(!RA(r))return null;let n;try{n=OA(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=LA(F_(r,o),"utf8");if(CA(i).some(l=>e.includes(l))){let l=U_(i,"name")??o.replace(".md",""),c=U_(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 B_=b(()=>{"use strict"});function gu(t){let e=t.trim().replace(MA,"").trim();for(let r=0;r<4;r+=1){let n=DA.exec(e);if(n===null)break;e=n[2].trim()}return e}function q_(t){let e=t.trim(),r=PA.exec(e);if(r!==null)return r[2];let n=FA.exec(e);return n!==null?n[0]:null}function ds(t,e){let r=t.split(`
1509
- `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=gu(r[i]),l=hu.exec(a);if(l===null)continue;let c=l[1].trim();if(_u.test(c))continue;let u=q_(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=gu(r[i]),l=hu.exec(a);if(l===null)break;let c=_u.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function H_(t){let e=t.split(`
1510
- `),r=null;for(let n=0;n<e.length;n+=1){let s=gu(e[n]),o=hu.exec(s);if(o===null)continue;let i=o[1].trim();if(_u.test(i))continue;let a=q_(i);if(a===null||!Ur(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var MA,DA,hu,_u,PA,FA,yu=b(()=>{"use strict";Pn();MA=/^#{1,6}\s+/,DA=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,hu=/^STANCE:\s+(.+)$/,_u=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PA=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FA=/^[A-Za-z0-9_-]+/});function J_(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 X_=b(()=>{"use strict"});import{readFileSync as UA}from"node:fs";import{dirname as WA,join as BA}from"node:path";import{fileURLToPath as qA}from"node:url";function XA(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function YA(t){let e=[],r=[];for(let n of t)HA.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function zA(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&JA.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 ZA(t,e){if(t.length===0)return{matched:!1};let r=YA(t);for(let n of r){let s=zA(n,e);if(s.matched)return s}return{matched:!1}}function wu(t){return ZA(t,KA)}function QA(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 Eu(t){return QA(t).split(" ").filter(e=>e.length>0)}var HA,JA,GA,VA,KA,G_=b(()=>{"use strict";HA=new Set(["&&","||",";","|",">",">>","<","<<"]),JA=/^[A-Za-z_][A-Za-z0-9_]*=/;GA=WA(qA(import.meta.url)),VA=JSON.parse(UA(BA(GA,"side_effect_classifier.json"),"utf-8")),KA=XA(VA)});function Ri(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 V_(t,e){try{return await $r(bu(t)??t,Ri(e))===!0}catch{return!1}}async function Oi(t,e){try{return await $r(bu(t)??t,Ri(e))}catch{return}}async function K_(t,e){if(typeof t!="string")return t;let r=bu(t);if(r===null)return t;try{return await $r(r,Ri(e))}catch{return}}async function Y_(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+=eR(await $r(a,Ri(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function bu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function eR(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var fs=b(()=>{"use strict";an()});import{existsSync as z_,readdirSync as Z_,readFileSync as tR,statSync as Q_}from"node:fs";import{join as Ci}from"node:path";function eg(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 tt(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,`${ms}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Ur(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Qs,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:rR(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function rR(t){return t.length>8e3?`${t.slice(0,8e3)}
1511
- \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 tg(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=ir(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Xe(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=ir(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=ir(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=nR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return Y_(n,e)}function nR(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 ir(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 ps(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=J_(e.dal,e.run_id,()=>o),c=Su(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let E=Eu(T.summary),k=wu(E);k.matched&&!c&&(u.violation={summary:T.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),sR(T,(E,k)=>{m+=E,p+=k})},g=await Vr({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:Ie(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),oR(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&&Tu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function sR(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Li(s.input_tokens),a=Li(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Li(o.input_tokens),a=Li(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Li(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Dt(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 ps({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 pn(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(tm(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Xe(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1507
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],A=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",D=e.getWorkflow(n.workflow_id),C=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,H={run_id:t,workflow_name:D?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:C,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:k,token_totals:A};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(H)})}var C_=b(()=>{"use strict"});import{spawnSync as D_}from"node:child_process";function pu(t){return jA[t]??`no install hint; ensure '${t}' is on PATH`}function AA(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 M_(t){return D_("which",[t],{encoding:"utf8"}).status===0}function P_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!M_(e)){let r=pu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!M_(e)){let s=pu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=AA(e);if(r===null)continue;let n=D_(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:pu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var jA,F_=b(()=>{"use strict";jA={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 RA,readdirSync as OA,readFileSync as LA}from"node:fs";import{join as U_}from"node:path";function CA(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(`
1508
+ `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function W_(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 B_(t,e){if(e.length===0)return null;let r=U_(t,"durable-memory");if(!RA(r))return null;let n;try{n=OA(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=LA(U_(r,o),"utf8");if(CA(i).some(l=>e.includes(l))){let l=W_(i,"name")??o.replace(".md",""),c=W_(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 q_=b(()=>{"use strict"});function gu(t){let e=t.trim().replace(MA,"").trim();for(let r=0;r<4;r+=1){let n=DA.exec(e);if(n===null)break;e=n[2].trim()}return e}function H_(t){let e=t.trim(),r=PA.exec(e);if(r!==null)return r[2];let n=FA.exec(e);return n!==null?n[0]:null}function ds(t,e){let r=t.split(`
1509
+ `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=gu(r[i]),l=hu.exec(a);if(l===null)continue;let c=l[1].trim();if(_u.test(c))continue;let u=H_(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=gu(r[i]),l=hu.exec(a);if(l===null)break;let c=_u.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function J_(t){let e=t.split(`
1510
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=gu(e[n]),o=hu.exec(s);if(o===null)continue;let i=o[1].trim();if(_u.test(i))continue;let a=H_(i);if(a===null||!Ur(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var MA,DA,hu,_u,PA,FA,yu=b(()=>{"use strict";Pn();MA=/^#{1,6}\s+/,DA=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,hu=/^STANCE:\s+(.+)$/,_u=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PA=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FA=/^[A-Za-z0-9_-]+/});function X_(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 G_=b(()=>{"use strict"});import{readFileSync as UA}from"node:fs";import{dirname as WA,join as BA}from"node:path";import{fileURLToPath as qA}from"node:url";function XA(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function YA(t){let e=[],r=[];for(let n of t)HA.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function zA(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&JA.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 ZA(t,e){if(t.length===0)return{matched:!1};let r=YA(t);for(let n of r){let s=zA(n,e);if(s.matched)return s}return{matched:!1}}function wu(t){return ZA(t,KA)}function QA(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 Eu(t){return QA(t).split(" ").filter(e=>e.length>0)}var HA,JA,GA,VA,KA,V_=b(()=>{"use strict";HA=new Set(["&&","||",";","|",">",">>","<","<<"]),JA=/^[A-Za-z_][A-Za-z0-9_]*=/;GA=WA(qA(import.meta.url)),VA=JSON.parse(UA(BA(GA,"side_effect_classifier.json"),"utf-8")),KA=XA(VA)});function Ri(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 K_(t,e){try{return await $r(bu(t)??t,Ri(e))===!0}catch{return!1}}async function Oi(t,e){try{return await $r(bu(t)??t,Ri(e))}catch{return}}async function Y_(t,e){if(typeof t!="string")return t;let r=bu(t);if(r===null)return t;try{return await $r(r,Ri(e))}catch{return}}async function z_(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+=eR(await $r(a,Ri(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function bu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function eR(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var fs=b(()=>{"use strict";an()});import{existsSync as Z_,readdirSync as Q_,readFileSync as tR,statSync as eg}from"node:fs";import{join as Ci}from"node:path";function tg(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 tt(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,`${ms}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Ur(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Qs,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:rR(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function rR(t){return t.length>8e3?`${t.slice(0,8e3)}
1511
+ \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 rg(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=ir(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Xe(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=ir(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=ir(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=nR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return z_(n,e)}function nR(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 ir(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 ps(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=X_(e.dal,e.run_id,()=>o),c=Su(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let E=Eu(T.summary),k=wu(E);k.matched&&!c&&(u.violation={summary:T.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),sR(T,(E,k)=>{m+=E,p+=k})},g=await Vr({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:Ie(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),oR(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&&Tu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function sR(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Li(s.input_tokens),a=Li(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Li(o.input_tokens),a=Li(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Li(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Dt(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 ps({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 pn(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(rm(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Xe(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1512
1512
 
1513
- `);try{let p=await ps({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 Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function hn(t,e){return(e?.length??0)>0?W_(t.project.local_path,e):null}function rg(t){return wu(Eu(t))}function Su(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1513
+ `);try{let p=await ps({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 Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function hn(t,e){return(e?.length??0)>0?B_(t.project.local_path,e):null}function ng(t){return wu(Eu(t))}function Su(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1514
1514
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1515
- 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 Tu(t,e){if(!z_(t))return!1;let r=Ci(t,"durable-memory");function n(s){let o;try{o=Z_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Ci(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(Q_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function oR(t,e,r){let n=Ci(t.local_path,"durable-memory");if(!z_(n))return;let s;try{s=Z_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Ci(n,o),a;try{a=Q_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=tR(i,"utf8")}catch{continue}let c=aR(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1516
- `);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 aR(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||!iR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var ms,iR,We=b(()=>{"use strict";Pe();ln();Gn();B_();yu();Pn();X_();G_();fs();ms="__paused__:";iR=new Set(["user","feedback","project","reference"])});import{spawnSync as ng}from"node:child_process";function lR(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=ng("git",["diff","--quiet"],{cwd:o}).status!==0,a=ng("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,Jc),{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 sg,og=b(()=>{"use strict";We();sg={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=>lR(t,t.state)}});async function cR(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 V_(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 ig,ag=b(()=>{"use strict";We();fs();ig={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=>cR(t,t.state)}});async function uR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=hn(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 pn(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??""}
1515
+ 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 Tu(t,e){if(!Z_(t))return!1;let r=Ci(t,"durable-memory");function n(s){let o;try{o=Q_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Ci(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(eg(a).mtime>e)return!0}catch{}}return!1}return n(t)}function oR(t,e,r){let n=Ci(t.local_path,"durable-memory");if(!Z_(n))return;let s;try{s=Q_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Ci(n,o),a;try{a=eg(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=tR(i,"utf8")}catch{continue}let c=aR(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1516
+ `);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 aR(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||!iR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var ms,iR,We=b(()=>{"use strict";Pe();ln();Gn();q_();yu();Pn();G_();V_();fs();ms="__paused__:";iR=new Set(["user","feedback","project","reference"])});import{spawnSync as sg}from"node:child_process";function lR(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=sg("git",["diff","--quiet"],{cwd:o}).status!==0,a=sg("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,Jc),{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 og,ig=b(()=>{"use strict";We();og={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=>lR(t,t.state)}});async function cR(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 K_(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 ag,lg=b(()=>{"use strict";We();fs();ag={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=>cR(t,t.state)}});async function uR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=hn(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 pn(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??""}
1517
1517
  ${m}`:null).filter(m=>m!==null).join(`
1518
1518
 
1519
- `),c=`${n}:consolidator`,u=await pn(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 Dt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var lg,cg=b(()=>{"use strict";We();lg={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=>uR(t,t.state)}});async function dR(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 Oi(e.items_from,t),a=hR(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 mR(t,e,s.id,a,l):await fR(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 fR(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await dg(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 mR(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 dg(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function dg(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__":pR(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 pR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function hR(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 ug,fg=b(()=>{"use strict";We();fs();ug={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=>dR(t,t.state)}});async function _R(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=hn(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 Dt(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 ps({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 Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(mg({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ee?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}}return{kind:"paused"}}let l=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 Xe(e.agent.initial_prompt_template,t,n),d=i?`${i}
1519
+ `),c=`${n}:consolidator`,u=await pn(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 Dt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var cg,ug=b(()=>{"use strict";We();cg={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=>uR(t,t.state)}});async function dR(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 Oi(e.items_from,t),a=hR(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 mR(t,e,s.id,a,l):await fR(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 fR(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await fg(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 mR(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 fg(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function fg(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__":pR(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 pR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function hR(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 dg,mg=b(()=>{"use strict";We();fs();dg={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=>dR(t,t.state)}});async function _R(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=hn(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 Dt(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 ps({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 Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(pg({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ee?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}}return{kind:"paused"}}let l=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 Xe(e.agent.initial_prompt_template,t,n),d=i?`${i}
1520
1520
 
1521
- ${u}`:u;try{let f=await ps({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 Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(mg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function mg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=P();e.dal.setRunPausedState(e.run_id,`${ms}${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(gR({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function gR(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=yR(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:wR(o,3),paused_at:i,created_run_inputs:ir(e.job.payload)}}function yR(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 wR(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 pg,hg=b(()=>{"use strict";Gn();We();pg={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=>_R(t,t.state)}});async function ER(t,e){let r=t.stateId,n=t.displayName,s=tg(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=bR(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 bR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var _g,gg=b(()=>{"use strict";We();_g={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>ER(t,t.state)}});import{createHash as SR}from"node:crypto";import{existsSync as TR,mkdirSync as kR,readFileSync as vR,writeFileSync as IR}from"node:fs";import{dirname as xR,isAbsolute as wg,normalize as NR,resolve as hs}from"node:path";import{Document as $R,ExternalHyperlink as jR,HeadingLevel as _n,LevelFormat as AR,Packer as RR,Paragraph as ft,Table as OR,TableCell as LR,TableRow as CR,TextRun as mt,WidthType as MR}from"docx";import{marked as DR}from"marked";async function PR(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 FR(t,e,n),i=await UR(t,e),a=await WR(t,e.title),l=await XR(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return kR(xR(i),{recursive:!0}),IR(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:SR("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 FR(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Xe(e.markdown_source,t,r)).trim(),o=(n.length===0?JR(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=qR(t.project.local_path,o);if(i!==null){if(!TR(i))throw new Error(`markdown_source file not found: ${i}`);return Mi(vR(i,"utf8"))}return Mi(o)}async function UR(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=BR(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function WR(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function BR(t,e){let r=hs(t);return NR(wg(e)?hs(e):hs(r,e))}function qR(t,e){return HR(e)?wg(e)?hs(e):hs(t,e):null}function HR(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function JR(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 Mi(s);let o=t.dal.query(`SELECT sa.content
1521
+ ${u}`:u;try{let f=await ps({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 Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(pg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function pg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=P();e.dal.setRunPausedState(e.run_id,`${ms}${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(gR({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function gR(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=yR(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:wR(o,3),paused_at:i,created_run_inputs:ir(e.job.payload)}}function yR(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 wR(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 hg,_g=b(()=>{"use strict";Gn();We();hg={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=>_R(t,t.state)}});async function ER(t,e){let r=t.stateId,n=t.displayName,s=rg(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=bR(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 bR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var gg,yg=b(()=>{"use strict";We();gg={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>ER(t,t.state)}});import{createHash as SR}from"node:crypto";import{existsSync as TR,mkdirSync as kR,readFileSync as vR,writeFileSync as IR}from"node:fs";import{dirname as xR,isAbsolute as Eg,normalize as NR,resolve as hs}from"node:path";import{Document as $R,ExternalHyperlink as jR,HeadingLevel as _n,LevelFormat as AR,Packer as RR,Paragraph as ft,Table as OR,TableCell as LR,TableRow as CR,TextRun as mt,WidthType as MR}from"docx";import{marked as DR}from"marked";async function PR(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 FR(t,e,n),i=await UR(t,e),a=await WR(t,e.title),l=await XR(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return kR(xR(i),{recursive:!0}),IR(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:SR("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 FR(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Xe(e.markdown_source,t,r)).trim(),o=(n.length===0?JR(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=qR(t.project.local_path,o);if(i!==null){if(!TR(i))throw new Error(`markdown_source file not found: ${i}`);return Mi(vR(i,"utf8"))}return Mi(o)}async function UR(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=BR(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function WR(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function BR(t,e){let r=hs(t);return NR(Eg(e)?hs(e):hs(r,e))}function qR(t,e){return HR(e)?Eg(e)?hs(e):hs(t,e):null}function HR(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function JR(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 Mi(s);let o=t.dal.query(`SELECT sa.content
1522
1522
  FROM step_artifact sa
1523
1523
  JOIN step s ON s.id = sa.step_id
1524
1524
  WHERE s.run_id = ?
1525
1525
  AND s.state_name LIKE ?
1526
1526
  AND sa.content IS NOT NULL
1527
1527
  ORDER BY sa.id DESC
1528
- LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Mi(o[0].content)}function Mi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function XR(t,e){let r=bg(DR.lexer(t,{gfm:!0})),n=new $R({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:AR.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ft("")]:r}]});return RR.toBuffer(n)}function bg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new ft({heading:QR(r.depth),children:lr(ar(r))}));break;case"paragraph":e.push(new ft({children:lr(ar(r))}));break;case"text":e.push(new ft({children:ar(r).length===0?[new mt(r.text)]:lr(ar(r))}));break;case"blockquote":e.push(...bg(ar(r)).map(n=>n instanceof ft?n:new ft({children:[new mt(r.text)]})));break;case"list":YR(r)&&e.push(...GR(r));break;case"table":zR(r)&&e.push(VR(r));break;case"code":ZR(r)&&e.push(...KR(r));break;case"hr":e.push(new ft(""));break;case"html":r.text.trim().length>0&&e.push(new ft({children:[new mt(r.text)]}));break;default:break}return e}function lr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new mt({text:n.text,...ku(e)}));break;case"strong":r.push(...lr(ar(n),{...e,bold:!0}));break;case"em":r.push(...lr(ar(n),{...e,italics:!0}));break;case"codespan":r.push(new mt({text:n.text,...ku({...e,code:!0})}));break;case"link":r.push(new jR({link:n.href,children:lr(ar(n),{...e})}));break;case"br":r.push(new mt({text:"",break:1}));break;case"image":r.push(new mt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new mt({text:n.text,strike:!0}));break;default:r.push(new mt({text:n.raw,...ku(e)}));break}return r.length===0?[new mt("")]:r}function ku(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function GR(t){return t.items.map(e=>new ft({children:lr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:yg(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:yg(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function yg(t){return t.task?`[${t.checked?"x":" "}] `:""}function VR(t){let e=[t.header,...t.rows].map(r=>new CR({children:r.map(n=>new LR({children:[new ft({children:lr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new OR({width:{size:100,type:MR.PERCENTAGE},rows:e})}function KR(t){return t.text.split(`
1529
- `).map(r=>new ft({children:[new mt({text:r.length===0?" ":r,font:"Courier New"})]}))}function ar(t){let e=t.tokens;return Array.isArray(e)?e:[]}function YR(t){return t.type==="list"&&Array.isArray(t.items)}function zR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ZR(t){return t.type==="code"&&typeof t.text=="string"}function QR(t){switch(t){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var Eg,Sg=b(()=>{"use strict";We();Eg={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=>PR(t,t.state)}});import{createHash as eO}from"node:crypto";import{existsSync as tO,mkdirSync as rO,readFileSync as Tg,statSync as nO}from"node:fs";import{dirname as sO,isAbsolute as kg,normalize as oO,resolve as _s}from"node:path";import{marked as iO}from"marked";import aO from"write-excel-file/node";async function lO(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 cO(t,e),i=uO(e.input_format),a=await dO(t,e),l=await fO(t,e.title),c=i==="markdown"?bO(o):_O(o);await SO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=nO(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=eO("sha256").update(Tg(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 cO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Xe(e.source,t,t.stateId)).trim(),n=pO(t.project.local_path,r);if(n!==null){if(!tO(n))throw new Error(`source file not found: ${n}`);return Tg(n,"utf8")}return r}function uO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function dO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=mO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function fO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function mO(t,e){let r=_s(t);return oO(kg(e)?_s(e):_s(r,e))}function pO(t,e){return hO(e)?kg(e)?_s(e):_s(t,e):null}function hO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function _O(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(!Di(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>gO(r,n))}function gO(t,e){if(!Di(t))throw new Error(`sheets[${e}] must be an object`);let r=yO(t.headers,`sheets[${e}].headers`),n=wO(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:EO(t.styles)}}function yO(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 wO(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 EO(t){if(!Di(t)||!Di(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 bO(t){let e=iO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if($O(s)){n=s.text;continue}jO(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 SO(t){rO(sO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:IO(n.name,e),data:TO(n),columns:vO(n)}));await aO(r).toFile(t.outputPath)}function TO(t){let e=[];if(t.headers.length>0){let r=NO(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(kO));return e.length===0?[[{}]]:e}function kO(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 vO(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 IO(t,e){let r=xO(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 xO(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function NO(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 $O(t){return t.type==="heading"&&typeof t.text=="string"}function jO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Di(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var vg,Ig=b(()=>{"use strict";We();vg={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=>lO(t,t.state)}});import{spawnSync as AO}from"node:child_process";async function OO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(AO("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=hn(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 pn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1530
- ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=H_(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 T=Object.keys(e.outcomes_from_stance),E=ds(p.text,T);if(E.outcome===null){let $=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep($.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let k=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,E.outcome,"outcomes_from_stance"),Y(t,r,n,E.outcome),K(t.workflow,e.outcomes_from_stance[E.outcome])}let g=ds(p.text,RO);if(g.outcome!==null){let T=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=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 T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await Dt(t,n,T,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>pn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1528
+ LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Mi(o[0].content)}function Mi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function XR(t,e){let r=Sg(DR.lexer(t,{gfm:!0})),n=new $R({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:AR.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ft("")]:r}]});return RR.toBuffer(n)}function Sg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new ft({heading:QR(r.depth),children:lr(ar(r))}));break;case"paragraph":e.push(new ft({children:lr(ar(r))}));break;case"text":e.push(new ft({children:ar(r).length===0?[new mt(r.text)]:lr(ar(r))}));break;case"blockquote":e.push(...Sg(ar(r)).map(n=>n instanceof ft?n:new ft({children:[new mt(r.text)]})));break;case"list":YR(r)&&e.push(...GR(r));break;case"table":zR(r)&&e.push(VR(r));break;case"code":ZR(r)&&e.push(...KR(r));break;case"hr":e.push(new ft(""));break;case"html":r.text.trim().length>0&&e.push(new ft({children:[new mt(r.text)]}));break;default:break}return e}function lr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new mt({text:n.text,...ku(e)}));break;case"strong":r.push(...lr(ar(n),{...e,bold:!0}));break;case"em":r.push(...lr(ar(n),{...e,italics:!0}));break;case"codespan":r.push(new mt({text:n.text,...ku({...e,code:!0})}));break;case"link":r.push(new jR({link:n.href,children:lr(ar(n),{...e})}));break;case"br":r.push(new mt({text:"",break:1}));break;case"image":r.push(new mt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new mt({text:n.text,strike:!0}));break;default:r.push(new mt({text:n.raw,...ku(e)}));break}return r.length===0?[new mt("")]:r}function ku(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function GR(t){return t.items.map(e=>new ft({children:lr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:wg(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:wg(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function wg(t){return t.task?`[${t.checked?"x":" "}] `:""}function VR(t){let e=[t.header,...t.rows].map(r=>new CR({children:r.map(n=>new LR({children:[new ft({children:lr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new OR({width:{size:100,type:MR.PERCENTAGE},rows:e})}function KR(t){return t.text.split(`
1529
+ `).map(r=>new ft({children:[new mt({text:r.length===0?" ":r,font:"Courier New"})]}))}function ar(t){let e=t.tokens;return Array.isArray(e)?e:[]}function YR(t){return t.type==="list"&&Array.isArray(t.items)}function zR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ZR(t){return t.type==="code"&&typeof t.text=="string"}function QR(t){switch(t){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var bg,Tg=b(()=>{"use strict";We();bg={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=>PR(t,t.state)}});import{createHash as eO}from"node:crypto";import{existsSync as tO,mkdirSync as rO,readFileSync as kg,statSync as nO}from"node:fs";import{dirname as sO,isAbsolute as vg,normalize as oO,resolve as _s}from"node:path";import{marked as iO}from"marked";import aO from"write-excel-file/node";async function lO(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 cO(t,e),i=uO(e.input_format),a=await dO(t,e),l=await fO(t,e.title),c=i==="markdown"?bO(o):_O(o);await SO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=nO(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=eO("sha256").update(kg(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 cO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Xe(e.source,t,t.stateId)).trim(),n=pO(t.project.local_path,r);if(n!==null){if(!tO(n))throw new Error(`source file not found: ${n}`);return kg(n,"utf8")}return r}function uO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function dO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=mO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function fO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function mO(t,e){let r=_s(t);return oO(vg(e)?_s(e):_s(r,e))}function pO(t,e){return hO(e)?vg(e)?_s(e):_s(t,e):null}function hO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function _O(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(!Di(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>gO(r,n))}function gO(t,e){if(!Di(t))throw new Error(`sheets[${e}] must be an object`);let r=yO(t.headers,`sheets[${e}].headers`),n=wO(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:EO(t.styles)}}function yO(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 wO(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 EO(t){if(!Di(t)||!Di(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 bO(t){let e=iO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if($O(s)){n=s.text;continue}jO(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 SO(t){rO(sO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:IO(n.name,e),data:TO(n),columns:vO(n)}));await aO(r).toFile(t.outputPath)}function TO(t){let e=[];if(t.headers.length>0){let r=NO(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(kO));return e.length===0?[[{}]]:e}function kO(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 vO(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 IO(t,e){let r=xO(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 xO(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function NO(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 $O(t){return t.type==="heading"&&typeof t.text=="string"}function jO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Di(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ig,xg=b(()=>{"use strict";We();Ig={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=>lO(t,t.state)}});import{spawnSync as AO}from"node:child_process";async function OO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(AO("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=hn(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 pn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1530
+ ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=J_(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 T=Object.keys(e.outcomes_from_stance),E=ds(p.text,T);if(E.outcome===null){let $=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep($.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let k=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,E.outcome,"outcomes_from_stance"),Y(t,r,n,E.outcome),K(t.workflow,e.outcomes_from_stance[E.outcome])}let g=ds(p.text,RO);if(g.outcome!==null){let T=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=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 T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await Dt(t,n,T,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>pn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1531
1531
  ${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 Dt(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(`
1532
1532
 
1533
- `),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 RO,xg,Ng=b(()=>{"use strict";yu();We();RO=["blocked","failed","aborted"],xg={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=>OO(t,t.state)}});import{spawnSync as LO}from"node:child_process";async function CO(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=Su(t,n),i=rg(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=LO("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&&Tu(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 $g,jg=b(()=>{"use strict";We();$g={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=>CO(t,t.state)}});async 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.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:ee(t.workflow)};let i=Ce(o.definition),a=await DO(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,PO(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 DO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await K_(s,t);r[n]=o===s?await Oi(s,t):o}return r}function PO(t,e,r){let n={};for(let s of r)n[s.name]=FO(t,e,s);return n}function FO(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=UO(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 UO(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 Ag,Rg=b(()=>{"use strict";dn();We();fs();Ag={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=>MO(t,t.state)}});function WO(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 Og,Lg=b(()=>{"use strict";We();Og={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=>WO(t,t.state)}});async function BO(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=qO(t.cursor),a=o.filter(HO).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 qO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HO(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 Cg,Mg=b(()=>{"use strict";Cg={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=>BO(t)}});async function JO(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 Dg,Pg=b(()=>{"use strict";Dg={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=>JO(t)}});function Fg(t){t.register(sg),t.register(xg),t.register(lg),t.register(pg),t.register(_g),t.register(Eg),t.register(vg),t.register($g),t.register(ig),t.register(ug),t.register(Ag),t.register(Og),t.register(Dg),t.register(Cg)}var Ug=b(()=>{"use strict";og();ag();cg();fg();hg();gg();Sg();Ig();Ng();jg();Rg();Lg();Mg();Pg()});function Fi(){return Pi===null&&(Pi=new vu,Fg(Pi)),Pi}var XO,vu,Pi,Iu=b(()=>{"use strict";Ug();XO={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"},vu=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:XO[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Pi=null});async function qg(t){Vg(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=VO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=gs(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=D_(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(gs(n)){let m=xu({dal:t.dal,workflow:Wi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:ir(t.job.payload)??{},team_id:t.team.id}),p=await Jg(n,m,i.current_state??n.entry_step_id);return Bg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=xu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:ir(t.job.payload)??{},team_id:t.team.id}),f=await Hg(d,i.current_state??n.start_at);return Bg(t.dal,r.id,i.id,n.name,f),f}function Bg(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 xu(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 Nu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Vg(n);let o=gs(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=xu({dal:t.dal,workflow:gs(n)?Wi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return gs(n)?Jg(n,a,i.current_state??n.entry_step_id):Hg(a,i.current_state??n.start_at)}};return e}async function Hg(t,e){let r=e;if(r.startsWith(ms))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Pt(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=Ui(t,ee(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(t,l.terminal);r=l.state;continue}let i,a=Gg(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===Dn)return Pt(t,ul);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):tt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Nu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Ui(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(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=Ui(t,ee(t.workflow));return n.kind==="terminal"?Pt(t,n.terminal):Pt(t,ee(t.workflow))}async function Jg(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return tt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Gg(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===Dn)return Pt(e,ul);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(e);o=h;continue}let c=await GO(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Me(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Wi(t,a);try{let p=Ui(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Pt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(e);o=h.id;continue}finally{e.workflow=m}}if(Ur(d))return tt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Pt(e,"aborted")}async function GO(t,e,r){let n=Xg(e,r),s=t.workflow;t.workflow=Wi(e,r);try{return await Nu(t,r.id,n,r.name)}finally{t.workflow=s}}function Xg(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 Nu(t,e,r,n){let s=Fi().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?zO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(eg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function VO(t,e){try{let r=JSON.parse(t);if(YO(r)&&r.definition_schema_version===3)return wt.parse(r)}catch{return e}return e}function gs(t){return t.definition_schema_version===3}function Wi(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]=Xg(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:KO(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 KO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zO(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 Pt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{O_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Me(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Gg(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 Ui(t,e){if(!ZO(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&&QO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QO(t,e,r){let n=eL(t),s=r.capture_evidence&&n!==null?tL(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 eL(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 tL(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 Vg(t){if(!Wg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Wg.join(", ")}`)}var Wg,Kg=b(()=>{"use strict";cn();L_();P_();We();Iu();Pn();Wg=[1,2,3]});import{readFileSync as rL,readdirSync as nL}from"node:fs";import{basename as sL,join as oL,resolve as iL}from"node:path";function Zg(t={}){let e=iL(t.workflowsDir??"workflows"),r=nL(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=>aL(oL(e,n)))}}function aL(t){let e=sL(t);try{let r=rL(t,"utf8"),n=Ce(r);return ty(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:ry(r)}}}function Qg(t,e){try{let r=Ce(e);return ty(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:ry(r)}}}function ey(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(`
1533
+ `),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 RO,Ng,$g=b(()=>{"use strict";yu();We();RO=["blocked","failed","aborted"],Ng={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=>OO(t,t.state)}});import{spawnSync as LO}from"node:child_process";async function CO(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=Su(t,n),i=ng(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=LO("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&&Tu(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 jg,Ag=b(()=>{"use strict";We();jg={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=>CO(t,t.state)}});async 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.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:ee(t.workflow)};let i=Ce(o.definition),a=await DO(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,PO(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 DO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await Y_(s,t);r[n]=o===s?await Oi(s,t):o}return r}function PO(t,e,r){let n={};for(let s of r)n[s.name]=FO(t,e,s);return n}function FO(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=UO(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 UO(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 Rg,Og=b(()=>{"use strict";dn();We();fs();Rg={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=>MO(t,t.state)}});function WO(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 Lg,Cg=b(()=>{"use strict";We();Lg={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=>WO(t,t.state)}});async function BO(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=qO(t.cursor),a=o.filter(HO).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 qO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HO(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 Mg,Dg=b(()=>{"use strict";Mg={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=>BO(t)}});async function JO(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 Pg,Fg=b(()=>{"use strict";Pg={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=>JO(t)}});function Ug(t){t.register(og),t.register(Ng),t.register(cg),t.register(hg),t.register(gg),t.register(bg),t.register(Ig),t.register(jg),t.register(ag),t.register(dg),t.register(Rg),t.register(Lg),t.register(Pg),t.register(Mg)}var Wg=b(()=>{"use strict";ig();lg();ug();mg();_g();yg();Tg();xg();$g();Ag();Og();Cg();Dg();Fg()});function Fi(){return Pi===null&&(Pi=new vu,Ug(Pi)),Pi}var XO,vu,Pi,Iu=b(()=>{"use strict";Wg();XO={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"},vu=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:XO[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Pi=null});async function Hg(t){Kg(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=VO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=gs(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=P_(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(gs(n)){let m=xu({dal:t.dal,workflow:Wi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:ir(t.job.payload)??{},team_id:t.team.id}),p=await Xg(n,m,i.current_state??n.entry_step_id);return qg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=xu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:ir(t.job.payload)??{},team_id:t.team.id}),f=await Jg(d,i.current_state??n.start_at);return qg(t.dal,r.id,i.id,n.name,f),f}function qg(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 xu(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 Nu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Kg(n);let o=gs(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=xu({dal:t.dal,workflow:gs(n)?Wi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return gs(n)?Xg(n,a,i.current_state??n.entry_step_id):Jg(a,i.current_state??n.start_at)}};return e}async function Jg(t,e){let r=e;if(r.startsWith(ms))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Pt(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=Ui(t,ee(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(t,l.terminal);r=l.state;continue}let i,a=Vg(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===Dn)return Pt(t,ul);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):tt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Nu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Ui(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(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=Ui(t,ee(t.workflow));return n.kind==="terminal"?Pt(t,n.terminal):Pt(t,ee(t.workflow))}async function Xg(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return tt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Vg(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===Dn)return Pt(e,ul);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(e);o=h;continue}let c=await GO(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Me(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Wi(t,a);try{let p=Ui(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Pt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(e);o=h.id;continue}finally{e.workflow=m}}if(Ur(d))return tt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Pt(e,"aborted")}async function GO(t,e,r){let n=Gg(e,r),s=t.workflow;t.workflow=Wi(e,r);try{return await Nu(t,r.id,n,r.name)}finally{t.workflow=s}}function Gg(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 Nu(t,e,r,n){let s=Fi().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?zO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(tg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function VO(t,e){try{let r=JSON.parse(t);if(YO(r)&&r.definition_schema_version===3)return wt.parse(r)}catch{return e}return e}function gs(t){return t.definition_schema_version===3}function Wi(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]=Gg(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:KO(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 KO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zO(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 Pt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{L_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Me(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Vg(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 Ui(t,e){if(!ZO(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&&QO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QO(t,e,r){let n=eL(t),s=r.capture_evidence&&n!==null?tL(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 eL(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 tL(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 Kg(t){if(!Bg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Bg.join(", ")}`)}var Bg,Yg=b(()=>{"use strict";cn();C_();F_();We();Iu();Pn();Bg=[1,2,3]});import{readFileSync as rL,readdirSync as nL}from"node:fs";import{basename as sL,join as oL,resolve as iL}from"node:path";function Qg(t={}){let e=iL(t.workflowsDir??"workflows"),r=nL(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=>aL(oL(e,n)))}}function aL(t){let e=sL(t);try{let r=rL(t,"utf8"),n=Ce(r);return ry(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:ny(r)}}}function ey(t,e){try{let r=Ce(e);return ry(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:ny(r)}}}function ty(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(`
1534
1534
  `)}
1535
- `}function ty(t,e){let r=cL(e),n=uL(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=lL(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 lL(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function cL(t){return $u(t)?t.entry_step_id:t.start_at}function uL(t){return $u(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function $u(t){return t.definition_schema_version===3}function ry(t){return t instanceof Mt?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 ny(t){let e=new Set;if($u(t))for(let r of t.steps){let n=r.members??{};Yg(n,e)}else for(let r of Object.values(t.states))Yg(r,e);return[...e].sort()}function Yg(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=zg(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=zg(i);a!==null&&e.add(a)}}}function zg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Bi=b(()=>{"use strict";dn()});function dL({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,qi)[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}=fL(t,r,i);if(a<20)continue;let c=i??"initial",u=`${ys}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:qi,source_ref:ys,payload:JSON.stringify({kind:ys,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function fL(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1535
+ `}function ry(t,e){let r=cL(e),n=uL(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=lL(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 lL(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function cL(t){return $u(t)?t.entry_step_id:t.start_at}function uL(t){return $u(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function $u(t){return t.definition_schema_version===3}function ny(t){return t instanceof Mt?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 sy(t){let e=new Set;if($u(t))for(let r of t.steps){let n=r.members??{};zg(n,e)}else for(let r of Object.values(t.states))zg(r,e);return[...e].sort()}function zg(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=Zg(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=Zg(i);a!==null&&e.add(a)}}}function Zg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Bi=b(()=>{"use strict";dn()});function dL({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,qi)[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}=fL(t,r,i);if(a<20)continue;let c=i??"initial",u=`${ys}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:qi,source_ref:ys,payload:JSON.stringify({kind:ys,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function fL(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1536
1536
  FROM run r
1537
1537
  JOIN job j ON j.id = r.job_id
1538
1538
  WHERE j.project_id = ?
1539
1539
  AND r.terminal_state IS NOT NULL
1540
- ${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 sy(t){for(let e of mL)try{e(t)}catch{}}var qi,ys,mL,ju=b(()=>{"use strict";qi="memory_policy",ys="memory_consolidation_request";mL=[dL]});var uy={};ce(uy,{getOrInsertConsolidationWorkflow:()=>iy,runJobById:()=>ws,runOnce:()=>Rr,startWorker:()=>yL});import{createHash as pL}from"node:crypto";import{readFileSync as hL}from"node:fs";import{pathToFileURL as _L}from"node:url";function iy(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{ti({swallow:!0});let n=ri(e);if(n===null)return null;let s=hL(n,"utf8"),o=Ce(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:_L(n).href,source_sha256:pL("sha256").update(s).digest("hex")})}catch{return null}}async function Rr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??oy,evaluator:n=>ly(t.dal,n)}),r===null?null:await ay(t.dal,r,e)}catch(n){if(r!==null)return cr(t.dal,r,"worker_run_failed",Ar(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Hi(Ar(n))})})}catch{}return null}finally{t.max_concurrent}}async function ws(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??oy,evaluator:s=>ly(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await ay(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...cr(t.dal,r,"worker_run_failed",Ar(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Hi(Ar(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function ay(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return cr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===qi&&e.source_ref===ys,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=iy(t):i=cy(t,e,n),i===null)return cr(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 cr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Ce(i.definition)}catch(d){return cr(t,e,"worker_workflow_invalid",Ar(d),r,n)}let u=wL(c,l);if(u.length>0)return cr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await qg({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 cr(t,e,"worker_run_failed",Ar(d),r,n,a)}}function ly(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=cy(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Ce(n.definition)}catch{s=null}return Si({workflow:s,job:e,project:r})}function cy(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function yL(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Rr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Hi(Ar(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??gL))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function cr(t,e,r,n,s,o,i){let a=Hi(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 Ar(t){return t instanceof Error?t.message:String(t)}function Hi(t){return t.length>4096?t.slice(0,4096):t}function wL(t,e){let r=ny(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var oy,gL,Es=b(()=>{"use strict";ni();Kg();dn();Bi();Qc();ju();oy=6e5,gL=5e3});import{existsSync as EL,readFileSync as bL}from"node:fs";import{marked as SL}from"marked";function py(t,e){t.get("/layman",r=>r.html(Ae("Layman Home",TL(e.dal)))),t.get("/api/layman",r=>r.json(yy(e.dal))),t.get("/layman/start/:workflow",r=>{let n=my(r);return n===null?r.notFound():r.html(Ae(`Start ${gn(n)}`,IL(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=my(r);return n===null?r.notFound():n==="newspaper"?dy(r,e.dal):xL(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=vr(e.dal,Ji(r,"id"));return n===null?r.notFound():r.html(Ae(`Run ${n.id}`,jL(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=vr(e.dal,Ji(r,"id"));return n===null?r.notFound():r.json(WL(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>RL(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Ae("Newspaper Subscriptions",FL(e.dal)))),t.post("/layman/newspaper",r=>dy(r,e.dal)),t.delete("/layman/newspaper/:id",r=>fy(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>fy(r,e.dal))}function TL(t){let e=yy(t);return`<section class="layman-home">
1540
+ ${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 oy(t){for(let e of mL)try{e(t)}catch{}}var qi,ys,mL,ju=b(()=>{"use strict";qi="memory_policy",ys="memory_consolidation_request";mL=[dL]});var dy={};ce(dy,{getOrInsertConsolidationWorkflow:()=>ay,runJobById:()=>ws,runOnce:()=>Rr,startWorker:()=>yL});import{createHash as pL}from"node:crypto";import{readFileSync as hL}from"node:fs";import{pathToFileURL as _L}from"node:url";function ay(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{ti({swallow:!0});let n=ri(e);if(n===null)return null;let s=hL(n,"utf8"),o=Ce(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:_L(n).href,source_sha256:pL("sha256").update(s).digest("hex")})}catch{return null}}async function Rr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??iy,evaluator:n=>cy(t.dal,n)}),r===null?null:await ly(t.dal,r,e)}catch(n){if(r!==null)return cr(t.dal,r,"worker_run_failed",Ar(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Hi(Ar(n))})})}catch{}return null}finally{t.max_concurrent}}async function ws(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??iy,evaluator:s=>cy(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await ly(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...cr(t.dal,r,"worker_run_failed",Ar(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Hi(Ar(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function ly(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return cr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===qi&&e.source_ref===ys,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=ay(t):i=uy(t,e,n),i===null)return cr(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 cr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Ce(i.definition)}catch(d){return cr(t,e,"worker_workflow_invalid",Ar(d),r,n)}let u=wL(c,l);if(u.length>0)return cr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await Hg({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 cr(t,e,"worker_run_failed",Ar(d),r,n,a)}}function cy(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=uy(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Ce(n.definition)}catch{s=null}return Si({workflow:s,job:e,project:r})}function uy(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function yL(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Rr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Hi(Ar(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??gL))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function cr(t,e,r,n,s,o,i){let a=Hi(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 Ar(t){return t instanceof Error?t.message:String(t)}function Hi(t){return t.length>4096?t.slice(0,4096):t}function wL(t,e){let r=sy(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var iy,gL,Es=b(()=>{"use strict";ni();Yg();dn();Bi();Qc();ju();iy=6e5,gL=5e3});import{existsSync as EL,readFileSync as bL}from"node:fs";import{marked as SL}from"marked";function hy(t,e){t.get("/layman",r=>r.html(Ae("Layman Home",TL(e.dal)))),t.get("/api/layman",r=>r.json(wy(e.dal))),t.get("/layman/start/:workflow",r=>{let n=py(r);return n===null?r.notFound():r.html(Ae(`Start ${gn(n)}`,IL(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=py(r);return n===null?r.notFound():n==="newspaper"?fy(r,e.dal):xL(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=vr(e.dal,Ji(r,"id"));return n===null?r.notFound():r.html(Ae(`Run ${n.id}`,jL(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=vr(e.dal,Ji(r,"id"));return n===null?r.notFound():r.json(WL(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>RL(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Ae("Newspaper Subscriptions",FL(e.dal)))),t.post("/layman/newspaper",r=>fy(r,e.dal)),t.delete("/layman/newspaper/:id",r=>my(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>my(r,e.dal))}function TL(t){let e=wy(t);return`<section class="layman-home">
1541
1541
  <h1>Welcome</h1>
1542
1542
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1543
1543
  <div class="grid">${Xi.map(kL).join("")}</div>
@@ -1552,7 +1552,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1552
1552
  <h2>${S(t.title)}</h2>
1553
1553
  <p>${S(t.description)}</p>
1554
1554
  <p><a href="/layman/start/${encodeURIComponent(t.name)}">Start</a></p>
1555
- </article>`}function vL(t){return fe(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${S(e.id)}</a>`,S(gn(e.workflow_name)),S(e.terminal_state??e.current_state??"queued"),S(e.started_at)]))}function IL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${S(gn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${S(gn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=hy(n);return e==="info-qa"?`<h1>Ask a Question</h1>
1555
+ </article>`}function vL(t){return fe(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${S(e.id)}</a>`,S(gn(e.workflow_name)),S(e.terminal_state??e.current_state??"queued"),S(e.started_at)]))}function IL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${S(gn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${S(gn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=_y(n);return e==="info-qa"?`<h1>Ask a Question</h1>
1556
1556
  <form method="post" action="/layman/start/info-qa">
1557
1557
  ${s}
1558
1558
  <label>Ask anything<textarea name="question" rows="8" required></textarea></label>
@@ -1565,12 +1565,12 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1565
1565
  <label>Slug<input name="slug" placeholder="my-document" required></label>
1566
1566
  <label>Output directory<input name="output_dir" value="drafts"></label>
1567
1567
  <button type="submit">Start Document Wizard</button>
1568
- </form>`:gy(n,"/layman/start/newspaper")}function hy(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${S(e.id)}">${S(e.name)}</option>`).join("")}</select></label>`}async function xL(t,e,r){let n=await t.req.parseBody(),s=by(e,n);if(s===null)return t.html(Ae("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(Ae("Start workflow",`<p class="error">${S(gn(r))} is not loaded.</p>`),400);let i=r==="info-qa"?NL(n):$L(n);if(typeof i=="string")return t.html(Ae("Start workflow",`<p class="error">${S(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await Rr({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function NL(t){let e=Ge(t.question).trim();if(e.length===0)return"Enter a question.";let r=Ge(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function $L(t){let e=Ge(t.task_description).trim(),r=VL(Ge(t.slug).trim()),n=Ge(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function jL(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${S(gn(r))}</h1>
1569
- <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${LL(t,e,r)}`;let s=Ey(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${AL(e,s)}`:`${n}<section hx-get="/layman/run/${S(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1568
+ </form>`:yy(n,"/layman/start/newspaper")}function _y(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${S(e.id)}">${S(e.name)}</option>`).join("")}</select></label>`}async function xL(t,e,r){let n=await t.req.parseBody(),s=Sy(e,n);if(s===null)return t.html(Ae("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(Ae("Start workflow",`<p class="error">${S(gn(r))} is not loaded.</p>`),400);let i=r==="info-qa"?NL(n):$L(n);if(typeof i=="string")return t.html(Ae("Start workflow",`<p class="error">${S(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await Rr({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function NL(t){let e=Ge(t.question).trim();if(e.length===0)return"Enter a question.";let r=Ge(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function $L(t){let e=Ge(t.task_description).trim(),r=VL(Ge(t.slug).trim()),n=Ge(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function jL(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${S(gn(r))}</h1>
1569
+ <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${LL(t,e,r)}`;let s=by(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${AL(e,s)}`:`${n}<section hx-get="/layman/run/${S(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1570
1570
  <h2>Running</h2>
1571
1571
  <p class="muted">Current stage: <strong>${S(e.current_state??"starting")}</strong></p>
1572
- ${_y(e)}
1573
- </section>`}function _y(t){let e=t.steps.map(r=>[S(r.id),S(`\u25B6 ${r.state_name}`),S(r.outcome??"running"),S(r.status_detail??"")]);return fe(["step","stage","outcome","detail"],e)}function AL(t,e){return`<section class="metric paused-interactive">
1572
+ ${gy(e)}
1573
+ </section>`}function gy(t){let e=t.steps.map(r=>[S(r.id),S(`\u25B6 ${r.state_name}`),S(r.outcome??"running"),S(r.status_detail??"")]);return fe(["step","stage","outcome","detail"],e)}function AL(t,e){return`<section class="metric paused-interactive">
1574
1574
  <h2>${S(HL(e.state_name))}</h2>
1575
1575
  <p class="muted">The agent is waiting for your response.</p>
1576
1576
  <h3>Agent output</h3>
@@ -1586,15 +1586,15 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1586
1586
  <p>Status: <strong>${S(e.terminal_state)}</strong></p>
1587
1587
  ${n?CL(t,e,r):DL(e)}
1588
1588
  <h2>Stage Log</h2>
1589
- ${_y(e)}
1589
+ ${gy(e)}
1590
1590
  </section>`}function CL(t,e,r){if(r==="info-qa"){let n=Lu(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Cu(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return ML(t,e);if(r==="newspaper"){let n=Lu(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Cu(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function ML(t,e){let r=Ir(t,e.id),n=Au(r,["render_docx"]),s=Au(r,["render_xlsx"]),o=Lu(e,["review:coder[0]_transcript","chat_output_md"])??PL(Au(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${S(a)}">${S(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1591
1591
  <pre>${S(GL(XL(o??"No preview available."),30))}</pre>
1592
1592
  <h3>Downloads</h3>
1593
1593
  ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function DL(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${S(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function Lu(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Au(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function PL(t){if(t===null||!EL(t)||!t.endsWith(".md"))return null;try{return bL(t,"utf8")}catch{return null}}function FL(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1594
- ${UL(wy(t))}
1594
+ ${UL(Ey(t))}
1595
1595
  <h2>Add Subscription</h2>
1596
- ${e.length===0?'<p class="error">Create a project before subscribing.</p>':gy(e,"/layman/newspaper")}`}function gy(t,e){return`<form method="post" action="${S(e)}">
1597
- ${hy(t)}
1596
+ ${e.length===0?'<p class="error">Create a project before subscribing.</p>':yy(e,"/layman/newspaper")}`}function yy(t,e){return`<form method="post" action="${S(e)}">
1597
+ ${_y(t)}
1598
1598
  <label>Topics<textarea name="topics" rows="5" placeholder="local news, AI safety, climate" required></textarea></label>
1599
1599
  <label>Schedule<select name="schedule">
1600
1600
  <option value="daily">Daily at 6am</option>
@@ -1604,31 +1604,31 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1604
1604
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1605
1605
  <label>Output directory<input name="output_dir" value="digests"></label>
1606
1606
  <button type="submit">Create subscription</button>
1607
- </form>`}async function dy(t,e){let r=await t.req.parseBody(),n=by(e,r);if(n===null)return t.html(Ae("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Ae("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ge(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(Ae("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ge(r.output_dir).trim()||"digests",schedule:qL(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 fy(t,e){let r=Ji(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function UL(t){return fe(["id","project","topics","status","action"],t.map(e=>{let r=KL(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[S(e.id),S(e.project_name),S(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function yy(t){let e=wy(t);return{workflows:Xi,recent_runs:BL(t),newspaper_subscriptions:e.length}}function WL(t,e){let r=Ey(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 BL(t){return t.query(`SELECT r.*, w.name AS workflow_name
1607
+ </form>`}async function fy(t,e){let r=await t.req.parseBody(),n=Sy(e,r);if(n===null)return t.html(Ae("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Ae("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ge(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(Ae("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ge(r.output_dir).trim()||"digests",schedule:qL(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 my(t,e){let r=Ji(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function UL(t){return fe(["id","project","topics","status","action"],t.map(e=>{let r=KL(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[S(e.id),S(e.project_name),S(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function wy(t){let e=Ey(t);return{workflows:Xi,recent_runs:BL(t),newspaper_subscriptions:e.length}}function WL(t,e){let r=by(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 BL(t){return t.query(`SELECT r.*, w.name AS workflow_name
1608
1608
  FROM run r
1609
1609
  JOIN workflow w ON w.id = r.workflow_id
1610
1610
  WHERE w.name IN (${Ou.map(()=>"?").join(",")})
1611
1611
  ORDER BY r.id DESC
1612
- LIMIT 10`,...Ou)}function wy(t){return t.query(`SELECT pw.*, p.name AS project_name
1612
+ LIMIT 10`,...Ou)}function Ey(t){return t.query(`SELECT pw.*, p.name AS project_name
1613
1613
  FROM project_workflow pw
1614
1614
  JOIN workflow w ON w.id = pw.workflow_id
1615
1615
  JOIN project p ON p.id = pw.project_id
1616
1616
  WHERE w.name = ?
1617
- ORDER BY pw.id DESC`,"newspaper")}function Ey(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function by(t,e){let r=Number(Ge(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function qL(t){let e=Ge(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ge(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function my(t){let e=t.req.param("workflow");return Ou.includes(e)?e:null}function gn(t){return Xi.find(e=>e.name===t)?.title??t}function HL(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Cu(t){return SL.parse(t,{async:!1})}function JL(t){return t==="done"||t==="pr_ready"||t==="merged"}function XL(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function GL(t,e){return t.split(`
1617
+ ORDER BY pw.id DESC`,"newspaper")}function by(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Sy(t,e){let r=Number(Ge(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function qL(t){let e=Ge(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ge(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function py(t){let e=t.req.param("workflow");return Ou.includes(e)?e:null}function gn(t){return Xi.find(e=>e.name===t)?.title??t}function HL(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Cu(t){return SL.parse(t,{async:!1})}function JL(t){return t==="done"||t==="pr_ready"||t==="merged"}function XL(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function GL(t,e){return t.split(`
1618
1618
  `).slice(0,e).join(`
1619
- `)}function VL(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ge(t){return typeof t=="string"?t:""}function KL(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function Ru(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ji(t,e){return Number(t.req.param(e))}var Xi,Ou,Sy=b(()=>{"use strict";Es();Ot();mu();Xi=[{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."}],Ou=Xi.map(t=>t.name)});function zL(t){return t.replace(/^\/+/,"")}function Ty(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function yn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=zL(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 Ty(t.userId)&&Ty(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${YL}/${t.identityId}/`}function QL(t){return String(Math.max(0,Math.floor(t))).padStart(ZL,"0")}function Mu(t,e,r){return`${t}${e}${QL(r)}.json`}function Gi(t,e){return`${t}${e}`}function Vi(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 YL,ZL,Ki=b(()=>{"use strict";YL="mailbox";ZL=12});function Ft(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Yi[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=Yi[a&15]+i,a=a>>4;let l=Yi[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Yi[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 Yi,zi=b(()=>{"use strict";Yi="0123456789abcdef"});function Pu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Fu(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 Ny(t){return t.conversation_id===xy&&rC(t.payload)}function rC(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function nC(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Ny(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var ky,vy,Iy,eC,xy,tC,Du,Or,Zi=b(()=>{"use strict";Ki();zi();ky=3e3,vy=1e4,Iy=12e3,eC=1e3,xy="__lmctl_heartbeat__",tC={kind:"heartbeat"},Du={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Or=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=yn({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=Pu(e.readIntervalMs??e.pollIntervalMs??ky,ky),this.heartbeatIdleMs=Pu(e.heartbeatIdleMs??vy,vy),this.backoffReadIntervalMs=Pu(e.backoffReadIntervalMs??e.pollIntervalMs??Iy,Iy)}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??Du;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=Gi(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:eC,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Vi(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:Ft(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=Mu(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??Du;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=Mu(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(Fu(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),Ny(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=nC(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??Du;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(xy,tC)}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 sC}from"@hono/node-server/conninfo";function $y(t,e){let r=e.bucket??oC,n=e.remoteAddressOf??(o=>aC(o)),s=o=>{let i=n(o);return lC(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=Uu(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 Fu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Wu(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Uu(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:Wu(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=Uu(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=iC(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:Wu(d)},500)}})}function Uu(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function iC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function aC(t){try{return sC(t).remote.address}catch{return}}function lC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Wu(t){return t instanceof Error?t.message:String(t)}var oC,jy=b(()=>{"use strict";Zi();oC="local"});function Ay(t,e){t.get("/mailbox/workspace",r=>dC(r,e)),t.get("/mailbox/projects",r=>fC(r,e)),t.get("/mailbox/projects/:id",r=>mC(r,e)),t.post("/mailbox/projects",r=>pC(r,e)),t.patch("/mailbox/projects/:id",r=>hC(r,e)),t.delete("/mailbox/projects/:id",r=>_C(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>gC(r,e)),t.get("/mailbox/prompts/:id",r=>yC(r,e))}function dC(t,e){e.dal.ensureWorkspace({id:En,name:Bu});let r=Ry(e.dal),n={id:En,name:Bu,created_at:uC,projects:r};return t.json({workspace:n})}function fC(t,e){return t.json({projects:Ry(e.dal)})}function mC(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(wn)){let s=qu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:ta(s)})}let n=Ly(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Oy(n)})}async function pC(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:En,name:Bu});let s=e.dal.insertWebProject({workspace_id:En,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:ta(s)},201)}async function hC(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(wn)){let o=qu(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:ta(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function _C(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(wn)){let n=qu(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 gC(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=Ly(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=`${cC}${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 wC({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:`${ea}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function yC(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=EC(e.dal,r);return t.json({result:n})}function Ry(t){let e=t.listProjects().map(Oy),r=t.listWebProjectsActive(En).map(ta);return[...e,...r].sort(jC)}function Oy(t){return{id:`${ea}${t.id}`,workspace_id:En,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 ta(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:`${wn}${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 qu(t,e){if(!e.startsWith(wn))return null;let r=e.slice(wn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Ly(t,e){if(e.startsWith(ea)){let n=e.slice(ea.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 wC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(tu(),a_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function EC(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=xC(t,o?.team_id??null),a=IC(s),l=NC(n,a,i.length>0),c=$C(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:bC(t,o.workflow_name),d=u.totalEstimatedMs,f=Cy(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:SC(t,s.id),g=TC(s,a,h,u.perStep,i),_=kC(h,u.perStep),T=vC(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,...Qi(d,f),...T},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Qi(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...Qi(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Qi(d,f),...T},errors_json:null,duration_ms:c}}function bC(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 SC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function TC(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=Cy(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 kC(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 vC(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 Cy(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Qi(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function IC(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 xC(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 NC(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 $C(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 jC(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 ea,wn,cC,En,Bu,uC,My=b(()=>{"use strict";ea="project:",wn="web_project:",cC="prompt:",En="default",Bu="Default workspace",uC=new Date(0).toISOString()});import{Buffer as Dy}from"node:buffer";function Py(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 Fy(t){return OC[t]}function Uy(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 AC,RC,ra,OC,Hu=b(()=>{"use strict";AC=1e4,RC=256*1024,ra=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Py(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,AC),this.pushByteCap=Py(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,RC),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+=Dy.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=${Dy.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
1619
+ `)}function VL(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ge(t){return typeof t=="string"?t:""}function KL(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function Ru(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ji(t,e){return Number(t.req.param(e))}var Xi,Ou,Ty=b(()=>{"use strict";Es();Ot();mu();Xi=[{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."}],Ou=Xi.map(t=>t.name)});function zL(t){return t.replace(/^\/+/,"")}function ky(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function yn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=zL(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 ky(t.userId)&&ky(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${YL}/${t.identityId}/`}function QL(t){return String(Math.max(0,Math.floor(t))).padStart(ZL,"0")}function Mu(t,e,r){return`${t}${e}${QL(r)}.json`}function Gi(t,e){return`${t}${e}`}function Vi(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 YL,ZL,Ki=b(()=>{"use strict";YL="mailbox";ZL=12});function Ft(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Yi[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=Yi[a&15]+i,a=a>>4;let l=Yi[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Yi[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 Yi,zi=b(()=>{"use strict";Yi="0123456789abcdef"});function Pu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Fu(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 $y(t){return t.conversation_id===Ny&&rC(t.payload)}function rC(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function nC(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:$y(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var vy,Iy,xy,eC,Ny,tC,Du,Or,Zi=b(()=>{"use strict";Ki();zi();vy=3e3,Iy=1e4,xy=12e3,eC=1e3,Ny="__lmctl_heartbeat__",tC={kind:"heartbeat"},Du={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Or=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=yn({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=Pu(e.readIntervalMs??e.pollIntervalMs??vy,vy),this.heartbeatIdleMs=Pu(e.heartbeatIdleMs??Iy,Iy),this.backoffReadIntervalMs=Pu(e.backoffReadIntervalMs??e.pollIntervalMs??xy,xy)}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??Du;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=Gi(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:eC,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Vi(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:Ft(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=Mu(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??Du;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=Mu(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(Fu(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),$y(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=nC(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??Du;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(Ny,tC)}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 sC}from"@hono/node-server/conninfo";function jy(t,e){let r=e.bucket??oC,n=e.remoteAddressOf??(o=>aC(o)),s=o=>{let i=n(o);return lC(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=Uu(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 Fu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Wu(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Uu(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:Wu(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=Uu(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=iC(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:Wu(d)},500)}})}function Uu(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function iC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function aC(t){try{return sC(t).remote.address}catch{return}}function lC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Wu(t){return t instanceof Error?t.message:String(t)}var oC,Ay=b(()=>{"use strict";Zi();oC="local"});function Ry(t,e){t.get("/mailbox/workspace",r=>dC(r,e)),t.get("/mailbox/projects",r=>fC(r,e)),t.get("/mailbox/projects/:id",r=>mC(r,e)),t.post("/mailbox/projects",r=>pC(r,e)),t.patch("/mailbox/projects/:id",r=>hC(r,e)),t.delete("/mailbox/projects/:id",r=>_C(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>gC(r,e)),t.get("/mailbox/prompts/:id",r=>yC(r,e))}function dC(t,e){e.dal.ensureWorkspace({id:En,name:Bu});let r=Oy(e.dal),n={id:En,name:Bu,created_at:uC,projects:r};return t.json({workspace:n})}function fC(t,e){return t.json({projects:Oy(e.dal)})}function mC(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(wn)){let s=qu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:ta(s)})}let n=Cy(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Ly(n)})}async function pC(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:En,name:Bu});let s=e.dal.insertWebProject({workspace_id:En,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:ta(s)},201)}async function hC(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(wn)){let o=qu(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:ta(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function _C(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(wn)){let n=qu(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 gC(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=Cy(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=`${cC}${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 wC({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:`${ea}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function yC(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=EC(e.dal,r);return t.json({result:n})}function Oy(t){let e=t.listProjects().map(Ly),r=t.listWebProjectsActive(En).map(ta);return[...e,...r].sort(jC)}function Ly(t){return{id:`${ea}${t.id}`,workspace_id:En,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 ta(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:`${wn}${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 qu(t,e){if(!e.startsWith(wn))return null;let r=e.slice(wn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Cy(t,e){if(e.startsWith(ea)){let n=e.slice(ea.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 wC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(tu(),l_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function EC(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=xC(t,o?.team_id??null),a=IC(s),l=NC(n,a,i.length>0),c=$C(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:bC(t,o.workflow_name),d=u.totalEstimatedMs,f=My(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:SC(t,s.id),g=TC(s,a,h,u.perStep,i),_=kC(h,u.perStep),T=vC(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,...Qi(d,f),...T},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Qi(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...Qi(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Qi(d,f),...T},errors_json:null,duration_ms:c}}function bC(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 SC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function TC(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=My(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 kC(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 vC(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 My(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Qi(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function IC(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 xC(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 NC(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 $C(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 jC(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 ea,wn,cC,En,Bu,uC,Dy=b(()=>{"use strict";ea="project:",wn="web_project:",cC="prompt:",En="default",Bu="Default workspace",uC=new Date(0).toISOString()});import{Buffer as Py}from"node:buffer";function Fy(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 Uy(t){return OC[t]}function Wy(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 AC,RC,ra,OC,Hu=b(()=>{"use strict";AC=1e4,RC=256*1024,ra=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Fy(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,AC),this.pushByteCap=Fy(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,RC),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+=Py.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=${Py.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
1620
1620
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1621
- `,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)}};OC={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 By(t,e){t.post("/mailbox/terminal/launch",r=>LC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>CC(r,e)),t.get("/mailbox/terminal/sessions",r=>MC(r,e))}async function LC(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"||!Wy.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=Uy(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Fy(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 CC(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||!Wy.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 MC(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 Wy,qy=b(()=>{"use strict";Hu();Wy=/^[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 DC}from"node:buffer";function UC(t){try{return DC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function Hy(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 Jy(t){return WC[t]}function Xy(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 PC,FC,na,WC,Ju=b(()=>{"use strict";PC=2e3,FC=64*1024,na=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Hy(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,PC),this.pushByteCap=Hy(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,FC),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=UC(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")))})}};WC={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 Vy(t,e){t.post("/mailbox/chat/launch",r=>BC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>qC(r,e)),t.get("/mailbox/chat/sessions",r=>HC(r,e))}async function BC(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"||!Gy.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=Xy(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Jy(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 qC(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||!Gy.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 HC(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 Gy,Ky=b(()=>{"use strict";Ju();Gy=/^[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 JC}from"node:fs";function zy(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Yy(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=JC(e.path,{encoding:"utf8"});return Yy(r)}catch{return[]}}function Yy(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 Zy=b(()=>{"use strict"});function Qy(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 sa(t,e){let r=t.query(`SELECT id, kind FROM attention
1621
+ `,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)}};OC={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 qy(t,e){t.post("/mailbox/terminal/launch",r=>LC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>CC(r,e)),t.get("/mailbox/terminal/sessions",r=>MC(r,e))}async function LC(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"||!By.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=Wy(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Uy(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 CC(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||!By.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 MC(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 By,Hy=b(()=>{"use strict";Hu();By=/^[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 DC}from"node:buffer";function UC(t){try{return DC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function Jy(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 Xy(t){return WC[t]}function Gy(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 PC,FC,na,WC,Ju=b(()=>{"use strict";PC=2e3,FC=64*1024,na=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Jy(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,PC),this.pushByteCap=Jy(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,FC),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=UC(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")))})}};WC={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 Ky(t,e){t.post("/mailbox/chat/launch",r=>BC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>qC(r,e)),t.get("/mailbox/chat/sessions",r=>HC(r,e))}async function BC(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"||!Vy.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=Gy(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Xy(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 qC(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||!Vy.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 HC(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 Vy,Yy=b(()=>{"use strict";Ju();Vy=/^[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 JC}from"node:fs";function Zy(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return zy(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=JC(e.path,{encoding:"utf8"});return zy(r)}catch{return[]}}function zy(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 Qy=b(()=>{"use strict"});function ew(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 sa(t,e){let r=t.query(`SELECT id, kind FROM attention
1622
1622
  WHERE run_id = ?
1623
1623
  AND acknowledged_at IS NULL
1624
1624
  AND requires_user = 1
1625
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var oa=b(()=>{"use strict"});function cw(t,e){t.all("/runtime/*",r=>XC(r.req.raw,e))}async function XC(t,e){try{return Response.json(await GC(t,e))}catch(r){if(r instanceof oe)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function GC(t,e){let r=new URL(t.url),n=eM(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Xu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ia(t,n.id,s[2]),VC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ia(t,n.id,s[2]);let o=tw(e.dal,s[4]);return ew(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Xu(t),e.dal.listTeams().map(o=>QC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=rw(e.dal,nw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead chat body does not match route team");return ow(t,n.id,i.context),sw(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=rw(e.dal,nw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead message body does not match route team");ow(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime lead message requires draft.body");return sw(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ia(t,n.id,s[2]);let o=tw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new oe(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime workflow message requires draft.body");return zC(e.dal,o,a),ew(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return bs(t,n.id),e.dal.listWorkflows().map(o=>tM(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){bs(t,n.id);let o=nM(e.dal,s[2]);return rM(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){bs(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new oe(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return sM(e.dal,o,i).map(l=>aw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){bs(t,n.id);let o=iw(e.dal,s[2]);return aw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){bs(t,n.id);let o=iw(e.dal,s[2]),i=iM(e.dal,o);return{runId:zu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new oe(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function VC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>uw(t,e,r))}}function ew(t,e,r){let n=uw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:KC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:YC(t,r)}}function uw(t,e,r){let n=dw(t,r.id),s=Vu(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 KC(t,e){let r=dw(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:Vu(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 YC(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 zC(t,e,r){let n=ZC(t,e.id);if(n!==null){let s=sa(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new oe(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=yt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new oe(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new oe(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function dw(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 ZC(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 Vu(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 tw(t,e){let r=t.findProjectByName(e);if(r===null)throw new oe(404,`project not found: ${e}`);return r}function rw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new oe(404,`team not found: ${e}`);return r}function nw(t){return t.startsWith("team:")?t.slice(5):t}function QC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function sw(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??lw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function eM(t){let e=t.workspaceName??Rn()??_r.default;return{id:e,name:e}}function Xu(t){if(t.headers.get("x-lmctl-workspace-id")!==lw)throw new oe(400,"runtime request requires global-admin workspace identity")}function ia(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new oe(400,"runtime workspace identity does not match route")}function bs(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e)throw new oe(400,"runtime workspace identity does not match server workspace")}function ow(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new oe(400,"workspace manager context requires workspace identity");ia(t,e,r.workspaceId);return}Xu(t)}function Ku(t){return`${bn}${Yu(t.name)}`}function Yu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function zu(t){return`${Gu}${t.id}`}function tM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description}}}function rM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function aa(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 nM(t,e){if(!e.startsWith(bn))throw new oe(404,`template not found: ${e}`);let r=e.slice(bn.length),n=t.listWorkflows().filter(s=>Yu(s.name)===r);if(n.length===0)throw new oe(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new oe(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function iw(t,e){if(!e.startsWith(Gu))throw new oe(404,`run not found: ${e}`);let r=e.slice(Gu.length);if(!/^[1-9]\d*$/.test(r))throw new oe(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new oe(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new oe(404,`run not found: ${e}`);return s}function sM(t,e,r){if(r!==null){if(!r.startsWith(bn))return[];let s=r.slice(bn.length),o=t.listWorkflows().filter(a=>Yu(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 aw(t,e){let r=t.getWorkflow(e.workflow_id),n=Vu(e),s=oM(r,e);return{id:zu(e),templateId:r===null?`${bn}unknown`:Ku(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 oM(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]:[aa(t.definition).nameToId.get(r)??r]}function iM(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:aa(r.definition),s=c=>n.nameToId.get(c)??c,o=zu(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=aM(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 aM(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 lw,bn,Gu,oe,fw=b(()=>{"use strict";Ve();oa();Ot();lw="global-admin";bn="template:",Gu="run:";oe=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as lM,writeFileSync as cM}from"node:fs";import{randomUUID as mw}from"node:crypto";import{dirname as uM,resolve as la,sep as pw}from"node:path";async function _w(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(!hM(n))return t.text("missing image file",400);if(n.size>dM)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=_M(s);if(o===null||!(o in hw))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=fM(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?la(pM()):la(i.local_path),l=la(a,"uploads",mw()),c=la(l,`${mw()}${hw[o]}`);if(!mM(c,a))return t.text("invalid upload path",400);lM(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);cM(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function fM(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function mM(t,e){let r=e.endsWith(pw)?e:`${e}${pw}`;return t.startsWith(r)}function pM(){return uM(ue())}function hM(t){return typeof File<"u"&&t instanceof File}function _M(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 dM,hw,gw=b(()=>{"use strict";Ve();dM=10*1024*1024,hw={"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 gM,dirname as yM,extname as wM,isAbsolute as EM,join as bM,relative as SM}from"node:path";import{fileURLToPath as TM}from"node:url";import{Hono as kM}from"hono";import{serveStatic as Et}from"@hono/node-server/serve-static";function kw(t){let e=new kM,r=[],n=t.localWebui!==void 0?Qu(t.localWebui.webuiDir):vM();if(t.localWebui!==void 0&&$y(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=IM();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,Et({root:n})),e.use("/vendor/*",s,Et({root:n})),e.use("/src/*",s,Et({root:n})),e.get("/",s,Et({root:n,path:"index.html"})),e.get("/admin",s,Et({root:n,path:"index.html"})),e.get("/admin/*",s,Et({root:n,path:"index.html"})),e.get("/terminal",s,Et({root:n,path:"index.html"})),e.get("/terminal/*",s,Et({root:n,path:"index.html"})),e.get("/chat",s,Et({root:n,path:"index.html"})),e.get("/chat/*",s,Et({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("*",p_()),e.get("/login",s=>s.html(Ae("Login",`
1625
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var oa=b(()=>{"use strict"});function uw(t,e){t.all("/runtime/*",r=>XC(r.req.raw,e))}async function XC(t,e){try{return Response.json(await GC(t,e))}catch(r){if(r instanceof oe)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function GC(t,e){let r=new URL(t.url),n=eM(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Xu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ia(t,n.id,s[2]),VC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ia(t,n.id,s[2]);let o=rw(e.dal,s[4]);return tw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Xu(t),e.dal.listTeams().map(o=>QC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=nw(e.dal,sw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead chat body does not match route team");return iw(t,n.id,i.context),ow(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=nw(e.dal,sw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead message body does not match route team");iw(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime lead message requires draft.body");return ow(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ia(t,n.id,s[2]);let o=rw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new oe(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime workflow message requires draft.body");return zC(e.dal,o,a),tw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return bs(t,n.id),e.dal.listWorkflows().map(o=>tM(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){bs(t,n.id);let o=nM(e.dal,s[2]);return rM(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){bs(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new oe(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return sM(e.dal,o,i).map(l=>lw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){bs(t,n.id);let o=aw(e.dal,s[2]);return lw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){bs(t,n.id);let o=aw(e.dal,s[2]),i=iM(e.dal,o);return{runId:zu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new oe(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function VC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>dw(t,e,r))}}function tw(t,e,r){let n=dw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:KC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:YC(t,r)}}function dw(t,e,r){let n=fw(t,r.id),s=Vu(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 KC(t,e){let r=fw(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:Vu(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 YC(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 zC(t,e,r){let n=ZC(t,e.id);if(n!==null){let s=sa(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new oe(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=yt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new oe(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new oe(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function fw(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 ZC(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 Vu(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 rw(t,e){let r=t.findProjectByName(e);if(r===null)throw new oe(404,`project not found: ${e}`);return r}function nw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new oe(404,`team not found: ${e}`);return r}function sw(t){return t.startsWith("team:")?t.slice(5):t}function QC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function ow(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??cw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function eM(t){let e=t.workspaceName??Rn()??_r.default;return{id:e,name:e}}function Xu(t){if(t.headers.get("x-lmctl-workspace-id")!==cw)throw new oe(400,"runtime request requires global-admin workspace identity")}function ia(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new oe(400,"runtime workspace identity does not match route")}function bs(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e)throw new oe(400,"runtime workspace identity does not match server workspace")}function iw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new oe(400,"workspace manager context requires workspace identity");ia(t,e,r.workspaceId);return}Xu(t)}function Ku(t){return`${bn}${Yu(t.name)}`}function Yu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function zu(t){return`${Gu}${t.id}`}function tM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description}}}function rM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function aa(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 nM(t,e){if(!e.startsWith(bn))throw new oe(404,`template not found: ${e}`);let r=e.slice(bn.length),n=t.listWorkflows().filter(s=>Yu(s.name)===r);if(n.length===0)throw new oe(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new oe(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function aw(t,e){if(!e.startsWith(Gu))throw new oe(404,`run not found: ${e}`);let r=e.slice(Gu.length);if(!/^[1-9]\d*$/.test(r))throw new oe(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new oe(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new oe(404,`run not found: ${e}`);return s}function sM(t,e,r){if(r!==null){if(!r.startsWith(bn))return[];let s=r.slice(bn.length),o=t.listWorkflows().filter(a=>Yu(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 lw(t,e){let r=t.getWorkflow(e.workflow_id),n=Vu(e),s=oM(r,e);return{id:zu(e),templateId:r===null?`${bn}unknown`:Ku(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 oM(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]:[aa(t.definition).nameToId.get(r)??r]}function iM(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:aa(r.definition),s=c=>n.nameToId.get(c)??c,o=zu(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=aM(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 aM(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 cw,bn,Gu,oe,mw=b(()=>{"use strict";Ve();oa();Ot();cw="global-admin";bn="template:",Gu="run:";oe=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as lM,writeFileSync as cM}from"node:fs";import{randomUUID as pw}from"node:crypto";import{dirname as uM,resolve as la,sep as hw}from"node:path";async function gw(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(!hM(n))return t.text("missing image file",400);if(n.size>dM)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=_M(s);if(o===null||!(o in _w))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=fM(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?la(pM()):la(i.local_path),l=la(a,"uploads",pw()),c=la(l,`${pw()}${_w[o]}`);if(!mM(c,a))return t.text("invalid upload path",400);lM(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);cM(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function fM(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function mM(t,e){let r=e.endsWith(hw)?e:`${e}${hw}`;return t.startsWith(r)}function pM(){return uM(ue())}function hM(t){return typeof File<"u"&&t instanceof File}function _M(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 dM,_w,yw=b(()=>{"use strict";Ve();dM=10*1024*1024,_w={"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 gM,dirname as yM,extname as wM,isAbsolute as EM,join as bM,relative as SM}from"node:path";import{fileURLToPath as TM}from"node:url";import{Hono as kM}from"hono";import{serveStatic as Et}from"@hono/node-server/serve-static";function vw(t){let e=new kM,r=[],n=t.localWebui!==void 0?Qu(t.localWebui.webuiDir):vM();if(t.localWebui!==void 0&&jy(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=IM();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,Et({root:n})),e.use("/vendor/*",s,Et({root:n})),e.use("/src/*",s,Et({root:n})),e.get("/",s,Et({root:n,path:"index.html"})),e.get("/admin",s,Et({root:n,path:"index.html"})),e.get("/admin/*",s,Et({root:n,path:"index.html"})),e.get("/terminal",s,Et({root:n,path:"index.html"})),e.get("/terminal/*",s,Et({root:n,path:"index.html"})),e.get("/chat",s,Et({root:n,path:"index.html"})),e.get("/chat/*",s,Et({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("*",h_()),e.get("/login",s=>s.html(Ae("Login",`
1626
1626
  <h1>Login</h1>
1627
1627
  <form method="post" action="/login">
1628
1628
  <label>Token <input name="token" type="password"></label>
1629
1629
  <button type="submit">Login</button>
1630
1630
  </form>
1631
- `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return __(i)?(au(s,i),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(g_(s),s.redirect("/login",302))),py(e,{dal:t.dal}),cw(e,{dal:t.dal}),Ay(e,{dal:t.dal}),By(e,{terminalSessionManager:t.terminalSessionManager}),Vy(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Kn(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 lc(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 B(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),k_(e,{dal:t.dal}),A_(e,{dal:t.dal}),e.get("/api/status",s=>B(s,Co(t.dal),OM)),e.get("/api/projects",s=>B(s,Mo(t.dal),LM)),e.get("/api/teams",s=>B(s,Op(t.dal),DM)),e.get("/api/workflows",s=>B(s,Do(t.dal),PM)),e.get("/api/workflows/verify",s=>{let o=Zg();return s.req.header("accept")?.includes("text/plain")?s.text(ey(o)):s.json(o)}),e.get("/api/jobs",s=>B(s,Lp(t.dal,{status:s.req.query("status")}),FM)),e.post("/api/uploads",s=>_w(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Po(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return B(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Es(),uy)),i=Po(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():B(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():B(s,t.dal.listProjectWorkflows(o.id),CM)}),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 Sn(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{sr(u)}catch{return s.text("invalid condition",400)}let d=$M(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 B(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?B(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():B(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():B(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=ww(s.req.query("status"),jM);if(typeof i=="string")return s.text(i,400);let a=ww(s.req.query("severity"),Iw);return typeof a=="string"?s.text(a,400):B(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")}:{}}),MM)}),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 Sn(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=AM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=RM(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 B(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=re(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await Sn(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):B(s,c,le)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await Sn(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):B(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(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 B(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(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 B(s,t.dal.reopenIssue(re(s,"id"),a),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return B(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=Ir(t.dal,o,i);return B(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=Ir(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):B(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=xM(l.path);if(NM(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=gM(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 B(s,l,le)}return B(s,l,le)}),e.get("/api/runs",s=>B(s,Yr(t.dal,{limit:Zu(s,"limit")??100}),UM)),e.get("/api/runs/:id",s=>{let o=vr(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,WM)}),e.get("/api/runs/:id/where",s=>{let o=zr(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Uo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Wo(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(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?(ua(t.daemon),B(s,i,Ew)):B(s,i,Ew,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?(ua(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=>yw(s,t.dal,o=>B(s,o,qM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Pp(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():vw(s)?s.html(`<pre>${S(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>yw(s,t.dal,o=>{let i=zy(o);return B(s,i,a=>fe(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>B(s,Fp(t.dal,{type:s.req.query("type")}),HM)),e.get("/api/external-signals",s=>B(s,Up(t.dal,{unhandled:s.req.query("unhandled")==="true"}),JM)),e.get("/api/attentions",s=>B(s,Qt(t.dal,{unacked:s.req.query("unacked")==="true"}),XM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():B(s,o,i=>`<p>acknowledged attention ${S(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=Fo(t.dal,l);return B(s,c,u=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=yt(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=re(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=yt(t.dal,o);if(c===null)return s.notFound();let u=Qt(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);ua(t.daemon);let p=Qt(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 ua(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=Cp(t.dal,{status:i,pr_url:o});return B(s,a,GM)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Mp(t.dal,o);return i===null?s.notFound():B(s,i,VM)}),e.get("/api/sessions",s=>B(s,t.dal.latestSessionSizes(),bw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Kn(s.req.param("team_name"));return B(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),bw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Kn(s.req.param("team_name"));try{let i=await Ip(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sw("compacted",a.row))}catch(i){if(i instanceof Vn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=await lc(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>B(s,r,Tw)),e.post("/api/intake/scan",async s=>(r=await fn(t.dal),B(s,r,Tw))),e.get("/api/stats/run-throughput",s=>B(s,qp(t.dal),KM)),e.get("/api/daemon/state",s=>B(s,t.daemon?.state??null,YM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return B(s,{disabled:!0},le);let o=await t.daemon.runCycle();return B(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=re(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=hc(t.dal,o),l=_c(t.dal,{project_id:o});return s.html(Ae(`Metrics \u2014 ${i.name}`,zM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(hc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(_c(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 yw(t,e,r){let n=pc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function ua(t){t!==void 0&&t.runCycle().catch(()=>{})}function B(t,e,r,n=200){return vw(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 vw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function vM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ca(`${t}/index.html`)?Qu(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=bM(yM(TM(import.meta.url)),"webui-dist");return ca(`${n}/index.html`)?Qu(n):null}function Qu(t){if(!EM(t))return t;let e=SM(process.cwd(),t);return e.length===0?".":e}function IM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function Zu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function xM(t){switch(wM(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 NM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Sn(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 $M(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 ww(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 AM(t){if(t!=null)return typeof t=="string"&&Iw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function RM(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 OM(t){return`<h1>Status</h1><div class="grid">
1631
+ `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return g_(i)?(au(s,i),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(y_(s),s.redirect("/login",302))),hy(e,{dal:t.dal}),uw(e,{dal:t.dal}),Ry(e,{dal:t.dal}),qy(e,{terminalSessionManager:t.terminalSessionManager}),Ky(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Kn(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 lc(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 B(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),v_(e,{dal:t.dal}),R_(e,{dal:t.dal}),e.get("/api/status",s=>B(s,Co(t.dal),OM)),e.get("/api/projects",s=>B(s,Mo(t.dal),LM)),e.get("/api/teams",s=>B(s,Lp(t.dal),DM)),e.get("/api/workflows",s=>B(s,Do(t.dal),PM)),e.get("/api/workflows/verify",s=>{let o=Qg();return s.req.header("accept")?.includes("text/plain")?s.text(ty(o)):s.json(o)}),e.get("/api/jobs",s=>B(s,Cp(t.dal,{status:s.req.query("status")}),FM)),e.post("/api/uploads",s=>gw(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Po(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return B(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Es(),dy)),i=Po(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():B(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():B(s,t.dal.listProjectWorkflows(o.id),CM)}),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 Sn(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{sr(u)}catch{return s.text("invalid condition",400)}let d=$M(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 B(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?B(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():B(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():B(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=Ew(s.req.query("status"),jM);if(typeof i=="string")return s.text(i,400);let a=Ew(s.req.query("severity"),xw);return typeof a=="string"?s.text(a,400):B(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")}:{}}),MM)}),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 Sn(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=AM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=RM(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 B(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=re(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await Sn(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):B(s,c,le)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await Sn(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):B(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(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 B(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(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 B(s,t.dal.reopenIssue(re(s,"id"),a),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return B(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=Ir(t.dal,o,i);return B(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=Ir(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):B(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=xM(l.path);if(NM(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=gM(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 B(s,l,le)}return B(s,l,le)}),e.get("/api/runs",s=>B(s,Yr(t.dal,{limit:Zu(s,"limit")??100}),UM)),e.get("/api/runs/:id",s=>{let o=vr(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,WM)}),e.get("/api/runs/:id/where",s=>{let o=zr(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Uo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Wo(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(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?(ua(t.daemon),B(s,i,bw)):B(s,i,bw,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?(ua(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=>ww(s,t.dal,o=>B(s,o,qM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Fp(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():Iw(s)?s.html(`<pre>${S(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>ww(s,t.dal,o=>{let i=Zy(o);return B(s,i,a=>fe(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>B(s,Up(t.dal,{type:s.req.query("type")}),HM)),e.get("/api/external-signals",s=>B(s,Wp(t.dal,{unhandled:s.req.query("unhandled")==="true"}),JM)),e.get("/api/attentions",s=>B(s,Qt(t.dal,{unacked:s.req.query("unacked")==="true"}),XM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():B(s,o,i=>`<p>acknowledged attention ${S(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=Fo(t.dal,l);return B(s,c,u=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=yt(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=re(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=yt(t.dal,o);if(c===null)return s.notFound();let u=Qt(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);ua(t.daemon);let p=Qt(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 ua(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=Mp(t.dal,{status:i,pr_url:o});return B(s,a,GM)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Dp(t.dal,o);return i===null?s.notFound():B(s,i,VM)}),e.get("/api/sessions",s=>B(s,t.dal.latestSessionSizes(),Sw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Kn(s.req.param("team_name"));return B(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),Sw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Kn(s.req.param("team_name"));try{let i=await xp(t.dal,o,s.req.param("alias"));return B(s,i,a=>Tw("compacted",a.row))}catch(i){if(i instanceof Vn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=await lc(t.dal,o,s.req.param("alias"));return B(s,i,a=>Tw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>B(s,r,kw)),e.post("/api/intake/scan",async s=>(r=await fn(t.dal),B(s,r,kw))),e.get("/api/stats/run-throughput",s=>B(s,Hp(t.dal),KM)),e.get("/api/daemon/state",s=>B(s,t.daemon?.state??null,YM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return B(s,{disabled:!0},le);let o=await t.daemon.runCycle();return B(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=re(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=hc(t.dal,o),l=_c(t.dal,{project_id:o});return s.html(Ae(`Metrics \u2014 ${i.name}`,zM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(hc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(_c(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 ww(t,e,r){let n=pc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function ua(t){t!==void 0&&t.runCycle().catch(()=>{})}function B(t,e,r,n=200){return Iw(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 Iw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function vM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ca(`${t}/index.html`)?Qu(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=bM(yM(TM(import.meta.url)),"webui-dist");return ca(`${n}/index.html`)?Qu(n):null}function Qu(t){if(!EM(t))return t;let e=SM(process.cwd(),t);return e.length===0?".":e}function IM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function Zu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function xM(t){switch(wM(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 NM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Sn(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 $M(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 Ew(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 AM(t){if(t!=null)return typeof t=="string"&&xw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function RM(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 OM(t){return`<h1>Status</h1><div class="grid">
1632
1632
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
1633
1633
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
1634
1634
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
@@ -1648,7 +1648,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1648
1648
  </fieldset>
1649
1649
  </form>
1650
1650
  <div id="pause-result" style="margin-top:0.6em;"></div>
1651
- </section>`}function qM(t){return`<section><h3>${S(t.state_name)}</h3>${le(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function Ew(t){return t.resumed?`<p>resumed run ${S(t.run.id)}</p>`:`<p>resume failed: ${S(t.reason)}</p>`}function HM(t){return`<h1>External Objects</h1>${fe(["id","type","provider","external_id","status","url"],t.map(e=>[S(e.id),S(e.type),S(e.provider),S(e.external_id),S(e.status),S(e.url)]))}`}function JM(t){return`<h1>External Signals</h1>${fe(["id","object","kind","handled"],t.map(e=>[S(e.id),S(e.object_id),S(e.kind),S(e.handled_at)]))}`}function XM(t){let e=`<style>
1651
+ </section>`}function qM(t){return`<section><h3>${S(t.state_name)}</h3>${le(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function bw(t){return t.resumed?`<p>resumed run ${S(t.run.id)}</p>`:`<p>resume failed: ${S(t.reason)}</p>`}function HM(t){return`<h1>External Objects</h1>${fe(["id","type","provider","external_id","status","url"],t.map(e=>[S(e.id),S(e.type),S(e.provider),S(e.external_id),S(e.status),S(e.url)]))}`}function JM(t){return`<h1>External Signals</h1>${fe(["id","object","kind","handled"],t.map(e=>[S(e.id),S(e.object_id),S(e.kind),S(e.handled_at)]))}`}function XM(t){let e=`<style>
1652
1652
  @keyframes attn-flicker { 0%,100%{background:#fff8e6;} 50%{background:#ffd766;} }
1653
1653
  tr.requires-user { animation: attn-flicker 1.4s ease-in-out infinite; font-weight:600; }
1654
1654
  tr.requires-user td:first-child::before { content:"\u2605 "; color:#d28e00; }
@@ -1662,7 +1662,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1662
1662
  <dt>submitted_at</dt><dd>${S(t.submitted_at)}</dd>
1663
1663
  <dt>last_scanned_at</dt><dd>${S(t.last_scanned_at??"\u2014")}</dd>
1664
1664
  <dt>last_known_state</dt><dd>${S(t.last_known_state??"\u2014")}</dd>
1665
- </dl>`}function bw(t){return`<h1>Sessions</h1>${fe(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=jo(e.team_name),n=encodeURIComponent(e.alias);return[S(e.team_name),S(e.alias),S(e.sessionid),S(e.input_tokens),S(e.cache_tokens),S(e.output_tokens),S(e.total_tokens),S(e.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function Sw(t,e){return e===null?`<span>${S(t)}</span>`:`<span>${S(t)} ${S(e.team_name)}/${S(e.alias)}</span>`}function KM(t){return`<h1>Run Throughput</h1>${fe(["workflow","terminal","count"],t.map(e=>[S(e.workflow_name),S(e.terminal_state),S(e.count)]))}`}function Tw(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${fe(["project","scanned","new jobs","error"],t.map(e=>[S(e.project_name),S(e.scanned),S(e.new_jobs),S(e.error)]))}`}function YM(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${le(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function zM(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[S(l.state_name),S(l.total),S(l.request_changes),S(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[S(l.state_name),S(l.lt_5min),S(l.btw_5_15min),S(l.btw_15_60min),S(l.gt_60min),S(l.no_end)]),i=e.retry_counts.map(l=>[S(l.state_name),S(l.retried_runs),S(l.avg_retries)]),a=r.map(l=>[S(l.tool_name),S(l.invocations),S(l.successes),S(l.hit_rate_pct),S(l.avg_latency_ms??"n/a"),S(l.p50_latency_ms??"n/a"),S(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${S(t)}</h1>
1665
+ </dl>`}function Sw(t){return`<h1>Sessions</h1>${fe(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=jo(e.team_name),n=encodeURIComponent(e.alias);return[S(e.team_name),S(e.alias),S(e.sessionid),S(e.input_tokens),S(e.cache_tokens),S(e.output_tokens),S(e.total_tokens),S(e.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function Tw(t,e){return e===null?`<span>${S(t)}</span>`:`<span>${S(t)} ${S(e.team_name)}/${S(e.alias)}</span>`}function KM(t){return`<h1>Run Throughput</h1>${fe(["workflow","terminal","count"],t.map(e=>[S(e.workflow_name),S(e.terminal_state),S(e.count)]))}`}function kw(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${fe(["project","scanned","new jobs","error"],t.map(e=>[S(e.project_name),S(e.scanned),S(e.new_jobs),S(e.error)]))}`}function YM(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${le(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function zM(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[S(l.state_name),S(l.total),S(l.request_changes),S(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[S(l.state_name),S(l.lt_5min),S(l.btw_5_15min),S(l.btw_15_60min),S(l.gt_60min),S(l.no_end)]),i=e.retry_counts.map(l=>[S(l.state_name),S(l.retried_runs),S(l.avg_retries)]),a=r.map(l=>[S(l.tool_name),S(l.invocations),S(l.successes),S(l.hit_rate_pct),S(l.avg_latency_ms??"n/a"),S(l.p50_latency_ms??"n/a"),S(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${S(t)}</h1>
1666
1666
  <h2>Request-changes rate</h2>
1667
1667
  <p>Total: ${S(n.request_changes)} of ${S(n.total)} steps (${S(n.rate_pct)})</p>
1668
1668
  ${fe(["state","total steps","request_changes","rate"],s)}
@@ -1671,42 +1671,42 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1671
1671
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
1672
1672
  ${fe(["state","retried runs","avg attempts"],i)}
1673
1673
  <h2>Tool efficacy</h2>
1674
- ${fe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var jM,Iw,xw=b(()=>{"use strict";vi();an();w_();v_();R_();Ot();mu();Sy();jy();My();qy();Ky();Zy();fw();Ao();gw();Bi();jM=["open","assigned","closed","reopened"],Iw=["low","medium","high","critical"]});function ZM(t){return Math.floor(t/6e4)*6e4}function QM(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)eD(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function eD(t,e){let r=Date.now(),n=ZM(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 Nw(t,e=250){let r=setInterval(()=>{try{QM(t)}catch{}},e);return{stop(){clearInterval(r)}}}var $w=b(()=>{"use strict"});function rD({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1674
+ ${fe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var jM,xw,Nw=b(()=>{"use strict";vi();an();E_();I_();O_();Ot();mu();Ty();Ay();Dy();Hy();Yy();Qy();mw();Ao();yw();Bi();jM=["open","assigned","closed","reopened"],xw=["low","medium","high","critical"]});function ZM(t){return Math.floor(t/6e4)*6e4}function QM(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)eD(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function eD(t,e){let r=Date.now(),n=ZM(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 $w(t,e=250){let r=setInterval(()=>{try{QM(t)}catch{}},e);return{stop(){clearInterval(r)}}}var jw=b(()=>{"use strict"});function rD({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1675
1675
  FROM run r
1676
1676
  JOIN job j ON j.id = r.job_id
1677
1677
  WHERE j.project_id = ?
1678
1678
  AND r.terminal_state IS NOT NULL
1679
1679
  ORDER BY r.id DESC
1680
- 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,tD).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,jw)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:jw,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 Aw(t){for(let e of nD)try{e(t)}catch{}}var tD,jw,nD,Rw=b(()=>{"use strict";tD="request_changes",jw="reviewer_rejection_rate_high";nD=[rD]});function Ss(){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 Ow(t){let e=t.intervalMs??Ss(),r=t.runOnceFn??Rr,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??Nw)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Lw(t.dal,t.monitorSessionActivityFn??cc,e,n).finally(()=>{a=null})),a.finally(()=>u(uc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=sD(t.dal,r,t.collectSessionSizesFn??vp,t.scanIntakeFn??fn,t.monitorSessionActivityFn??cc,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 sD(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(sy({dal:t}),Aw({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 Lw(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 Lw(t,e,r,n){let s=uc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var ed=b(()=>{"use strict";vi();Es();ju();Ao();$w();Rw();dc()});function Cw(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 Mw=b(()=>{"use strict"});import{mkdirSync as oD,readFileSync as iD,readdirSync as aD,statSync as lD,writeFileSync as cD}from"node:fs";import{dirname as uD,join as Pw,sep as Dw}from"node:path";function da(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Fw:return dD(t,s.input);case Uw:return fD(t,s.input);case Ww:return mD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:nd,GetObjectCommand:rd,PutObjectCommand:td}}}function dD(t,e){let r=Bw(t,e.Key);return oD(uD(r),{recursive:!0}),cD(r,e.Body),{}}function fD(t,e){let r=Bw(t,e.Key),n;try{n=iD(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 mD(t,e){let r=e.Prefix??"";qw(r);let s=pD(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 Bw(t,e){return qw(e),Pw(t,e)}function qw(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function pD(t){let e=[],r=(n,s)=>{let o;try{o=aD(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=Pw(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Dw==="/"?a:a.split(Dw).join("/");e.push({key:c,lastModified:lD(l).mtime})}}};return r(t,""),e}var Fw,Uw,Ww,td,rd,nd,sd=b(()=>{"use strict";Fw="localfs-put",Uw="localfs-get",Ww="localfs-list",td=class{input;_localfsTag=Fw;constructor(e){this.input=e}},rd=class{input;_localfsTag=Uw;constructor(e){this.input=e}},nd=class{input;_localfsTag=Ww;constructor(e){this.input=e}}});function Hw(){return{put:0,get:0,list:0}}function od(t,e=hD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function id(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var hD,fa,ad=b(()=>{"use strict";hD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};fa=class{counts=Hw();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Hw(),e}estimateCostUsd(e){return od(this.counts,e)}}});function Jw(t){let e=t.now??Date.now,r=t.timers??_D,n=null,s=null;async function o(){let l=e(),c=id(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=od(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===id(e())}}}var _D,Xw=b(()=>{"use strict";ad();_D={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var ld=b(()=>{"use strict";Ki();zi();zi()});function gD(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 yD(t){return t.reply_to!==void 0&&t.response!==void 0}function wD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Gw(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 ma,Ts,Vw=b(()=>{"use strict";ld();ma=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Ts=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 ma("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=Ft(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(Gw(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Gw(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 ma;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=gD(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(yD(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??wD(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:Ft(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 cd(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 Kw=b(()=>{"use strict"});function ud(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 Yw=b(()=>{"use strict"});function fd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var dd,zw=b(()=>{"use strict";dd="daemon:events"});function Qw(t){return{kind:"prompt",prompt_id:t.prompt_id??Ft(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function md(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 Zw,pd=b(()=>{"use strict";ld();Zw="prompt:root"});function ks(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(tE(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function ED(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(tE(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function eE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=ED(t);return r===null?!0:Date.now()/1e3>=r-e}function tE(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 hd=b(()=>{"use strict"});async function pa(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":bD},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 bD,_d=b(()=>{"use strict";bD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as rE,mkdirSync as nE,readFileSync as sE,writeFileSync as oE}from"node:fs";import{homedir as iE}from"node:os";import{dirname as aE,join as lE}from"node:path";function vs(){return process.env.LMCTL_DEVICE_AUTH_PATH??lE(iE(),".lmctl","device-auth.json")}function cE(){return process.env.LMCTL_TOKEN_PATH??lE(iE(),".lmctl","cli-tokens.json")}function gd(t=vs()){try{let e=JSON.parse(sE(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 uE(t,e=vs()){nE(aE(e),{recursive:!0,mode:448}),oE(e,JSON.stringify(t,null,2));try{rE(e,384)}catch{}}function yd(t,e=cE()){let r={};try{r=JSON.parse(sE(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};nE(aE(e),{recursive:!0,mode:448}),oE(e,JSON.stringify(s,null,2));try{rE(e,384)}catch{}}async function dE(t){let e=t.deviceAuthPath??vs(),r=gd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await pa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return yd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??cE()),{idToken:n.idToken,userId:r.userId}}var wd=b(()=>{"use strict";_d()});function fE(t){if(t.length===0||!t.startsWith("---"))throw new bt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1681
- `);if(e[0]!=="---")throw new bt("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 bt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!SD.has(c))throw new bt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ha.join(", ")}`);r[c]=u}if(n===-1)throw new bt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ha)if(r[i]===void 0)throw new bt(`missing required frontmatter key "${i}" \u2014 required: ${ha.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 ha,SD,bt,mE=b(()=>{"use strict";ha=["title","description","members"],SD=new Set(ha),bt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as TD,writeFileSync as KK,renameSync as YK,existsSync as hE}from"node:fs";import{basename as kD,resolve as Tn,dirname as Ed}from"node:path";function ID(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 xD(t){return/^\s*_MEMBER_\s+\S/.test(t)}function ND(t){return/^\s*_SESSION_\s+\S/.test(t)}function $D(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function jD(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Sd(t){let e=kD(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Re(t){let e=TD(t,"utf-8"),r=Ed(Tn(t)),n=Td(e,Sd(t),{baseDir:r,sourcePath:Tn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Tn(r,s.sessiondir));return n}function Td(t,e,r={}){let n=[],s=[],o=[],i=[];r.sourcePath,r.baseDir;let a=t;if(a.startsWith("#teamfile:")){let u=a.indexOf(`
1682
- `);a=u>=0?a.slice(u+1):""}let l=null;if(a.startsWith("---"))try{l=fE(a)}catch(u){if(u instanceof bt)i.push(`frontmatter: ${u.message}`);else throw u}let c=t.split(`
1683
- `);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(ND(d))throw new Error(`line ${f}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if($D(d)){s.push(f);continue}if(jD(d)){let g=d.replace(/^\s*_SKILL_\s*/,"").trim(),_=g.length===0?[]:g.split(/\s+/u);if(_.length!==1){i.push(`line ${f}: _SKILL_ requires exactly one https:// URL or local path: ${d.trim()}`);continue}let T=_[0];try{if(new URL(T).protocol!=="https:"){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(T)&&!/^[A-Za-z]:[\\/]/u.test(T)){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}o.push(T);continue}if(!xD(d))continue;let m=ID(d);for(let g of Object.keys(m))if(!pE.includes(g))throw new Error(`line ${f}: unknown key "${g}" on _MEMBER_ line: ${d.trim()}
1684
- allowed keys: ${pE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function kd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===bd.toLowerCase());n.length>1&&r.push({field:bd,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?Tn(e,o.teamfile):Tn(o.teamfile);if(!hE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Re(a),c=St(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 vD.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 St(t){return t.members.find(e=>e.alias.toLowerCase()===bd.toLowerCase())}function vd(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=Tn(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),!hE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Re(o),l=St(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return vd(l,Ed(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||Ed(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function _a(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var bd,vD,pE,Ut=b(()=>{"use strict";mE();bd="Lead",vD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);pE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as AD,realpathSync as RD}from"node:fs";import{dirname as OD}from"node:path";function Id(t){LD(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function LD(t){let e=t.payload.root_teamfile;try{e=RD(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await kn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=CD(e);if("error"in r)return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-PD(t.env??process.env)).toISOString()});if(!s.acquired){let o=DD(r.alias,s.current);return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??Tr)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function CD(t){if(!AD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Re(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=St(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??OD(t)}}async function kn(t,e){let r=yE(e.message),n=e.response===null?null:yE(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function yE(t){return t.length<=_E?{text:t,truncated:!1}:{text:t.slice(0,_E),truncated:!0}}function MD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function DD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:MD(t,e)}function PD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return gE;let r=Number(e);return!Number.isFinite(r)||r<=0?gE:r}var _E,gE,wE=b(()=>{"use strict";Rt();Ut();_E=256*1024,gE=30*60*1e3});import{chmodSync as vE,existsSync as FD,mkdirSync as IE,readFileSync as Ea,writeFileSync as xE}from"node:fs";import{dirname as xd,resolve as ga,join as NE}from"node:path";import{fileURLToPath as UD}from"node:url";import{homedir as $E}from"node:os";import{CognitoIdentityClient as WD,GetIdCommand as BD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as EE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as qD,ListObjectsV2Command as HD,PutObjectCommand as JD,S3Client as bE}from"@aws-sdk/client-s3";function xs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:YD(t.selfUrl),n={},s;for(let $ of r)if(FD($)){n=KD($),s=$;break}let o=(...$)=>{for(let x of $)if(typeof x=="string"&&x!=="")return x},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??XD,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??GD,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??VD,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)??ba,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=wa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=wa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=wa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=wa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function KD(t){try{let e=Ea(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 YD(t){let e=xd(UD(t??import.meta.url));return[ga(e,"..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","infra","terraform","terraform.tfstate")]}function wa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function zD(t){let e=ZD(t.intervalMs)??jE,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 ZD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function AE(t){let e=t.tokenPath??NE($E(),".lmctl","cli-tokens.json"),r=TE(t.tokenPath);if(eE(r.cognito?.idToken)&&gd()!==null)try{await dE({region:t.region,clientId:t.cognitoClientId??ba,cliTokensPath:e}),r=TE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let U=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${U}`)}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 kE({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=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),c={ListObjectsV2Command:HD,GetObjectCommand:qD,PutObjectCommand:JD},u=ks(n),d=u??o,f=t.deviceId,m=yn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let U=!1,z=0;for(;!U&&z<2;){z+=1;try{let v=Gi(m,"web"),I=0,O;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let W of J.Contents??[]){let L=Vi(W.Key??"",m,"web");L!==void 0&&L>I&&(I=L)}O=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(O!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${d}`),U=!0}catch(v){let I=v instanceof Error?v.message:String(v);if(i&&z===1&&tP(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),eP(e),i=!1,o=await kE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),m=yn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,E=t.promptTriggerStore,k=new fa,$=new Or({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:R=>k.record(R),onMessage:async R=>{if(_!==void 0&&cd(R.payload)){_.onInbound(R.payload);return}if(T!==void 0&&ud(R.payload)){await T.onInbound(R.payload);return}if(!fd(R.payload)){if(E!==void 0&&md(R.payload)){Id({store:E,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Ts({client:$,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>$.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),T!==void 0&&T.setPublish(async R=>$.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let x=R=>$.putMessage({conversation_id:dd,payload:R});$.start();let A=t.chatLogTailStore===void 0?void 0:zD({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??jE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let D=t.deviceId??o,C=`${d}/usage/`,H;return H=t.usageStore===void 0?void 0:Jw({meter:k,store:t.usageStore,userId:d,deviceId:D,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:U,ceilingUsd:z})=>{t.log?.(`[usage] month ${R} cost $${U.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),$.stop().catch(()=>{}),H?.stop()},publishOwnRollup:async(R,U)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${C}${D}-${R}.json`,Body:JSON.stringify({...U,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let U={put:0,get:0,list:0},z;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:C,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let I of v.Contents??[]){let O=I.Key??"";if(O.endsWith(`-${R}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(J.Body===void 0)continue;let W=JSON.parse(await J.Body.transformToString("utf-8"));U.put+=W.put??0,U.get+=W.get??0,U.list+=W.list??0}catch{}}z=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(z!==void 0);return U},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:$,fetchClient:g,publishDaemonEvent:x,async stop(){A?.stop(),H!==void 0&&(await H.flushNow().catch(()=>{}),H.stop()),await g.stop().catch(()=>{}),await $.stop().catch(()=>{})}}}async function RE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:da(t.rootDir),r=yn({identityId:Is,userId:Is,deviceId:SE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Or({bucket:"local",identityId:Is,userId:Is,deviceId:SE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&cd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&ud(c.payload)){await o.onInbound(c.payload);return}if(!fd(c.payload)){if(i!==void 0&&md(c.payload)){Id({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??ya,readIntervalMs:t.readIntervalMs??ya,heartbeatIdleMs:t.heartbeatIdleMs??ya,backoffReadIntervalMs:t.backoffReadIntervalMs??ya});n=new Ts({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:dd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Is,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function TE(t){let e=t??NE($E(),".lmctl","cli-tokens.json");try{let r=Ea(e,"utf8");return JSON.parse(r)}catch{return{}}}function QD(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ea(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};IE(xd(t),{recursive:!0,mode:448}),xE(t,JSON.stringify(n,null,2));try{vE(t,384)}catch{}}function eP(t){let e={};try{let n=Ea(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,IE(xd(t),{recursive:!0,mode:448}),xE(t,JSON.stringify(r,null,2));try{vE(t,384)}catch{}}async function kE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new WD({region:t.region}).send(new BD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{QD(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 tP(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 jE,ya,ba,XD,GD,VD,Is,SE,Nd=b(()=>{"use strict";Zi();sd();ad();Xw();Vw();Kw();Yw();zw();pd();Ki();hd();wd();wE();jE=3e3,ya=1e3,ba="79u5jhkk46qofog661c9i0bdcs",XD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",GD="us-east-1_4iUdFggDn",VD="lmctl-next-preview-mailbox-254332045686";Is="local",SE="local"});import{spawn as Rd}from"node:child_process";import{createInterface as OE}from"node:readline";var $d,jd,Ad,LE,CE=b(()=>{"use strict";fo();je();$d=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=Rd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=OE({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+`
1680
+ 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,tD).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,Aw)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Aw,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 Rw(t){for(let e of nD)try{e(t)}catch{}}var tD,Aw,nD,Ow=b(()=>{"use strict";tD="request_changes",Aw="reviewer_rejection_rate_high";nD=[rD]});function Ss(){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 Lw(t){let e=t.intervalMs??Ss(),r=t.runOnceFn??Rr,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??$w)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Cw(t.dal,t.monitorSessionActivityFn??cc,e,n).finally(()=>{a=null})),a.finally(()=>u(uc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=sD(t.dal,r,t.collectSessionSizesFn??Ip,t.scanIntakeFn??fn,t.monitorSessionActivityFn??cc,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 sD(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(oy({dal:t}),Rw({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 Cw(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 Cw(t,e,r,n){let s=uc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var ed=b(()=>{"use strict";vi();Es();ju();Ao();jw();Ow();dc()});function Mw(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 Dw=b(()=>{"use strict"});import{mkdirSync as oD,readFileSync as iD,readdirSync as aD,statSync as lD,writeFileSync as cD}from"node:fs";import{dirname as uD,join as Fw,sep as Pw}from"node:path";function da(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Uw:return dD(t,s.input);case Ww:return fD(t,s.input);case Bw:return mD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:nd,GetObjectCommand:rd,PutObjectCommand:td}}}function dD(t,e){let r=qw(t,e.Key);return oD(uD(r),{recursive:!0}),cD(r,e.Body),{}}function fD(t,e){let r=qw(t,e.Key),n;try{n=iD(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 mD(t,e){let r=e.Prefix??"";Hw(r);let s=pD(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 qw(t,e){return Hw(e),Fw(t,e)}function Hw(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function pD(t){let e=[],r=(n,s)=>{let o;try{o=aD(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=Fw(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Pw==="/"?a:a.split(Pw).join("/");e.push({key:c,lastModified:lD(l).mtime})}}};return r(t,""),e}var Uw,Ww,Bw,td,rd,nd,sd=b(()=>{"use strict";Uw="localfs-put",Ww="localfs-get",Bw="localfs-list",td=class{input;_localfsTag=Uw;constructor(e){this.input=e}},rd=class{input;_localfsTag=Ww;constructor(e){this.input=e}},nd=class{input;_localfsTag=Bw;constructor(e){this.input=e}}});function Jw(){return{put:0,get:0,list:0}}function od(t,e=hD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function id(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var hD,fa,ad=b(()=>{"use strict";hD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};fa=class{counts=Jw();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Jw(),e}estimateCostUsd(e){return od(this.counts,e)}}});function Xw(t){let e=t.now??Date.now,r=t.timers??_D,n=null,s=null;async function o(){let l=e(),c=id(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=od(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===id(e())}}}var _D,Gw=b(()=>{"use strict";ad();_D={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var ld=b(()=>{"use strict";Ki();zi();zi()});function gD(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 yD(t){return t.reply_to!==void 0&&t.response!==void 0}function wD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Vw(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 ma,Ts,Kw=b(()=>{"use strict";ld();ma=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Ts=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 ma("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=Ft(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(Vw(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Vw(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 ma;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=gD(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(yD(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??wD(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:Ft(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 cd(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 Yw=b(()=>{"use strict"});function ud(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 zw=b(()=>{"use strict"});function fd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var dd,Zw=b(()=>{"use strict";dd="daemon:events"});function eE(t){return{kind:"prompt",prompt_id:t.prompt_id??Ft(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function md(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 Qw,pd=b(()=>{"use strict";ld();Qw="prompt:root"});function ks(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(rE(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function ED(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(rE(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function tE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=ED(t);return r===null?!0:Date.now()/1e3>=r-e}function rE(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 hd=b(()=>{"use strict"});async function pa(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":bD},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 bD,_d=b(()=>{"use strict";bD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as nE,mkdirSync as sE,readFileSync as oE,writeFileSync as iE}from"node:fs";import{homedir as aE}from"node:os";import{dirname as lE,join as cE}from"node:path";function vs(){return process.env.LMCTL_DEVICE_AUTH_PATH??cE(aE(),".lmctl","device-auth.json")}function uE(){return process.env.LMCTL_TOKEN_PATH??cE(aE(),".lmctl","cli-tokens.json")}function gd(t=vs()){try{let e=JSON.parse(oE(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 dE(t,e=vs()){sE(lE(e),{recursive:!0,mode:448}),iE(e,JSON.stringify(t,null,2));try{nE(e,384)}catch{}}function yd(t,e=uE()){let r={};try{r=JSON.parse(oE(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};sE(lE(e),{recursive:!0,mode:448}),iE(e,JSON.stringify(s,null,2));try{nE(e,384)}catch{}}async function fE(t){let e=t.deviceAuthPath??vs(),r=gd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await pa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return yd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??uE()),{idToken:n.idToken,userId:r.userId}}var wd=b(()=>{"use strict";_d()});function mE(t){if(t.length===0||!t.startsWith("---"))throw new bt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1681
+ `);if(e[0]!=="---")throw new bt("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 bt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!SD.has(c))throw new bt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ha.join(", ")}`);r[c]=u}if(n===-1)throw new bt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ha)if(r[i]===void 0)throw new bt(`missing required frontmatter key "${i}" \u2014 required: ${ha.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 ha,SD,bt,pE=b(()=>{"use strict";ha=["title","description","members"],SD=new Set(ha),bt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as TD,writeFileSync as KK,renameSync as YK,existsSync as _E}from"node:fs";import{basename as kD,resolve as Tn,dirname as Ed}from"node:path";function ID(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 xD(t){return/^\s*_MEMBER_\s+\S/.test(t)}function ND(t){return/^\s*_SESSION_\s+\S/.test(t)}function $D(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function jD(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Sd(t){let e=kD(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Re(t){let e=TD(t,"utf-8"),r=Ed(Tn(t)),n=Td(e,Sd(t),{baseDir:r,sourcePath:Tn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Tn(r,s.sessiondir));return n}function Td(t,e,r={}){let n=[],s=[],o=[],i=[];r.sourcePath,r.baseDir;let a=t;if(a.startsWith("#teamfile:")){let u=a.indexOf(`
1682
+ `);a=u>=0?a.slice(u+1):""}let l=null;if(a.startsWith("---"))try{l=mE(a)}catch(u){if(u instanceof bt)i.push(`frontmatter: ${u.message}`);else throw u}let c=t.split(`
1683
+ `);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(ND(d))throw new Error(`line ${f}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if($D(d)){s.push(f);continue}if(jD(d)){let g=d.replace(/^\s*_SKILL_\s*/,"").trim(),_=g.length===0?[]:g.split(/\s+/u);if(_.length!==1){i.push(`line ${f}: _SKILL_ requires exactly one https:// URL or local path: ${d.trim()}`);continue}let T=_[0];try{if(new URL(T).protocol!=="https:"){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(T)&&!/^[A-Za-z]:[\\/]/u.test(T)){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}o.push(T);continue}if(!xD(d))continue;let m=ID(d);for(let g of Object.keys(m))if(!hE.includes(g))throw new Error(`line ${f}: unknown key "${g}" on _MEMBER_ line: ${d.trim()}
1684
+ allowed keys: ${hE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function kd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===bd.toLowerCase());n.length>1&&r.push({field:bd,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?Tn(e,o.teamfile):Tn(o.teamfile);if(!_E(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Re(a),c=St(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 vD.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 St(t){return t.members.find(e=>e.alias.toLowerCase()===bd.toLowerCase())}function vd(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=Tn(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),!_E(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Re(o),l=St(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return vd(l,Ed(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||Ed(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function _a(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var bd,vD,hE,Ut=b(()=>{"use strict";pE();bd="Lead",vD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);hE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as AD,realpathSync as RD}from"node:fs";import{dirname as OD}from"node:path";function Id(t){LD(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function LD(t){let e=t.payload.root_teamfile;try{e=RD(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await kn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=CD(e);if("error"in r)return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-PD(t.env??process.env)).toISOString()});if(!s.acquired){let o=DD(r.alias,s.current);return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??Tr)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function CD(t){if(!AD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Re(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=St(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??OD(t)}}async function kn(t,e){let r=wE(e.message),n=e.response===null?null:wE(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function wE(t){return t.length<=gE?{text:t,truncated:!1}:{text:t.slice(0,gE),truncated:!0}}function MD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function DD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:MD(t,e)}function PD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return yE;let r=Number(e);return!Number.isFinite(r)||r<=0?yE:r}var gE,yE,EE=b(()=>{"use strict";Rt();Ut();gE=256*1024,yE=30*60*1e3});import{chmodSync as IE,existsSync as FD,mkdirSync as xE,readFileSync as Ea,writeFileSync as NE}from"node:fs";import{dirname as xd,resolve as ga,join as $E}from"node:path";import{fileURLToPath as UD}from"node:url";import{homedir as jE}from"node:os";import{CognitoIdentityClient as WD,GetIdCommand as BD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as bE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as qD,ListObjectsV2Command as HD,PutObjectCommand as JD,S3Client as SE}from"@aws-sdk/client-s3";function xs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:YD(t.selfUrl),n={},s;for(let $ of r)if(FD($)){n=KD($),s=$;break}let o=(...$)=>{for(let x of $)if(typeof x=="string"&&x!=="")return x},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??XD,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??GD,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??VD,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)??ba,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=wa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=wa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=wa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=wa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function KD(t){try{let e=Ea(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 YD(t){let e=xd(UD(t??import.meta.url));return[ga(e,"..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","infra","terraform","terraform.tfstate")]}function wa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function zD(t){let e=ZD(t.intervalMs)??AE,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 ZD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function RE(t){let e=t.tokenPath??$E(jE(),".lmctl","cli-tokens.json"),r=kE(t.tokenPath);if(tE(r.cognito?.idToken)&&gd()!==null)try{await fE({region:t.region,clientId:t.cognitoClientId??ba,cliTokensPath:e}),r=kE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let U=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${U}`)}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 vE({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=bE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new SE({region:t.region,credentials:a}),c={ListObjectsV2Command:HD,GetObjectCommand:qD,PutObjectCommand:JD},u=ks(n),d=u??o,f=t.deviceId,m=yn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let U=!1,z=0;for(;!U&&z<2;){z+=1;try{let v=Gi(m,"web"),I=0,O;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let W of J.Contents??[]){let L=Vi(W.Key??"",m,"web");L!==void 0&&L>I&&(I=L)}O=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(O!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${d}`),U=!0}catch(v){let I=v instanceof Error?v.message:String(v);if(i&&z===1&&tP(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),eP(e),i=!1,o=await vE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=bE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new SE({region:t.region,credentials:a}),m=yn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,E=t.promptTriggerStore,k=new fa,$=new Or({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:R=>k.record(R),onMessage:async R=>{if(_!==void 0&&cd(R.payload)){_.onInbound(R.payload);return}if(T!==void 0&&ud(R.payload)){await T.onInbound(R.payload);return}if(!fd(R.payload)){if(E!==void 0&&md(R.payload)){Id({store:E,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Ts({client:$,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>$.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),T!==void 0&&T.setPublish(async R=>$.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let x=R=>$.putMessage({conversation_id:dd,payload:R});$.start();let A=t.chatLogTailStore===void 0?void 0:zD({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??AE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let D=t.deviceId??o,C=`${d}/usage/`,H;return H=t.usageStore===void 0?void 0:Xw({meter:k,store:t.usageStore,userId:d,deviceId:D,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:U,ceilingUsd:z})=>{t.log?.(`[usage] month ${R} cost $${U.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),$.stop().catch(()=>{}),H?.stop()},publishOwnRollup:async(R,U)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${C}${D}-${R}.json`,Body:JSON.stringify({...U,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let U={put:0,get:0,list:0},z;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:C,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let I of v.Contents??[]){let O=I.Key??"";if(O.endsWith(`-${R}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(J.Body===void 0)continue;let W=JSON.parse(await J.Body.transformToString("utf-8"));U.put+=W.put??0,U.get+=W.get??0,U.list+=W.list??0}catch{}}z=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(z!==void 0);return U},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:$,fetchClient:g,publishDaemonEvent:x,async stop(){A?.stop(),H!==void 0&&(await H.flushNow().catch(()=>{}),H.stop()),await g.stop().catch(()=>{}),await $.stop().catch(()=>{})}}}async function OE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:da(t.rootDir),r=yn({identityId:Is,userId:Is,deviceId:TE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Or({bucket:"local",identityId:Is,userId:Is,deviceId:TE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&cd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&ud(c.payload)){await o.onInbound(c.payload);return}if(!fd(c.payload)){if(i!==void 0&&md(c.payload)){Id({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??ya,readIntervalMs:t.readIntervalMs??ya,heartbeatIdleMs:t.heartbeatIdleMs??ya,backoffReadIntervalMs:t.backoffReadIntervalMs??ya});n=new Ts({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:dd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Is,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function kE(t){let e=t??$E(jE(),".lmctl","cli-tokens.json");try{let r=Ea(e,"utf8");return JSON.parse(r)}catch{return{}}}function QD(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ea(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};xE(xd(t),{recursive:!0,mode:448}),NE(t,JSON.stringify(n,null,2));try{IE(t,384)}catch{}}function eP(t){let e={};try{let n=Ea(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,xE(xd(t),{recursive:!0,mode:448}),NE(t,JSON.stringify(r,null,2));try{IE(t,384)}catch{}}async function vE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new WD({region:t.region}).send(new BD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{QD(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 tP(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 AE,ya,ba,XD,GD,VD,Is,TE,Nd=b(()=>{"use strict";Zi();sd();ad();Gw();Kw();Yw();zw();Zw();pd();Ki();hd();wd();EE();AE=3e3,ya=1e3,ba="79u5jhkk46qofog661c9i0bdcs",XD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",GD="us-east-1_4iUdFggDn",VD="lmctl-next-preview-mailbox-254332045686";Is="local",TE="local"});import{spawn as Rd}from"node:child_process";import{createInterface as LE}from"node:readline";var $d,jd,Ad,CE,ME=b(()=>{"use strict";fo();je();$d=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=Rd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=LE({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+`
1685
1685
  `)}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+`
1686
1686
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},jd=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Rd(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(`
1687
1687
  `);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+`
1688
- `)}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}})}},Ad=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{uo(n)}catch(a){Z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Rd(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=OE({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+`
1688
+ `)}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}})}},Ad=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{uo(n)}catch(a){Z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Rd(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=LE({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+`
1689
1689
  `)}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+`
1690
1690
  `)}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+`
1691
- `)}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}})}}},LE=t=>{switch(t){case"codex":return new $d;case"claude":case"qwen":return new jd;case"gemini":case"copilot":case"opencode":return new Ad;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as rP}from"node:crypto";import{existsSync as O8,mkdirSync as nP,readFileSync as sP,writeFileSync as oP}from"node:fs";import{homedir as iP}from"node:os";import{dirname as aP,join as lP}from"node:path";function Sa(){return process.env.LMCTL_DEVICE_FILE??lP(iP(),".lmctl","device.json")}function Lr(t=Sa()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(sP(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 Od(t=Sa()){let e=Lr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:rP(),created_at:new Date().toISOString()};return nP(aP(t),{recursive:!0}),oP(t,`${JSON.stringify(r,null,2)}
1692
- `,{encoding:"utf8",mode:384}),r}var Ld=b(()=>{"use strict"});import*as ME from"node:child_process";function uP(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 Cd(t,e={}){let r=e.spawnSync===void 0&&process.env[dP]==="1",n=e.spawnSync??ME.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ta[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=uP(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 DE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ta).join(", ")})`;let e=cP[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 Ta,cP,dP,PE=b(()=>{"use strict";Ta={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},cP={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};dP="LMCTL_SKIP_BINARY_CHECK"});var VE={};ce(VE,{ProviderBinaryPreflightError:()=>ka,__setProviderBinaryCheckForTest:()=>EP,bootstrapAgentRestMailbox:()=>WE,publishRegisteredWorkflowsOnStart:()=>UE,resolveLocalMailboxDir:()=>XE,resolveLocalWebuiDir:()=>JE,resolveServeConfig:()=>BE,runProviderBinaryPreflight:()=>HE,runServe:()=>_P,validateServeArgs:()=>GE});import{randomBytes as fP}from"node:crypto";import{existsSync as mP}from"node:fs";import{homedir as pP}from"node:os";import{isAbsolute as FE,resolve as Md}from"node:path";async function _P(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(hP),0;let r=GE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1693
- `),2;try{HE(e)}catch(E){return 1}let n=pe({path:ue()}),s={portCli:bP(t)},o;try{o=BE({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(E){return n.close(),e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
1694
- `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Cw(n);let i;if(r.localWebui!==void 0){let E=JE(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=XE(process.env),{s3:$,commands:x}=da(k);i={webuiDir:E,rootDir:k,s3:$,commands:x},e.stdout.write(`local webui: serving SPA from ${E}; mailbox store ${k}
1695
- `)}let a=r.noDaemon?void 0:Ow({dal:n,intervalMs:Ss()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:xs({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)`)+`
1691
+ `)}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}})}}},CE=t=>{switch(t){case"codex":return new $d;case"claude":case"qwen":return new jd;case"gemini":case"copilot":case"opencode":return new Ad;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as rP}from"node:crypto";import{existsSync as O8,mkdirSync as nP,readFileSync as sP,writeFileSync as oP}from"node:fs";import{homedir as iP}from"node:os";import{dirname as aP,join as lP}from"node:path";function Sa(){return process.env.LMCTL_DEVICE_FILE??lP(iP(),".lmctl","device.json")}function Lr(t=Sa()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(sP(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 Od(t=Sa()){let e=Lr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:rP(),created_at:new Date().toISOString()};return nP(aP(t),{recursive:!0}),oP(t,`${JSON.stringify(r,null,2)}
1692
+ `,{encoding:"utf8",mode:384}),r}var Ld=b(()=>{"use strict"});import*as DE from"node:child_process";function uP(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 Cd(t,e={}){let r=e.spawnSync===void 0&&process.env[dP]==="1",n=e.spawnSync??DE.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ta[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=uP(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 PE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ta).join(", ")})`;let e=cP[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 Ta,cP,dP,FE=b(()=>{"use strict";Ta={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},cP={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};dP="LMCTL_SKIP_BINARY_CHECK"});var KE={};ce(KE,{ProviderBinaryPreflightError:()=>ka,__setProviderBinaryCheckForTest:()=>EP,bootstrapAgentRestMailbox:()=>BE,publishRegisteredWorkflowsOnStart:()=>WE,resolveLocalMailboxDir:()=>GE,resolveLocalWebuiDir:()=>XE,resolveServeConfig:()=>qE,runProviderBinaryPreflight:()=>JE,runServe:()=>_P,validateServeArgs:()=>VE});import{randomBytes as fP}from"node:crypto";import{existsSync as mP}from"node:fs";import{homedir as pP}from"node:os";import{isAbsolute as UE,resolve as Md}from"node:path";async function _P(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(hP),0;let r=VE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1693
+ `),2;try{JE(e)}catch(E){return 1}let n=pe({path:ue()}),s={portCli:bP(t)},o;try{o=qE({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(E){return n.close(),e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
1694
+ `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Mw(n);let i;if(r.localWebui!==void 0){let E=XE(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=GE(process.env),{s3:$,commands:x}=da(k);i={webuiDir:E,rootDir:k,s3:$,commands:x},e.stdout.write(`local webui: serving SPA from ${E}; mailbox store ${k}
1695
+ `)}let a=r.noDaemon?void 0:Lw({dal:n,intervalMs:Ss()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:xs({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)`)+`
1696
1696
  `);let c=await wP({log:E=>e.stderr.write(`${E}
1697
- `)}),u=new na({adapterFactory:LE,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:E=>e.stderr.write(`${E}
1698
- `)}),d=Lr()?.device_id,f=kw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:gP(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 WE({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 UE({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),T=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1699
- `),await new Promise(E=>{let k=()=>{(async()=>(a!==void 0&&await a.stop(),T.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),E()))()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function gP(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 UE(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)}
1700
- `)}}async function WE(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await RE({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
1701
- `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await AE({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
1702
- `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(f_({app:t.app,log:r=>t.io?.stderr.write(`${r}
1697
+ `)}),u=new na({adapterFactory:CE,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:E=>e.stderr.write(`${E}
1698
+ `)}),d=Lr()?.device_id,f=vw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:gP(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 BE({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 WE({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),T=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1699
+ `),await new Promise(E=>{let k=()=>{(async()=>(a!==void 0&&await a.stop(),T.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),E()))()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function gP(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 WE(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)}
1700
+ `)}}async function BE(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await OE({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
1701
+ `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await RE({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
1702
+ `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(m_({app:t.app,log:r=>t.io?.stderr.write(`${r}
1703
1703
  `)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
1704
1704
  `)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
1705
- `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function BE(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=fP(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: ${yP(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
1706
- `);return{port:a,apiUrl:d,apiToken:c}}function yP(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 wP(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 ra({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 EP(t){qE=t??Cd}function HE(t){let e=Object.keys(Ta),r=qE(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${DE(o)}
1705
+ `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function qE(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=fP(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: ${yP(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
1706
+ `);return{port:a,apiUrl:d,apiToken:c}}function yP(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 wP(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 ra({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 EP(t){HE=t??Cd}function JE(t){let e=Object.keys(Ta),r=HE(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${PE(o)}
1707
1707
  `);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
1708
1708
  `),new ka(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
1709
- `)}function JE(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=FE(r)?r:Md(process.cwd(),r);return mP(`${n}/index.html`)?n:null}function XE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?FE(e)?e:Md(process.cwd(),e):Md(pP(),".lmctl","local-mailbox")}function bP(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 GE(t,e=process.env){let r=SP(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 SP(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 hP,ka,qE,KE=b(()=>{"use strict";Pe();xw();ed();Mw();ou();Nd();sd();Hu();Ju();CE();Ld();PE();Ve();hP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1709
+ `)}function XE(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=UE(r)?r:Md(process.cwd(),r);return mP(`${n}/index.html`)?n:null}function GE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?UE(e)?e:Md(process.cwd(),e):Md(pP(),".lmctl","local-mailbox")}function bP(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 VE(t,e=process.env){let r=SP(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 SP(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 hP,ka,HE,YE=b(()=>{"use strict";Pe();Nw();ed();Dw();ou();Nd();sd();Hu();Ju();ME();Ld();FE();Ve();hP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1710
1710
 
1711
1711
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
1712
1712
  services. Help exits before any port binding or daemon startup.
@@ -1716,20 +1716,20 @@ services. Help exits before any port binding or daemon startup.
1716
1716
  against the local filesystem (no S3, no Cognito) with a fixed
1717
1717
  local identity. Mailbox store defaults to
1718
1718
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
1719
- `;ka=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}},qE=Cd});var YE={};ce(YE,{runIntake:()=>kP});async function kP(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(TP),0):r==="scan"?vP(n,e):r==="config"?IP(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1720
- `),1)}async function vP(t,e){let r=F(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=N(r,"--project");return G(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 nu({dal:s,project:o});return q(e,{project_id:o.id,project_name:o.name,...i}),0}return q(e,await fn(s)),0})}async function IP(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=F(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return y(e,s.error);let o=N(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return y(e,"missing or invalid --scan-github-issues true|false");let i=N(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return y(e,"invalid --state: expected open, closed, or all");let a=N(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return G(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 q(e,d),0})}var TP,zE=b(()=>{"use strict";vi();$e();TP=`usage: lmctl intake <scan|config> ...
1719
+ `;ka=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}},HE=Cd});var zE={};ce(zE,{runIntake:()=>kP});async function kP(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(TP),0):r==="scan"?vP(n,e):r==="config"?IP(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1720
+ `),1)}async function vP(t,e){let r=F(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=N(r,"--project");return G(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 nu({dal:s,project:o});return q(e,{project_id:o.id,project_name:o.name,...i}),0}return q(e,await fn(s)),0})}async function IP(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=F(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return y(e,s.error);let o=N(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return y(e,"missing or invalid --scan-github-issues true|false");let i=N(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return y(e,"invalid --state: expected open, closed, or all");let a=N(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return G(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 q(e,d),0})}var TP,ZE=b(()=>{"use strict";vi();$e();TP=`usage: lmctl intake <scan|config> ...
1721
1721
 
1722
1722
  Scan configured project GitHub issues into lmctl, or update per-project
1723
1723
  intake settings such as enabled state, labels, and issue state filters.
1724
- `});import{createHash as xP}from"node:crypto";import{existsSync as Ns,mkdirSync as NP,readFileSync as QE,realpathSync as $P,writeFileSync as jP}from"node:fs";import{dirname as eb,resolve as tb}from"node:path";function Cr(t){let e=tb(t);return Ns(e)?$P(e):e}function ZE(t,e){let r=eb(e),n=Td(t,Sd(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=tb(r,s.sessiondir));return n}function $s(t,e){let r=Cr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Ns(r)&&"upsertRootTeam"in e&&(NP(eb(r),{recursive:!0}),jP(r,n.raw_text,"utf8")),ZE(n.raw_text,r);if(Ns(r)){let s=QE(r,"utf8"),o=ZE(s,r);return"upsertRootTeam"in e&&RP(o)&&OP(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Ns(r))throw new Error(`teamfile not found: ${t}`);return Re(r)}function rb(t,e,r){let n=Cr(t),s=e.getRootTeam(n);s===null||!Ns(n)||QE(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 RP(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=AP)}function OP(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:xP("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var AP,va=b(()=>{"use strict";Ut();AP=5});import{existsSync as LP}from"node:fs";import{dirname as nb}from"node:path";function DP(t){return CP.test(t)||MP.test(t)}function sb(t){return Ia.test(t)}function js(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Ia.test(n)?null:{teamfile:r,alias:n}}function Wt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!sb(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Ia.source}).`);let n=Cr(t);if(r===void 0&&!LP(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=$s(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=_a(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1725
- Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=vd(o,nb(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
1726
- Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??nb(n),isLead:St(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function ur(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=js(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?sb(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Ia.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1724
+ `});import{createHash as xP}from"node:crypto";import{existsSync as Ns,mkdirSync as NP,readFileSync as eb,realpathSync as $P,writeFileSync as jP}from"node:fs";import{dirname as tb,resolve as rb}from"node:path";function Cr(t){let e=rb(t);return Ns(e)?$P(e):e}function QE(t,e){let r=tb(e),n=Td(t,Sd(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=rb(r,s.sessiondir));return n}function $s(t,e){let r=Cr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Ns(r)&&"upsertRootTeam"in e&&(NP(tb(r),{recursive:!0}),jP(r,n.raw_text,"utf8")),QE(n.raw_text,r);if(Ns(r)){let s=eb(r,"utf8"),o=QE(s,r);return"upsertRootTeam"in e&&RP(o)&&OP(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Ns(r))throw new Error(`teamfile not found: ${t}`);return Re(r)}function nb(t,e,r){let n=Cr(t),s=e.getRootTeam(n);s===null||!Ns(n)||eb(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 RP(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=AP)}function OP(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:xP("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var AP,va=b(()=>{"use strict";Ut();AP=5});import{existsSync as LP}from"node:fs";import{dirname as sb}from"node:path";function DP(t){return CP.test(t)||MP.test(t)}function ob(t){return Ia.test(t)}function js(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Ia.test(n)?null:{teamfile:r,alias:n}}function Wt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!ob(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Ia.source}).`);let n=Cr(t);if(r===void 0&&!LP(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=$s(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=_a(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1725
+ Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=vd(o,sb(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
1726
+ Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??sb(n),isLead:St(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function ur(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=js(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?ob(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Ia.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1727
1727
  Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(DP(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.
1728
1728
  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}".
1729
1729
  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.
1730
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,CP,MP,Ia,vn=b(()=>{"use strict";Ut();va();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},CP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,MP=/^ses_[A-Za-z0-9_-]+$/,Ia=/^[A-Za-z][A-Za-z0-9_-]*$/});function ab(t){let e=ob(t.registry,t.fromTeamfile);if(e===void 0)return In(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!ib(e,t.fromAlias))return In(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=ob(t.registry,t.toTeamfile);return r===void 0?In(`target team is not registered in policy graph: ${t.toTeamfile}`):ib(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?In(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?In(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:In(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function ob(t,e){return t.teams.find(r=>r.teamfile===e)}function ib(t,e){return t.aliases.some(r=>r===e)}function In(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var lb=b(()=>{"use strict"});import{basename as PP}from"node:path";function db(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=pb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=WP(e.sender,n),o=BP(e.sender,n);o!==null&&o.teamfile===e.root&&!ub(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=>ub(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<FP;return{stop:l.length>=1&&u,chain:qP(a)}}function fb(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=pb(t,r),s=hb(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function xa(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return cb;let r=Number(e);return!Number.isFinite(r)||r<=0?cb:r}function mb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function UP(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 pb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(UP).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function WP(t,e,r={}){let n=new Map;for(let a of e)n.set(Mr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Mr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Mr(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=Mr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function hb(t,e){let r=Mr(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=Mr(l.sender),u=Mr(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 BP(t,e){let r=hb(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function ub(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Mr(t){return`${t.teamfile}\0${t.alias}`}function qP(t){return t.map(e=>`${PP(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var FP,cb,_b=b(()=>{"use strict";FP=6e4,cb=8*60*60*1e3});var bb={};ce(bb,{parseIdleTimeoutMs:()=>Eb,runChat:()=>JP});async function JP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${yb}
1730
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,CP,MP,Ia,vn=b(()=>{"use strict";Ut();va();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},CP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,MP=/^ses_[A-Za-z0-9_-]+$/,Ia=/^[A-Za-z][A-Za-z0-9_-]*$/});function lb(t){let e=ib(t.registry,t.fromTeamfile);if(e===void 0)return In(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!ab(e,t.fromAlias))return In(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=ib(t.registry,t.toTeamfile);return r===void 0?In(`target team is not registered in policy graph: ${t.toTeamfile}`):ab(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?In(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?In(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:In(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function ib(t,e){return t.teams.find(r=>r.teamfile===e)}function ab(t,e){return t.aliases.some(r=>r===e)}function In(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var cb=b(()=>{"use strict"});import{basename as PP}from"node:path";function fb(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=hb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=WP(e.sender,n),o=BP(e.sender,n);o!==null&&o.teamfile===e.root&&!db(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=>db(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<FP;return{stop:l.length>=1&&u,chain:qP(a)}}function mb(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=hb(t,r),s=_b(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function xa(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return ub;let r=Number(e);return!Number.isFinite(r)||r<=0?ub:r}function pb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function UP(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 hb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(UP).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function WP(t,e,r={}){let n=new Map;for(let a of e)n.set(Mr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Mr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Mr(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=Mr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function _b(t,e){let r=Mr(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=Mr(l.sender),u=Mr(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 BP(t,e){let r=_b(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function db(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Mr(t){return`${t.teamfile}\0${t.alias}`}function qP(t){return t.map(e=>`${PP(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var FP,ub,gb=b(()=>{"use strict";FP=6e4,ub=8*60*60*1e3});var Sb={};ce(Sb,{parseIdleTimeoutMs:()=>bb,runChat:()=>JP});async function JP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${wb}
1731
1731
  `),t.length===0?2:0;let r=GP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1732
- ${yb}
1732
+ ${wb}
1733
1733
  `),2;if(r.runFlag!==void 0){let f=Number.parseInt(r.runFlag,10);return!Number.isFinite(f)||f<=0||String(f)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
1734
1734
  `),2):await G(e,async m=>{let p=m.getRun(f);if(p===null)return e.stderr.write(`error: run ${f}: not found
1735
1735
  `),1;if(p.terminal_state!==null&&p.terminal_state.length>0)return y(e,`run ${f}: already terminal (${p.terminal_state}); chat --run cannot resume a terminated run`);let h=sa(m,f);if(h===null)return e.stderr.write(`error: run ${f}: no pending operator-answerable attention (chat --run only resumes paused runs)
@@ -1744,7 +1744,7 @@ ${yb}
1744
1744
  `),2;if(n.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
1745
1745
  `),2;let s,o=null,i=null;if(n.mode==="ai-team"){if(n.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
1746
1746
  `),2;let f=n.alias;try{let m=await G(e,E=>Wt(n.teamfile,f,E)),p=m.teamfile,h=await G(e,E=>VP(r.fromFlag,p,E)),g=await KP(e,{explicitRoot:r.rootFlag,sender:h,receiverTeamfile:p,operatorOrigin:r.fromFlag===void 0}),_=r.fromFlag===void 0?null:await YP(e,{rootTeamfile:g,sender:h,receiverTeamfile:p,receiverAlias:m.alias});_!==null&&!_.allowed&&e.stderr.write(`warning: out-of-policy chat send: ${_.reason}
1747
- `),s={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir,alias:m.alias,isLead:m.isLead,...m.model!==void 0?{model:m.model}:{},...m.effort!==void 0?{effort:m.effort}:{}},oi(e,m.isLead,m.alias,m.provider,m.sessiondir);try{ii(e,Re(n.teamfile),n.teamfile)}catch{}if(o={root_teamfile:g,sender_teamfile:h.teamfile,sender_alias:h.alias,receiver_teamfile:p,receiver_alias:m.alias,policy:_},r.fromFlag!==void 0&&h.teamfile!==p){let E=await G(e,k=>db(k,{root:g,sender:h,receiverTeamfile:p,receiverAlias:m.alias,now:new Date}));if(E.stop){let k=mb(E.chain);return await $a(e,{...o,message:r.prompt,response:null,status:"error",error_detail:k}),e.stderr.write(`${k}
1747
+ `),s={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir,alias:m.alias,isLead:m.isLead,...m.model!==void 0?{model:m.model}:{},...m.effort!==void 0?{effort:m.effort}:{}},oi(e,m.isLead,m.alias,m.provider,m.sessiondir);try{ii(e,Re(n.teamfile),n.teamfile)}catch{}if(o={root_teamfile:g,sender_teamfile:h.teamfile,sender_alias:h.alias,receiver_teamfile:p,receiver_alias:m.alias,policy:_},r.fromFlag!==void 0&&h.teamfile!==p){let E=await G(e,k=>fb(k,{root:g,sender:h,receiverTeamfile:p,receiverAlias:m.alias,now:new Date}));if(E.stop){let k=pb(E.chain);return await $a(e,{...o,message:r.prompt,response:null,status:"error",error_detail:k}),e.stderr.write(`${k}
1748
1748
  `),1}}let T=await QP(e,{receiver_teamfile:p,receiver_alias:m.alias,sender_teamfile:h.teamfile,sender_alias:h.alias,force:r.force===!0});if(!T.acquired){let E=n1(m.alias,T.current);return await $a(e,{...o,message:r.prompt,response:null,status:"error",error_detail:E}),e.stderr.write(`error: ${E}
1749
1749
  `),1}i=T.lease}catch(m){let p=m instanceof Error?m.message:String(m);return e.stderr.write(`error: ${p}
1750
1750
  `),m instanceof ge,1}}else{if(r.force===!0)return e.stderr.write(`error: --force is only valid for AI-team chat
@@ -1754,12 +1754,12 @@ ${yb}
1754
1754
  `):e.stdout.write(`${m.text}${m.text.endsWith(`
1755
1755
  `)?"":`
1756
1756
  `}`),m.status==="stalled"?1:0}catch(f){let m=f instanceof Error?f.message:String(f);return o!==null&&await $a(e,{...o,message:r.prompt,response:null,status:o.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:o.policy?.outOfPolicy===!0?`${o.policy.reason}; provider error: ${m}`:m}),e.stderr.write(`error: ${m}
1757
- `),1}finally{i!==null&&await r1(e,i)}}function XP(t,e){return t.slice(-e)}function GP(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=Eb(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function VP(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=js(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Cr(n.teamfile),o=$s(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=_a(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function KP(t,e){return e.explicitRoot!==void 0?Cr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await G(t,r=>fb(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function YP(t,e){return await G(t,r=>ab({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:zP(r,e.sender.teamfile,e.receiverTeamfile)}))}function zP(t,e,r){return{teams:[e,r].map(s=>ZP(s,t))}}function ZP(t,e){let r=$s(t,e),n=St(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function QP(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-xa()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await G(t,o=>{let i=Se(),a=i?o.getAgentInflight(e.receiver_teamfile,e.receiver_alias):null,l=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(l.acquired){if(i){let c=a===null?null:e.force?"force":a.started_at<n?"stale":null;ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:c===null?"acquired":"reclaimed",...c===null?{}:{reclaim_reason:c,holder:Na(a)}}))}return{acquired:!0,lease:l.current??s}}if(!l.acquired&&e1(l.current,n)){let c=o.tryAcquireAgentInflight(s,{stale_before:n,reclaim_observed:{sender_teamfile:l.current.sender_teamfile,sender_alias:l.current.sender_alias,started_at:l.current.started_at,holder_pid:l.current.holder_pid}});return c.acquired?(i&&ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"reclaimed",reclaim_reason:l.current.holder_pid===null?"null-holder":"dead-pid",holder:Na(l.current)})),{acquired:!0,lease:c.current??s}):(i&&ot(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:Na(c.current)})),{acquired:!1,current:c.current})}return i&&ot(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:Na(l.current)})),{acquired:!1,current:l.current}})}function Na(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}}function e1(t,e){return t.holder_pid===null?t.started_at<e:!t1(t.holder_pid)}function t1(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"}}async function r1(t,e){try{await G(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)}
1758
- `)}}function n1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function $a(t,e){let r=wb(e.message),n=e.response===null?null:wb(e.response);try{await G(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1759
- `)}}function wb(t){return t.length<=gb?{text:t,truncated:!1}:{text:t.slice(0,gb),truncated:!0}}function Eb(t){if(t==="0")return 0;let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d) or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function s1(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1757
+ `),1}finally{i!==null&&await r1(e,i)}}function XP(t,e){return t.slice(-e)}function GP(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=bb(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function VP(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=js(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Cr(n.teamfile),o=$s(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=_a(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function KP(t,e){return e.explicitRoot!==void 0?Cr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await G(t,r=>mb(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function YP(t,e){return await G(t,r=>lb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:zP(r,e.sender.teamfile,e.receiverTeamfile)}))}function zP(t,e,r){return{teams:[e,r].map(s=>ZP(s,t))}}function ZP(t,e){let r=$s(t,e),n=St(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function QP(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-xa()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await G(t,o=>{let i=Se(),a=i?o.getAgentInflight(e.receiver_teamfile,e.receiver_alias):null,l=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(l.acquired){if(i){let c=a===null?null:e.force?"force":a.started_at<n?"stale":null;ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:c===null?"acquired":"reclaimed",...c===null?{}:{reclaim_reason:c,holder:Na(a)}}))}return{acquired:!0,lease:l.current??s}}if(!l.acquired&&e1(l.current,n)){let c=o.tryAcquireAgentInflight(s,{stale_before:n,reclaim_observed:{sender_teamfile:l.current.sender_teamfile,sender_alias:l.current.sender_alias,started_at:l.current.started_at,holder_pid:l.current.holder_pid}});return c.acquired?(i&&ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"reclaimed",reclaim_reason:l.current.holder_pid===null?"null-holder":"dead-pid",holder:Na(l.current)})),{acquired:!0,lease:c.current??s}):(i&&ot(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:Na(c.current)})),{acquired:!1,current:c.current})}return i&&ot(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:Na(l.current)})),{acquired:!1,current:l.current}})}function Na(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}}function e1(t,e){return t.holder_pid===null?t.started_at<e:!t1(t.holder_pid)}function t1(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"}}async function r1(t,e){try{await G(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)}
1758
+ `)}}function n1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function $a(t,e){let r=Eb(e.message),n=e.response===null?null:Eb(e.response);try{await G(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1759
+ `)}}function Eb(t){return t.length<=yb?{text:t,truncated:!1}:{text:t.slice(0,yb),truncated:!0}}function bb(t){if(t==="0")return 0;let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d) or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function s1(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1760
1760
  `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
1761
1761
  `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
1762
- `)}var HP,gb,yb,Sb=b(()=>{"use strict";Rt();$e();vn();Ut();ss();lb();va();_b();je();oa();Ot();HP={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},gb=256*1024,yb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1762
+ `)}var HP,yb,wb,Tb=b(()=>{"use strict";Rt();$e();vn();Ut();ss();cb();va();gb();je();oa();Ot();HP={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},yb=256*1024,wb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1763
1763
  lmctl chat <teamfile> <alias> "<prompt>"
1764
1764
  lmctl chat <sessionid> "<prompt>" --provider <name>
1765
1765
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -1767,17 +1767,17 @@ ${yb}
1767
1767
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
1768
1768
  [--from <teamfile>:<alias>] [--root <teamfile>] [--force]
1769
1769
 
1770
- Send a prompt to a team member or raw provider session, or answer a paused run.`});var As,xY,Dd=b(()=>{"use strict";As=[{name:"lmctl_chat",description:'Send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. For batch or long-running background jobs, call the CLI directly instead: `lmctl chat <team.lmctl> <alias> "<prompt>"`.',inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],xY=As.length});import{spawn as o1}from"node:child_process";async function kb(t,e,r){let n=a1.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 l1(n.name,s)}function l1(t,e){return t==="lmctl_chat"?c1(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function c1(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=["chat",r,n,e];return s!==void 0&&o.push("--from",s),Se()&&ot(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n,from:s??null})),u1(o,process.cwd())}function u1(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=o1("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=d1(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){Se()&&ot(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
1771
- `).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 d1(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return Tb;let r=Number(e);return!Number.isFinite(r)||r<=0?Tb:r}function Pd(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:i1),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 i1,Tb,a1,Fd=b(()=>{"use strict";Dd();je();i1="http://127.0.0.1:8787",Tb=30*60*1e3,a1=new Map(As.map(t=>[t.name,t]))});async function h1(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Ud({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:f1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:m1,version:p1}}}};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:As.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 kb(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 Ud(t){return`${JSON.stringify(t)}
1772
- `}async function vb(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Ud({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await h1(l,t);c.kind==="response"?t.io.write(Ud(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1770
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});var As,xY,Dd=b(()=>{"use strict";As=[{name:"lmctl_chat",description:'Send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. For batch or long-running background jobs, call the CLI directly instead: `lmctl chat <team.lmctl> <alias> "<prompt>"`.',inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],xY=As.length});import{spawn as o1}from"node:child_process";async function vb(t,e,r){let n=a1.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 l1(n.name,s)}function l1(t,e){return t==="lmctl_chat"?c1(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function c1(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=["chat",r,n,e];return s!==void 0&&o.push("--from",s),Se()&&ot(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n,from:s??null})),u1(o,process.cwd())}function u1(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=o1("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=d1(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){Se()&&ot(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
1771
+ `).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 d1(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return kb;let r=Number(e);return!Number.isFinite(r)||r<=0?kb:r}function Pd(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:i1),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 i1,kb,a1,Fd=b(()=>{"use strict";Dd();je();i1="http://127.0.0.1:8787",kb=30*60*1e3,a1=new Map(As.map(t=>[t.name,t]))});async function h1(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Ud({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:f1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:m1,version:p1}}}};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:As.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 vb(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 Ud(t){return`${JSON.stringify(t)}
1772
+ `}async function Ib(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Ud({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await h1(l,t);c.kind==="response"?t.io.write(Ud(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1773
1773
  `);for(;d!==-1;){let f=n.slice(0,d);n=n.slice(d+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),d=n.indexOf(`
1774
1774
  `)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
1775
- `),a.finally(()=>c(1))})})}var f1,m1,p1,Ib=b(()=>{"use strict";Dd();Fd();f1="2025-06-18",m1="lmctl",p1="0.0.1"});var Nb={};ce(Nb,{runMcp:()=>g1});async function g1(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(_1),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1776
- `),2;Z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??y1(),o=1;try{let i=s===void 0?Pd({getConfig:()=>null},process.env):Pd(s,process.env);return o=await vb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{Z({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function y1(){let t=ue(),e=3;for(let r=1;r<=e;r+=1)try{return pe({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(Z({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&xb(s))w1(50*r);else if(!xb(s))break}}function xb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function w1(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var _1,$b=b(()=>{"use strict";Pe();Fd();Ib();je();Ve();_1=`usage: lmctl mcp
1775
+ `),a.finally(()=>c(1))})})}var f1,m1,p1,xb=b(()=>{"use strict";Dd();Fd();f1="2025-06-18",m1="lmctl",p1="0.0.1"});var $b={};ce($b,{runMcp:()=>g1});async function g1(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(_1),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1776
+ `),2;Z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??y1(),o=1;try{let i=s===void 0?Pd({getConfig:()=>null},process.env):Pd(s,process.env);return o=await Ib({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{Z({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function y1(){let t=ue(),e=3;for(let r=1;r<=e;r+=1)try{return pe({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(Z({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&Nb(s))w1(50*r);else if(!Nb(s))break}}function Nb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function w1(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var _1,jb=b(()=>{"use strict";Pe();Fd();xb();je();Ve();_1=`usage: lmctl mcp
1777
1777
 
1778
1778
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
1779
1779
  local config, then uses stdin/stdout for JSON-RPC frames.
1780
- `});function Rs(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var jb=b(()=>{"use strict"});function E1(t){return{stale_run_minutes:Ls(t,"monitor.stale_run_minutes",Os.stale_run_minutes),old_attention_days:Ls(t,"monitor.old_attention_days",Os.old_attention_days),old_issue_days:Ls(t,"monitor.old_issue_days",Os.old_issue_days),stuck_job_minutes:Ls(t,"monitor.stuck_job_minutes",Os.stuck_job_minutes),dedupe_window_hours:Ls(t,"monitor.dedupe_window_hours",Os.dedupe_window_hours)}}function Ls(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function Ab(t,e={}){let r=e.now??new Date,n=E1(t),s=[];for(let o of b1(t,n,r))s.push(o);for(let o of S1(t,n,r))s.push(o);for(let o of T1(t,n,r))s.push(o);for(let o of k1(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function b1(t,e,r){let n=Rb(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
1780
+ `});function Rs(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var Ab=b(()=>{"use strict"});function E1(t){return{stale_run_minutes:Ls(t,"monitor.stale_run_minutes",Os.stale_run_minutes),old_attention_days:Ls(t,"monitor.old_attention_days",Os.old_attention_days),old_issue_days:Ls(t,"monitor.old_issue_days",Os.old_issue_days),stuck_job_minutes:Ls(t,"monitor.stuck_job_minutes",Os.stuck_job_minutes),dedupe_window_hours:Ls(t,"monitor.dedupe_window_hours",Os.dedupe_window_hours)}}function Ls(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function Rb(t,e={}){let r=e.now??new Date,n=E1(t),s=[];for(let o of b1(t,n,r))s.push(o);for(let o of S1(t,n,r))s.push(o);for(let o of T1(t,n,r))s.push(o);for(let o of k1(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function b1(t,e,r){let n=Ob(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
1781
1781
  SELECT r.id AS id,
1782
1782
  r.job_id AS job_id,
1783
1783
  w.name AS workflow_name,
@@ -1788,12 +1788,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1788
1788
  WHERE r.terminal_state IS NULL
1789
1789
  AND r.paused_at IS NULL
1790
1790
  AND r.started_at <= ?
1791
- `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=Rs(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(ja(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function S1(t,e,r){let n=Rb(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
1791
+ `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=Rs(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(ja(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function S1(t,e,r){let n=Ob(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
1792
1792
  SELECT id, project_id, source, source_ref, status, enqueued_at
1793
1793
  FROM job
1794
1794
  WHERE status NOT IN ('done', 'failed')
1795
1795
  AND enqueued_at <= ?
1796
- `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=Rs(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(ja(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function T1(t,e,r){let n=Ob(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
1796
+ `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=Rs(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(ja(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function T1(t,e,r){let n=Lb(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
1797
1797
  SELECT project_id,
1798
1798
  COUNT(*) AS count,
1799
1799
  (SELECT kind FROM attention a2
@@ -1808,7 +1808,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1808
1808
  AND kind NOT IN ('attentions_overdue', 'issues_overdue')
1809
1809
  AND created_at <= ?
1810
1810
  GROUP BY project_id
1811
- `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=Rs(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(ja(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function k1(t,e,r){let n=Ob(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
1811
+ `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=Rs(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(ja(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function k1(t,e,r){let n=Lb(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
1812
1812
  SELECT project_id,
1813
1813
  COUNT(*) AS count,
1814
1814
  (SELECT title FROM project_issue i2
@@ -1828,18 +1828,18 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1828
1828
  AND payload LIKE ?
1829
1829
  ORDER BY id DESC
1830
1830
  LIMIT 1
1831
- `).get(s,o)??null}function Rb(t,e){return new Date(t.getTime()-e*60*1e3)}function I1(t,e){return new Date(t.getTime()-e*60*60*1e3)}function Ob(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function x1(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Os,Lb=b(()=>{"use strict";jb();Os={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var Mb={};ce(Mb,{renderSummary:()=>Cb,runMonitor:()=>$1});async function $1(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(N1),0;let r=F(t,[],["--json","--quiet"]);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=M(r,"--json"),s=M(r,"--quiet");try{return await G(e,o=>{let i=Ab(o);return n?q(e,i):s||e.stdout.write(`${Cb(i.findings)}
1832
- `),0})}catch(o){return me(e,o)}}function Cb(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${j1(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function j1(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var N1,Db=b(()=>{"use strict";$e();Lb();N1=`usage: lmctl monitor [--json] [--quiet]
1831
+ `).get(s,o)??null}function Ob(t,e){return new Date(t.getTime()-e*60*1e3)}function I1(t,e){return new Date(t.getTime()-e*60*60*1e3)}function Lb(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function x1(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Os,Cb=b(()=>{"use strict";Ab();Os={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var Db={};ce(Db,{renderSummary:()=>Mb,runMonitor:()=>$1});async function $1(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(N1),0;let r=F(t,[],["--json","--quiet"]);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=M(r,"--json"),s=M(r,"--quiet");try{return await G(e,o=>{let i=Rb(o);return n?q(e,i):s||e.stdout.write(`${Mb(i.findings)}
1832
+ `),0})}catch(o){return me(e,o)}}function Mb(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${j1(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function j1(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var N1,Pb=b(()=>{"use strict";$e();Cb();N1=`usage: lmctl monitor [--json] [--quiet]
1833
1833
 
1834
1834
  Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
1835
1835
  issues; emit findings as attentions for the operator/master to handle.
1836
- `});var Pb={};ce(Pb,{runDevice:()=>W1});import{readFileSync as A1}from"node:fs";import{homedir as R1}from"node:os";import{join as O1}from"node:path";import{CognitoIdentityClient as L1,GetIdCommand as C1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as M1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as D1,ListObjectsV2Command as P1,PutObjectCommand as F1,S3Client as U1}from"@aws-sdk/client-s3";async function W1(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(Wd),0;if(r==="init"){let n=Od();return e.stdout.write(`${n.device_id}
1836
+ `});var Fb={};ce(Fb,{runDevice:()=>W1});import{readFileSync as A1}from"node:fs";import{homedir as R1}from"node:os";import{join as O1}from"node:path";import{CognitoIdentityClient as L1,GetIdCommand as C1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as M1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as D1,ListObjectsV2Command as P1,PutObjectCommand as F1,S3Client as U1}from"@aws-sdk/client-s3";async function W1(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(Wd),0;if(r==="init"){let n=Od();return e.stdout.write(`${n.device_id}
1837
1837
  `),0}if(r==="id"){let n=Lr();return n===null?(e.stderr.write(`error: no device id initialized at ${Sa()}; run 'lmctl device init'
1838
1838
  `),1):(e.stdout.write(`${n.device_id}
1839
1839
  `),0)}return r==="login"?await B1(t.slice(1),e):r==="prompt"?await H1(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
1840
1840
  `),1)}async function B1(t,e){let r=q1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1841
1841
  ${Wd}`),2;let n=xs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1842
- `),1;uE({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await pa({region:n.config.region,clientId:n.config.cognitoClientId??ba,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}
1842
+ `),1;dE({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await pa({region:n.config.region,clientId:n.config.cognitoClientId??ba,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}
1843
1843
  `),1}let a=ks(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
1844
1844
  `),1;yd({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Lr()??Od();return e.stdout.write(`logged in as ${r.userId}
1845
1845
  device id: ${l.device_id}
@@ -1847,8 +1847,8 @@ mailbox prefix: ${r.userId}/${l.device_id}/
1847
1847
  access key stored at ${vs()}
1848
1848
  `),0}function q1(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 H1(t,e){let r=J1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1849
1849
  ${Wd}`),2;let n=xs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1850
- `),1;let s=G1();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 X1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=M1({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Lr()?.device_id,u=ks(o)??void 0,d=new Or({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 U1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:P1,GetObjectCommand:D1,PutObjectCommand:F1},selfRole:"browser",onMessage:async()=>{}}),f=Qw({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:Zw,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
1851
- `),0}function J1(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 X1(t){let r=await new L1({region:t.region}).send(new C1({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 G1(t=process.env.LMCTL_TOKEN_PATH??O1(R1(),".lmctl","cli-tokens.json")){try{return JSON.parse(A1(t,"utf8"))}catch{return null}}var Wd,Fb=b(()=>{"use strict";Ld();Nd();Zi();pd();hd();wd();_d();Wd=`usage: lmctl device <id|init>
1850
+ `),1;let s=G1();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 X1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=M1({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Lr()?.device_id,u=ks(o)??void 0,d=new Or({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 U1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:P1,GetObjectCommand:D1,PutObjectCommand:F1},selfRole:"browser",onMessage:async()=>{}}),f=eE({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:Qw,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
1851
+ `),0}function J1(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 X1(t){let r=await new L1({region:t.region}).send(new C1({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 G1(t=process.env.LMCTL_TOKEN_PATH??O1(R1(),".lmctl","cli-tokens.json")){try{return JSON.parse(A1(t,"utf8"))}catch{return null}}var Wd,Ub=b(()=>{"use strict";Ld();Nd();Zi();pd();hd();wd();_d();Wd=`usage: lmctl device <id|init|login|prompt>
1852
1852
  lmctl device login --user-id <sub> --access-key <refreshToken>
1853
1853
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
1854
1854
 
@@ -1858,7 +1858,7 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
1858
1858
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
1859
1859
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
1860
1860
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
1861
- `});var Wb={};ce(Wb,{runTeam:()=>Y1});import{join as V1}from"node:path";async function Y1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(K1),0;try{return await G(e,async s=>{switch(r){case"create":return Z1(n,e,s);case"list":return Q1(n,e,s);case"show":return eF(n,e,s);case"add-member":return tF(n,e,s);case"seed":return Ub(n,e,s,!1);case"refresh":return Ub(n,e,s,!0);case"companion":return nF(n,e,s);case"list-roots":return z1(n,e,s);default:return y(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return me(e,s)}}function z1(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);if(n.positionals.length>0)return y(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?q(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
1861
+ `});var Bb={};ce(Bb,{runTeam:()=>Y1});import{join as V1}from"node:path";async function Y1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(K1),0;try{return await G(e,async s=>{switch(r){case"create":return Z1(n,e,s);case"list":return Q1(n,e,s);case"show":return eF(n,e,s);case"add-member":return tF(n,e,s);case"seed":return Wb(n,e,s,!1);case"refresh":return Wb(n,e,s,!0);case"companion":return nF(n,e,s);case"list-roots":return z1(n,e,s);default:return y(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return me(e,s)}}function z1(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);if(n.positionals.length>0)return y(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?q(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
1862
1862
  `)+(s.length>0?`
1863
1863
  `:"")),0}function Z1(t,e,r){let[n]=t;if(n===void 0)return y(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
1864
1864
  `),0}function Q1(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listTeams();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
@@ -1866,41 +1866,41 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
1866
1866
  `:""}`),0}function eF(t,e,r){let n=F(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(M(n,"--json"))q(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
1867
1867
  `);for(let a of i)e.stdout.write(`- ${a.alias} ${Ie(a)} ${a.sessionid??"(unseeded)"}
1868
1868
  `)}return 0}function tF(t,e,r){let n=F(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=N(n,"--alias"),a=N(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:N(n,"--model")??null,role:N(n,"--role")??"agent",sessiondir:N(n,"--sessiondir")??V1(pr(),"sessions",o.name,i)});return M(n,"--json")?q(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1869
- `),0}async function Ub(t,e,r,n){let s=F(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=N(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=rF(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=Qg(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))Go(f,r),Ko(f);let u=[],d=!1;for(let f of l){let m=await Kr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1869
+ `),0}async function Wb(t,e,r,n){let s=F(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=N(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=rF(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=ey(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))Go(f,r),Ko(f);let u=[],d=!1;for(let f of l){let m=await Kr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1870
1870
 
1871
1871
  ${Qr}`:Qr;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=en(Ie(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
1872
1872
  ${_}
1873
1873
  `);try{await ui({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
1874
1874
  `)}}}return M(s,"--json")?q(e,u):e.stdout.write(`seeded ${u.length} member(s)
1875
1875
  `),d?1:0}function rF(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function nF(t,e,r){let n=F(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=N(n,"--interpreter"),a=N(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return 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)
1876
- `),0}var K1,Bb=b(()=>{"use strict";Ve();$o();Qn();Ec();Pe();tn();Pc();Bi();$e();bc();K1=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1876
+ `),0}var K1,qb=b(()=>{"use strict";Ve();$o();Qn();Ec();Pe();tn();Pc();Bi();$e();bc();K1=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1877
1877
 
1878
1878
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
1879
1879
  refresh to create/update native provider sessions for team members.
1880
1880
 
1881
1881
  Root team registry:
1882
1882
  list-roots [--json] List .lmctl root teams registered by lmctl seed.
1883
- `});var Kb={};ce(Kb,{applyMaxBytes:()=>Aa,renderMessage:()=>Gb,runTail:()=>lF});async function lF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${aF}
1884
- `),0;let r=F(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=N(r,"--lines"),s=N(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?oF: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=M(r,"--watch"),a=N(r,"--watch-interval"),l=a===void 0?iF: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=N(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(N(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(N(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 G(e,async p=>cF(e,p,m,o,i,l))}catch(p){return me(e,p)}}let u=ur(sF,{target:r.positionals[0],alias:r.positionals[1],flags:{session:N(r,"--session"),provider:N(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=Re(u.teamfile)}catch(h){return y(e,`tail: ${h instanceof Error?h.message:String(h)}`)}let p=St(m);if(p===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let h=Wt(u.teamfile,p.alias);d={provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir}}catch(h){return h instanceof ge?y(e,h.message):me(e,h)}}else try{let m=Wt(u.teamfile,u.alias);d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ge?y(e,m.message):me(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await zo(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 qb(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await qb(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
1885
- `)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function qb(t,e,r,n,s){let o;try{o=await Nr(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
1883
+ `});var Yb={};ce(Yb,{applyMaxBytes:()=>Aa,renderMessage:()=>Vb,runTail:()=>lF});async function lF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${aF}
1884
+ `),0;let r=F(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=N(r,"--lines"),s=N(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?oF: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=M(r,"--watch"),a=N(r,"--watch-interval"),l=a===void 0?iF: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=N(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(N(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(N(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 G(e,async p=>cF(e,p,m,o,i,l))}catch(p){return me(e,p)}}let u=ur(sF,{target:r.positionals[0],alias:r.positionals[1],flags:{session:N(r,"--session"),provider:N(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=Re(u.teamfile)}catch(h){return y(e,`tail: ${h instanceof Error?h.message:String(h)}`)}let p=St(m);if(p===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let h=Wt(u.teamfile,p.alias);d={provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir}}catch(h){return h instanceof ge?y(e,h.message):me(e,h)}}else try{let m=Wt(u.teamfile,u.alias);d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ge?y(e,m.message):me(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await zo(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 Hb(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await Hb(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
1885
+ `)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function Hb(t,e,r,n,s){let o;try{o=await Nr(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
1886
1886
  `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
1887
- `),-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+=`${Gb(i[c])}
1888
- `;return t.stdout.write(n.kind==="bytes"?Aa(l,n.maxBytes):l),i.length-1}function Gb(t){let e=Vb(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
1887
+ `),-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+=`${Vb(i[c])}
1888
+ `;return t.stdout.write(n.kind==="bytes"?Aa(l,n.maxBytes):l),i.length-1}function Vb(t){let e=Kb(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
1889
1889
  `).replace(/\r/g,`
1890
1890
  `).split(`
1891
1891
  `),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
1892
1892
  ${i.map(a=>` ${a}`).join(`
1893
- `)}`}async function cF(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=>`${Xb(d)}
1894
- `).join("");t.stdout.write(n.kind==="bytes"?Aa(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+=`${Xb(_)}
1893
+ `)}`}async function cF(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=>`${Gb(d)}
1894
+ `).join("");t.stdout.write(n.kind==="bytes"?Aa(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+=`${Gb(_)}
1895
1895
  `,u=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?Aa(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
1896
- `)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Aa(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(Hb,"utf8");if(n>=e)return Jb(t,e);let s=e-n,o=Jb(t,s);return`${Hb}${o}`}function Jb(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 Xb(t){let e=Vb(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 Vb(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var sF,oF,iF,aF,Hb,Yb=b(()=>{"use strict";tn();$e();vn();Ut();sF={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},oF=4096,iF=2,aF=`usage: lmctl tail [target] [alias]
1896
+ `)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Aa(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(Jb,"utf8");if(n>=e)return Xb(t,e);let s=e-n,o=Xb(t,s);return`${Jb}${o}`}function Xb(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 Gb(t){let e=Kb(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 Kb(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 sF,oF,iF,aF,Jb,zb=b(()=>{"use strict";tn();$e();vn();Ut();sF={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},oF=4096,iF=2,aF=`usage: lmctl tail [target] [alias]
1897
1897
  lmctl tail --session <id> [--provider <name>]
1898
1898
  lmctl tail --run <id>
1899
1899
  [--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
1900
1900
 
1901
1901
  Print or watch provider session messages, or follow a managed run timeline.
1902
- --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;Hb=`\u2026 [truncated older output \u2014 raise with --max-bytes]
1903
- `});var zb={};ce(zb,{runInfo:()=>mF});function fF(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function mF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${dF}
1902
+ --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;Jb=`\u2026 [truncated older output \u2014 raise with --max-bytes]
1903
+ `});var Zb={};ce(Zb,{runInfo:()=>mF});function fF(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function mF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${dF}
1904
1904
  `),0;let r=F(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=M(r,"--json"),s=N(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(N(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 G(e,async u=>hF(e,u,c,n))}catch(u){return me(e,u)}}let o=ur(uF,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:N(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)return _F(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Wt(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?y(e,c.message):me(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await zo(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 pF(e,i,a,l,n)}async function pF(t,e,r,n,s){let o;try{o=await Nr(r,e)}catch(a){return y(t,`health: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return y(t,`health: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(q(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
1905
1905
  `),t.stdout.write(` Provider: ${o.provider}
1906
1906
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
@@ -1925,54 +1925,54 @@ Print or watch provider session messages, or follow a managed run timeline.
1925
1925
  `),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
1926
1926
  `);for(let u of s){let d=u.lastContext!==void 0?fF(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${Bd(u.messageCount).padStart(6)} ${d.padStart(12)}
1927
1927
  `)}return t.stdout.write(` ${"TOTAL".padEnd(i)} ${"".padEnd(a)}${"".padEnd(l)}${"".padEnd(c)}${Bd(o).padStart(6)}
1928
- `),0}function Bd(t){return t==null?"unknown":String(t)}var uF,dF,Zb=b(()=>{"use strict";tn();$e();vn();Ut();Ot();uF={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},dF=`usage: lmctl health [target] [alias]
1928
+ `),0}function Bd(t){return t==null?"unknown":String(t)}var uF,dF,Qb=b(()=>{"use strict";tn();$e();vn();Ut();Ot();uF={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},dF=`usage: lmctl health [target] [alias]
1929
1929
  lmctl health <teamfile> # team rollup
1930
1930
  lmctl health <sessionid> [--provider <name>]
1931
1931
  [--json]
1932
1932
 
1933
- Show provider session details, team rollups, or managed run state/token totals.`});var eS={};ce(eS,{runLs:()=>EF});import{resolve as qd}from"node:path";function wF(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function EF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${gF}
1934
- `),0;let r=F(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=N(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(N(r,_)!==void 0)return y(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return y(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return y(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=N(r,"--limit"),h=yF;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return y(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>Qb)return y(e,`--limit ${_} exceeds maximum (${Qb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await G(e,async _=>bF(e,_,h,g))}catch(_){return me(e,_)}}let i=SF(n,s);if("error"in i)return y(e,i.error);let a=i.format,l=N(r,"--provider"),c=N(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await ec(l?{provider:l}:{})}catch(p){return y(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?qd(c):qd(process.cwd());f=f.filter(h=>{let g=qd(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=wF(f),a==="json")return q(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1933
+ Show provider session details, team rollups, or managed run state/token totals.`});var tS={};ce(tS,{runLs:()=>EF});import{resolve as qd}from"node:path";function wF(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function EF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${gF}
1934
+ `),0;let r=F(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=N(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(N(r,_)!==void 0)return y(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return y(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return y(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=N(r,"--limit"),h=yF;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return y(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>eS)return y(e,`--limit ${_} exceeds maximum (${eS})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await G(e,async _=>bF(e,_,h,g))}catch(_){return me(e,_)}}let i=SF(n,s);if("error"in i)return y(e,i.error);let a=i.format,l=N(r,"--provider"),c=N(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await ec(l?{provider:l}:{})}catch(p){return y(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?qd(c):qd(process.cwd());f=f.filter(h=>{let g=qd(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=wF(f),a==="json")return q(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1935
1935
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
1936
1936
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
1937
1937
  `);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
1938
1938
  `)}return 0}async function bF(t,e,r,n){let s=Yr(e,{limit:r});if(n==="json")return q(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
1939
1939
  `),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
1940
1940
  `);for(let o of s){let i=(o.current_state??"").padEnd(20),a=(o.terminal_state??"").padEnd(20);t.stdout.write(`${String(o.id).padEnd(8)} ${String(o.workflow_id).padEnd(8)} ${String(o.team_id).padEnd(8)} ${i} ${a} ${o.started_at}
1941
- `)}return 0}function SF(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var gF,yF,Qb,tS=b(()=>{"use strict";Rt();$e();Ot();gF=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
1941
+ `)}return 0}function SF(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var gF,yF,eS,rS=b(()=>{"use strict";Rt();$e();Ot();gF=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
1942
1942
  [--recursive] [--all] [--format table|teamfile|json] [--json]
1943
1943
  lmctl ls --runs [--limit N] [--format table|json] [--json]
1944
1944
 
1945
- List native provider sessions in scope, or list recent managed runs with --runs.`,yF=50,Qb=500});import{existsSync as nS,readFileSync as sS}from"node:fs";import{homedir as TF}from"node:os";import{dirname as kF,resolve as oS}from"node:path";import{fileURLToPath as vF}from"node:url";function Xd(t,e={}){let r=[],n=NF(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=RF(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${rS(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Oa??"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: ${rS(i)}`)}return r}function NF(t){if(!t&&Cs)return Cs;let e=new Map,r,n=t??$F();if(!nS(n))return r=`${n} not found`,t||Hd(e),t||(Cs=e),t||(Oa=r),e;let s;try{s=sS(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Hd(e),t||(Cs=e),t||(Oa=r),e}for(let[o,i]of Object.entries(IF)){let a=jF(s,i),l=AF(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Hd(e),t||(Cs=e),t||(Oa=r),e}function $F(){let t=kF(vF(import.meta.url));return oS(t,"..","..","..","durable-memory","model_selection.md")}function Hd(t){for(let[e,r]of Object.entries(xF))t.set(e,r)}function jF(t,e){let n=new RegExp(`^## ${LF(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 AF(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 RF(t){let e=t??oS(TF(),".config","opencode","opencode.json"),r=Nm();if(!nS(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(sS(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...OF(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function OF(t){if(!Jd(t))return[];let e=Ra(t.provider)??Ra(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Jd(s))continue;let o=Ra(s.models)??Ra(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Ra(t){return Jd(t)?t:null}function Jd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function rS(t){return t.length>0?t.join(", "):"(none)"}function LF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var IF,xF,Cs,Oa,iS=b(()=>{"use strict";Sl();IF={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},xF={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},Cs=null});var Us={};ce(Us,{DEPRECATED_CONNECT_WARNING:()=>fS,GEMINI_PROVIDER_NOTICE:()=>dS,_setLintSessiondirFsOpsForTests:()=>KF,_setSkillFileOpsForTests:()=>VF,_setTeamfileSeedForTests:()=>GF,buildRootTeamRegistrationRow:()=>_S,registerRootTeam:()=>gS,runHire:()=>tU,runLint:()=>eU,runRefresh:()=>rU,runSeed:()=>pS,sha256Text:()=>hS,skillNameFromSource:()=>tf,skillNameFromUrl:()=>hU});import{createHash as CF,randomUUID as MF}from"node:crypto";import{accessSync as DF,constants as aS,existsSync as PF,mkdirSync as FF,readFileSync as Ma,realpathSync as Kd,renameSync as UF,statSync as WF,unlinkSync as BF,writeFileSync as Ps}from"node:fs";import{basename as qF,dirname as Nn,isAbsolute as lS,join as Yd,resolve as dr}from"node:path";function GF(t){mS=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Rt(),rc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function VF(t){Ds=t===null?zd:{...zd,...t}}function KF(t){Dr=t===null?Zd:{...Zd,...t}}function YF(t,e){let r=Nn(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=dr(i);if(n.has(a))continue;let l=zF(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 zF(t){try{if(Dr.existsSync(t)){if(!Dr.statSync(t).isDirectory())return"ENOTDIR";Dr.accessSync(t,aS.W_OK);return}let e=ZF(t);if(e===void 0)return;if(!Dr.statSync(e).isDirectory())return"ENOTDIR";Dr.accessSync(e,aS.W_OK);return}catch(e){return QF(e)??"permission check failed"}}function ZF(t){let e=t;for(;;){try{if(Dr.existsSync(e))return e}catch{return}let r=Nn(e);if(r===e)return;e=r}}function QF(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 eU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(JF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1946
- `),2;let r=t[0],n;try{n=Re(r)}catch(i){return Be(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=kd(n,Nn(dr(r))),o=Xd(n.members);o.push(...Tl(n.members,Nn(dr(r)))),o.push(...YF(n.members,dr(r))),n.deprecatedConnectLines.length>0&&o.push(fS.replace("%s",n.deprecatedConnectLines.join(", ")));for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1945
+ List native provider sessions in scope, or list recent managed runs with --runs.`,yF=50,eS=500});import{existsSync as sS,readFileSync as oS}from"node:fs";import{homedir as TF}from"node:os";import{dirname as kF,resolve as iS}from"node:path";import{fileURLToPath as vF}from"node:url";function Xd(t,e={}){let r=[],n=NF(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=RF(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${nS(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Oa??"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: ${nS(i)}`)}return r}function NF(t){if(!t&&Cs)return Cs;let e=new Map,r,n=t??$F();if(!sS(n))return r=`${n} not found`,t||Hd(e),t||(Cs=e),t||(Oa=r),e;let s;try{s=oS(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Hd(e),t||(Cs=e),t||(Oa=r),e}for(let[o,i]of Object.entries(IF)){let a=jF(s,i),l=AF(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Hd(e),t||(Cs=e),t||(Oa=r),e}function $F(){let t=kF(vF(import.meta.url));return iS(t,"..","..","..","durable-memory","model_selection.md")}function Hd(t){for(let[e,r]of Object.entries(xF))t.set(e,r)}function jF(t,e){let n=new RegExp(`^## ${LF(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 AF(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 RF(t){let e=t??iS(TF(),".config","opencode","opencode.json"),r=$m();if(!sS(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(oS(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...OF(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function OF(t){if(!Jd(t))return[];let e=Ra(t.provider)??Ra(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Jd(s))continue;let o=Ra(s.models)??Ra(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Ra(t){return Jd(t)?t:null}function Jd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function nS(t){return t.length>0?t.join(", "):"(none)"}function LF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var IF,xF,Cs,Oa,aS=b(()=>{"use strict";Sl();IF={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},xF={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},Cs=null});var Us={};ce(Us,{DEPRECATED_CONNECT_WARNING:()=>mS,GEMINI_PROVIDER_NOTICE:()=>fS,_setLintSessiondirFsOpsForTests:()=>KF,_setSkillFileOpsForTests:()=>VF,_setTeamfileSeedForTests:()=>GF,buildRootTeamRegistrationRow:()=>gS,registerRootTeam:()=>yS,runHire:()=>tU,runLint:()=>eU,runRefresh:()=>rU,runSeed:()=>hS,sha256Text:()=>_S,skillNameFromSource:()=>tf,skillNameFromUrl:()=>hU});import{createHash as CF,randomUUID as MF}from"node:crypto";import{accessSync as DF,constants as lS,existsSync as PF,mkdirSync as FF,readFileSync as Ma,realpathSync as Kd,renameSync as UF,statSync as WF,unlinkSync as BF,writeFileSync as Ps}from"node:fs";import{basename as qF,dirname as Nn,isAbsolute as cS,join as Yd,resolve as dr}from"node:path";function GF(t){pS=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Rt(),rc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function VF(t){Ds=t===null?zd:{...zd,...t}}function KF(t){Dr=t===null?Zd:{...Zd,...t}}function YF(t,e){let r=Nn(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=dr(i);if(n.has(a))continue;let l=zF(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 zF(t){try{if(Dr.existsSync(t)){if(!Dr.statSync(t).isDirectory())return"ENOTDIR";Dr.accessSync(t,lS.W_OK);return}let e=ZF(t);if(e===void 0)return;if(!Dr.statSync(e).isDirectory())return"ENOTDIR";Dr.accessSync(e,lS.W_OK);return}catch(e){return QF(e)??"permission check failed"}}function ZF(t){let e=t;for(;;){try{if(Dr.existsSync(e))return e}catch{return}let r=Nn(e);if(r===e)return;e=r}}function QF(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 eU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(JF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1946
+ `),2;let r=t[0],n;try{n=Re(r)}catch(i){return Be(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=kd(n,Nn(dr(r))),o=Xd(n.members);o.push(...Tl(n.members,Nn(dr(r)))),o.push(...YF(n.members,dr(r))),n.deprecatedConnectLines.length>0&&o.push(mS.replace("%s",n.deprecatedConnectLines.join(", ")));for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1947
1947
  `);for(let i of n.members)ef([i],e),i.session!==void 0&&i.session.length>0&&i.sessiondir===void 0&&o.push(`${i.alias}: has a sessionid but no sessiondir \u2014 seed will fail; remove the sessionid to re-seed, or set the correct sessiondir.`),i.session!==void 0&&i.session.length<Ms&&o.push(`${i.alias}: sessionid is shorter than ${Ms} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1948
- `);return await G(e,i=>{rb(r,i,a=>e.stderr.write(`${a}
1948
+ `);return await G(e,i=>{nb(r,i,a=>e.stderr.write(`${a}
1949
1949
  `))}),s.length>0?1:(e.stdout.write(`ok
1950
- `),0)}async function pS(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(XF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
1950
+ `),0)}async function hS(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(XF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
1951
1951
  `),2;let r=t[0],n=dr(r),s;try{s=Kd(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let o=Nn(n),i;try{i=Re(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let a=kd(i,o);if(a.length>0){ef(i.members,e);for(let E of a)e.stderr.write(`error: ${E.field}: ${E.message}
1952
1952
  `);return 1}ef(i.members,e);for(let E of Xd(i.members))e.stderr.write(`warning: ${E}
1953
1953
  `);for(let E of Tl(i.members,o))e.stderr.write(`warning: ${E}
1954
1954
  `);let l=i.members.find(E=>E.teamfile===void 0&&E.session!==void 0&&E.session.length>0&&E.sessiondir===void 0);if(l!==void 0)return e.stderr.write(`error: ${l.alias}: has a sessionid but no sessiondir \u2014 the session's location is unknown. Remove the sessionid to re-seed fresh, or set the correct sessiondir.
1955
1955
  `),1;let c=await dU(i.skillUrls,o,e);if(c!==0)return c;let u=Ma(n,"utf8"),d=u.split(`
1956
- `),f=sU(d),m=0,p=i.members.filter(E=>E.teamfile!==void 0?!1:E.session===void 0||E.session.length<Ms);for(let E of p)if(!wS(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
1956
+ `),f=sU(d),m=0,p=i.members.filter(E=>E.teamfile!==void 0?!1:E.session===void 0||E.session.length<Ms);for(let E of p)if(!ES(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
1957
1957
  `),1;let h=i.members.find(E=>E.alias.toLowerCase()==="lead");if(h!==void 0){Hr("lmctl","lmctl_chat",{warn:$=>e.stderr.write(`${$}
1958
1958
  `)});let E=h.sessiondir??o,k=Rc(h.provider,E);k.error!==void 0?e.stderr.write(`warning: MCP bridge install failed: ${k.error}
1959
1959
  `):k.changed&&e.stdout.write(k.scope==="copilot-user"?`copilot MCP bridge installed in ${k.path}
1960
1960
  `:`.mcp.json installed in ${E}
1961
1961
  `)}for(let E of i.members){if(E.teamfile!==void 0)continue;if(E.session!==void 0&&E.session.length>=Ms){e.stderr.write(`warning: ${E.alias}: existing sessionid preserved; skipping
1962
- `);continue}let k=E.sessiondir??o,$=await mS({provider:E.provider,cwd:k,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:nU(n,u,i.members)}:{}});if($.error!==void 0||$.sessionId===void 0||$.sessionId.length<Ms)return e.stderr.write(`error: ${E.alias}: seed failed${$.error!==void 0?`: ${$.error}`:"; provider did not report a sessionid"}
1962
+ `);continue}let k=E.sessiondir??o,$=await pS({provider:E.provider,cwd:k,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:nU(n,u,i.members)}:{}});if($.error!==void 0||$.sessionId===void 0||$.sessionId.length<Ms)return e.stderr.write(`error: ${E.alias}: seed failed${$.error!==void 0?`: ${$.error}`:"; provider did not report a sessionid"}
1963
1963
  `),1;let x=f.get(E.alias.toLowerCase());if(x===void 0)return e.stderr.write(`error: ${E.alias}: could not find matching _MEMBER_ line to update
1964
- `),1;let A=cS(d[x],"sessionid",$.sessionId);E.sessiondir===void 0&&(A=cS(A,"sessiondir",o)),d[x]=A,m+=1,Ps(n,d.join(`
1964
+ `),1;let A=uS(d[x],"sessionid",$.sessionId);E.sessiondir===void 0&&(A=uS(A,"sessiondir",o)),d[x]=A,m+=1,Ps(n,d.join(`
1965
1965
  `),"utf8"),e.stdout.write(`${E.alias}: seeded ${$.sessionId}
1966
1966
  `)}let g=d.join(`
1967
1967
  `),_=uU(g,Kd(n));_!==g&&Ps(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
1968
- `);let T=new Date().toISOString();return await G(e,E=>{gS(E,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function tU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Ca),0;let r=F(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Vd(e,r.error,Ca);if(r.positionals.length!==2)return Vd(e,"expected <teamfile.lmctl> and <alias>",Ca);let[n,s]=r.positionals;if(!aU(s))return Be(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Be(e,"hire only applies to non-Lead members");let o=N(r,"--provider");if(o===void 0)return Vd(e,"missing value for --provider",Ca);if(!wS(o))return Be(e,`invalid provider "${o}"`);let i=dr(n),a;try{a=Ma(i,"utf8")}catch(d){return Be(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(iU(a,s))return Be(e,`${s}: alias already exists in ${i}`);let l=N(r,"--sessiondir"),c=[`_MEMBER_ alias=${Qd(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Qd(l)}`]].join(" "),u=cU(a,c);return Ps(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
1968
+ `);let T=new Date().toISOString();return await G(e,E=>{yS(E,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function tU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Ca),0;let r=F(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Vd(e,r.error,Ca);if(r.positionals.length!==2)return Vd(e,"expected <teamfile.lmctl> and <alias>",Ca);let[n,s]=r.positionals;if(!aU(s))return Be(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Be(e,"hire only applies to non-Lead members");let o=N(r,"--provider");if(o===void 0)return Vd(e,"missing value for --provider",Ca);if(!ES(o))return Be(e,`invalid provider "${o}"`);let i=dr(n),a;try{a=Ma(i,"utf8")}catch(d){return Be(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(iU(a,s))return Be(e,`${s}: alias already exists in ${i}`);let l=N(r,"--sessiondir"),c=[`_MEMBER_ alias=${Qd(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Qd(l)}`]].join(" "),u=cU(a,c);return Ps(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
1969
1969
  `),e.stdout.write(`Run: lmctl seed ${i}
1970
1970
  `),0}async function rU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Gd),0;let r,n;if(t.length===1){let d=js(t[0]);if(d===null)return e.stderr.write(Gd),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Gd),2;let s=dr(r),o;try{o=Ma(s,"utf8")}catch(d){return Be(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
1971
1971
  `),a=oU(i,n);if(a===void 0)return Be(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(Fs(l,"teamfile")!==void 0)return Be(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[_l],u=Fs(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Be(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=lU(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),Ps(s,i.join(`
1972
- `),"utf8"),pS([s],e))}function hS(t){return CF("sha256").update(t).digest("hex")}function _S(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:hS(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function gS(t,e){let r=_S(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function nU(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
1972
+ `),"utf8"),hS([s],e))}function _S(t){return CF("sha256").update(t).digest("hex")}function gS(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:_S(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function yS(t,e){let r=gS(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function nU(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
1973
1973
  `):"- (no non-Lead members)";return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Use only the lmctl_chat MCP tool for member pings and delegation.","Delegation is an ACTION, not a plan: to hand a member a task, actually call lmctl_chat.","On some providers the tool appears only after tool search; if so, 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(o=>o.alias.toLowerCase()!=="lead").map(o=>`lmctl_chat(team="${t}", alias="${o.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${t}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${t}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These are shell commands. Delegation still uses the lmctl_chat MCP tool.)","","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
1974
1974
  `)}function sU(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=Fs(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function oU(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)&&Fs(s,"alias")?.toLowerCase()===r)return n}}function iU(t,e){for(let r of t.split(`
1975
- `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Fs(r,"alias")===e)return!0;return!1}function aU(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function Fs(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function cS(t,e,r){let n=`${e}=${Qd(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function lU(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Qd(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function cU(t,e){let r=t.split(`
1975
+ `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Fs(r,"alias")===e)return!0;return!1}function aU(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function Fs(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function uS(t,e,r){let n=`${e}=${Qd(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function lU(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Qd(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function cU(t,e){let r=t.split(`
1976
1976
  `),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*(?:_MEMBER_|_CONNECT_|_SKILL_)(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,e),r.join(`
1977
1977
  `);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
1978
1978
  `),i=r.slice(s).join(`
@@ -1985,16 +1985,16 @@ ${i}`:`
1985
1985
  ${o}`:`${r}
1986
1986
  `:t.length>0?`${r}
1987
1987
  ${t}`:`${r}
1988
- `}async function dU(t,e,r){if(t.length===0)return 0;let n=Yd(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await yS(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return Be(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
1988
+ `}async function dU(t,e,r){if(t.length===0)return 0;let n=Yd(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await wS(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return Be(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
1989
1989
  `);for(let i of o){let a=`<!-- lmctl _SKILL_ source: ${i.source} -->
1990
1990
  ${i.body}${i.body.endsWith(`
1991
1991
  `)?"":`
1992
1992
  `}`;try{Ds.mkdirSync(n,{recursive:!0}),pU(n,i.name,a)}catch(l){return Be(r,`skill ${i.source}: ${l instanceof Error?l.message:String(l)}`)}r.stdout.write(`skill ${i.name}: wrote durable-memory/skills/${i.name}.md
1993
- `)}return 0}async function yS(t,e,r,n,s){if(s>La)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${La}`);let o=await fU(t,e),i=mU(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:tf(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=La)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${La}`);for(let a of i)await yS(a,o.base,r,n,s+1)}async function fU(t,e){if(e.kind==="https"){if(Ht(t)||!lS(t)){let o=uS(t,e),i;try{i=await yr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:xn(o),source:xn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(Ht(t)){let o=uS(t,e),i;try{i=await yr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:xn(o),source:xn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=lS(t)?t:dr(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Kd(r),s=Ma(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:Nn(n)},text:s}}function uS(t,e){if(Ht(t)){if(!ht(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return xn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!ht(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return xn(r)}function mU(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(Ht(l)&&!ht(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function xn(t){return new URL(t).href}function pU(t,e,r){let n=Yd(t,`${e}.md`),s=Yd(t,`${e}.${process.pid}.${MF().slice(0,8)}.tmp`);try{Ds.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Ds.renameSync(s,n)}catch(o){try{Ds.unlinkSync(s)}catch{}throw o}}function hU(t){return tf(t)}function tf(t){let e=ht(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(qF(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,HF).replace(/-+$/gu,"")||"skill"}function wS(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Be(t,e){return t.stderr.write(`error: ${e}
1993
+ `)}return 0}async function wS(t,e,r,n,s){if(s>La)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${La}`);let o=await fU(t,e),i=mU(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:tf(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=La)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${La}`);for(let a of i)await wS(a,o.base,r,n,s+1)}async function fU(t,e){if(e.kind==="https"){if(Ht(t)||!cS(t)){let o=dS(t,e),i;try{i=await yr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:xn(o),source:xn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(Ht(t)){let o=dS(t,e),i;try{i=await yr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:xn(o),source:xn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=cS(t)?t:dr(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Kd(r),s=Ma(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:Nn(n)},text:s}}function dS(t,e){if(Ht(t)){if(!ht(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return xn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!ht(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return xn(r)}function mU(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(Ht(l)&&!ht(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function xn(t){return new URL(t).href}function pU(t,e,r){let n=Yd(t,`${e}.md`),s=Yd(t,`${e}.${process.pid}.${MF().slice(0,8)}.tmp`);try{Ds.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Ds.renameSync(s,n)}catch(o){try{Ds.unlinkSync(s)}catch{}throw o}}function hU(t){return tf(t)}function tf(t){let e=ht(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(qF(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,HF).replace(/-+$/gu,"")||"skill"}function ES(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Be(t,e){return t.stderr.write(`error: ${e}
1994
1994
  `),1}function Vd(t,e,r){return t.stderr.write(`error: ${e}
1995
1995
  ${r}`),2}function ef(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_
1996
- `),r.provider==="gemini"&&e.stderr.write(`${dS.replace("%s",r.alias)}
1997
- `)}var Ms,HF,La,JF,XF,Ca,Gd,dS,fS,zd,Zd,mS,Ds,Dr,Ws=b(()=>{"use strict";Ut();iS();fo();Xt();ao();$e();va();Ys();ss();vn();Ms=5,HF=80,La=16,JF=`usage: lmctl lint <teamfile.lmctl>
1996
+ `),r.provider==="gemini"&&e.stderr.write(`${fS.replace("%s",r.alias)}
1997
+ `)}var Ms,HF,La,JF,XF,Ca,Gd,fS,mS,zd,Zd,pS,Ds,Dr,Ws=b(()=>{"use strict";Ut();aS();fo();Xt();ao();$e();va();Ys();ss();vn();Ms=5,HF=80,La=16,JF=`usage: lmctl lint <teamfile.lmctl>
1998
1998
 
1999
1999
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2000
2000
  `,XF=`usage: lmctl seed <teamfile.lmctl>
@@ -2014,32 +2014,32 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
2014
2014
  re-seed.
2015
2015
  A member cannot refresh its own running session; run the refresh from a
2016
2016
  meta-Lead or operator shell outside that sessiondir.
2017
- `,dS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',fS="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",zd={mkdirSync:FF,writeFileSync:Ps,renameSync:UF,unlinkSync:BF},Zd={existsSync:PF,statSync:WF,accessSync:DF},mS=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Rt(),rc)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Ds=zd,Dr=Zd});var kS={};ce(kS,{runClone:()=>TU});import{existsSync as rf,mkdirSync as _U,readFileSync as gU,readdirSync as yU,statSync as SS,writeFileSync as wU}from"node:fs";import{basename as ES,dirname as EU,extname as bU,join as TS,resolve as bS}from"node:path";async function TU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(SU),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
2018
- `),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=bS(r);if(!rf(c))throw new Error(`source not found: ${r}`);let d=SS(c).isDirectory()?kU(c):c;s=gU(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2019
- `),1}let i=bS(n),a=vU(i,o,n);if(rf(a))return e.stderr.write(`error: ${a} already exists.
2017
+ `,fS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',mS="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",zd={mkdirSync:FF,writeFileSync:Ps,renameSync:UF,unlinkSync:BF},Zd={existsSync:PF,statSync:WF,accessSync:DF},pS=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Rt(),rc)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Ds=zd,Dr=Zd});var vS={};ce(vS,{runClone:()=>TU});import{existsSync as rf,mkdirSync as _U,readFileSync as gU,readdirSync as yU,statSync as TS,writeFileSync as wU}from"node:fs";import{basename as bS,dirname as EU,extname as bU,join as kS,resolve as SS}from"node:path";async function TU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(SU),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
2018
+ `),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=SS(r);if(!rf(c))throw new Error(`source not found: ${r}`);let d=TS(c).isDirectory()?kU(c):c;s=gU(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2019
+ `),1}let i=SS(n),a=vU(i,o,n);if(rf(a))return e.stderr.write(`error: ${a} already exists.
2020
2020
  `),1;let l=xU(IU(s));return _U(EU(a),{recursive:!0}),wU(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
2021
2021
  `),e.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
2022
2022
  `),e.stdout.write(`After editing, run: lmctl lint ${a}
2023
2023
  `),e.stdout.write(`Then run: lmctl seed ${a}
2024
- `),0}function kU(t){let e=yU(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return TS(t,e[0])}function vU(t,e,r){if(r.endsWith("/")||rf(t)&&SS(t).isDirectory()){let n=ES(e).endsWith(".lmctl")?ES(e):"team.lmctl";return TS(t,n)}return bU(t)?t:`${t}.lmctl`}function IU(t){return t.split(`
2024
+ `),0}function kU(t){let e=yU(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return kS(t,e[0])}function vU(t,e,r){if(r.endsWith("/")||rf(t)&&TS(t).isDirectory()){let n=bS(e).endsWith(".lmctl")?bS(e):"team.lmctl";return kS(t,n)}return bU(t)?t:`${t}.lmctl`}function IU(t){return t.split(`
2025
2025
  `).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
2026
2026
  `)}function xU(t){return t.split(`
2027
2027
  `).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
2028
- `)}var SU,vS=b(()=>{"use strict";SU=`usage: lmctl clone <source> <dest>
2028
+ `)}var SU,IS=b(()=>{"use strict";SU=`usage: lmctl clone <source> <dest>
2029
2029
 
2030
2030
  Copy a teamfile and strip its session ids, producing a static editable template.
2031
2031
 
2032
2032
  Examples:
2033
2033
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
2034
- `});var NS={};ce(NS,{runPlan:()=>LU});import{existsSync as NU,mkdirSync as $U,writeFileSync as jU}from"node:fs";import{basename as IS,extname as xS,join as AU,resolve as RU}from"node:path";async function LU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(OU),0;let r=F(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
2034
+ `});var $S={};ce($S,{runPlan:()=>LU});import{existsSync as NU,mkdirSync as $U,writeFileSync as jU}from"node:fs";import{basename as xS,extname as NS,join as AU,resolve as RU}from"node:path";async function LU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(OU),0;let r=F(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
2035
2035
  `),e.stderr.write(`usage: lmctl plan [options] <directory>
2036
2036
  `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
2037
- `),2;let n=RU(r.positionals[0]);$U(n,{recursive:!0});let s=N(r,"--team")??IS(n),o=N(r,"--provider")??"claude",i=AU(n,CU(s));return NU(i)?(e.stderr.write(`error: ${i} already exists.
2037
+ `),2;let n=RU(r.positionals[0]);$U(n,{recursive:!0});let s=N(r,"--team")??xS(n),o=N(r,"--provider")??"claude",i=AU(n,CU(s));return NU(i)?(e.stderr.write(`error: ${i} already exists.
2038
2038
  `),1):(jU(i,DU({teamName:MU(s),workdir:n,teamfilePath:i,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
2039
2039
  `),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
2040
2040
  `),e.stdout.write(`After editing, run: lmctl lint ${i}
2041
2041
  `),e.stdout.write(`Then run: lmctl seed ${i}
2042
- `),0)}function CU(t){return xS(t)?t:`${t}.lmctl`}function MU(t){let e=xS(t);return e?IS(t,e):t}function DU(t){let{teamName:e,teamfilePath:r,leadProvider:n}=t;return`# ${e}
2042
+ `),0)}function CU(t){return NS(t)?t:`${t}.lmctl`}function MU(t){let e=NS(t);return e?xS(t,e):t}function DU(t){let{teamName:e,teamfilePath:r,leadProvider:n}=t;return`# ${e}
2043
2043
 
2044
2044
  # Lead, you take tasks from the operator. Clarify only when needed,
2045
2045
  # then first use lmctl_chat to ping each of your members with a one-line
@@ -2079,7 +2079,7 @@ context, so knowledge is shared across agents and survives fresh sessions: a
2079
2079
  refreshed or swapped-in agent loses its chat history but NOT what's written
2080
2080
  here. When a task is done, record durable project knowledge in durable-memory/
2081
2081
  and keep durable-memory/index.md current so any agent can get up to speed fast.
2082
- `}var OU,$S=b(()=>{"use strict";$e();OU=`usage: lmctl plan [options] <directory>
2082
+ `}var OU,jS=b(()=>{"use strict";$e();OU=`usage: lmctl plan [options] <directory>
2083
2083
 
2084
2084
  Generate a starter lmctl team document template for a directory.
2085
2085
 
@@ -2094,8 +2094,8 @@ Examples:
2094
2094
 
2095
2095
  # Same shape, codex for the Lead and Reviewer2
2096
2096
  lmctl plan ./backend --provider codex
2097
- `});var RS={};ce(RS,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>AS,runTerminal:()=>WU});import{spawn as PU}from"node:child_process";import{statSync as FU}from"node:fs";async function WU(t,e){if(t.includes("--help")||t.includes("-h"))return XU(e);let r=F(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=N(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return 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"?M(r,i):N(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await G(e,async i=>{let a=N(r,"--alias"),l=Qy(i,s,a);return"err"in l?y(e,l.err):nf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return me(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):N(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=ur(UU,{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 G(e,l=>BU(e,a.teamfile,a.alias,l))}try{return await G(e,async s=>{let o=qU(e,s,r);if(typeof o=="number")return o;let i=N(r,"--alias");return M(r,"--size")?JU(e,s,o,i,M(r,"--json")):HU(e,s,o,i)})}catch(s){return me(e,s)}}async function BU(t,e,r,n){let s;try{s=Wt(e,r,n)}catch(o){return o instanceof ge?y(t,o.message):me(t,o)}oi(t,s.isLead,s.alias,s.provider,s.sessiondir);try{ii(t,Re(e),e)}catch{}return nf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}async function nf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Yo(r))return y(t,`no resume incantation for provider "${r}"`);if(!fh.test(n))return y(t,"refusing to resume: malformed sessionid");let o=kc(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=PU(i,a,{stdio:"inherit",cwd:s,env:Ke(process.env,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function qU(t,e,r){let n=N(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,N(r,"--project"));return typeof s=="number"?s:fi(t,e,s,void 0)}async function HU(t,e,r,n){let s=mi(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`):nf(t,{provider:Ie(s),sessionid:o,sessiondir:s.sessiondir})}function AS(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=FU(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 JU(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=Ie(a),u=null;Yo(c)&&(u=await Nr(l,c));let d=AS(u),f=d.est>Bs;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?en(c,l):null})}if(s)return q(t,{estimate:!0,legend:jS,guide_tokens:Bs,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2098
- `),t.stdout.write(`${jS}
2097
+ `});var OS={};ce(OS,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>RS,runTerminal:()=>WU});import{spawn as PU}from"node:child_process";import{statSync as FU}from"node:fs";async function WU(t,e){if(t.includes("--help")||t.includes("-h"))return XU(e);let r=F(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=N(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return 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"?M(r,i):N(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await G(e,async i=>{let a=N(r,"--alias"),l=ew(i,s,a);return"err"in l?y(e,l.err):nf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return me(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):N(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=ur(UU,{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 G(e,l=>BU(e,a.teamfile,a.alias,l))}try{return await G(e,async s=>{let o=qU(e,s,r);if(typeof o=="number")return o;let i=N(r,"--alias");return M(r,"--size")?JU(e,s,o,i,M(r,"--json")):HU(e,s,o,i)})}catch(s){return me(e,s)}}async function BU(t,e,r,n){let s;try{s=Wt(e,r,n)}catch(o){return o instanceof ge?y(t,o.message):me(t,o)}oi(t,s.isLead,s.alias,s.provider,s.sessiondir);try{ii(t,Re(e),e)}catch{}return nf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}async function nf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Yo(r))return y(t,`no resume incantation for provider "${r}"`);if(!mh.test(n))return y(t,"refusing to resume: malformed sessionid");let o=kc(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=PU(i,a,{stdio:"inherit",cwd:s,env:Ke(process.env,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function qU(t,e,r){let n=N(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,N(r,"--project"));return typeof s=="number"?s:fi(t,e,s,void 0)}async function HU(t,e,r,n){let s=mi(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`):nf(t,{provider:Ie(s),sessionid:o,sessiondir:s.sessiondir})}function RS(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=FU(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 JU(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=Ie(a),u=null;Yo(c)&&(u=await Nr(l,c));let d=RS(u),f=d.est>Bs;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?en(c,l):null})}if(s)return q(t,{estimate:!0,legend:AS,guide_tokens:Bs,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2098
+ `),t.stdout.write(`${AS}
2099
2099
  `);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)
2100
2100
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
2101
2101
  Nothing was changed automatically. If you choose to compact, open the
@@ -2110,7 +2110,8 @@ Examples:
2110
2110
  positional AI-team mode \u2014 step into a member's native provider TUI by
2111
2111
  <teamfile>:<alias> or <teamfile> <alias> (lmctl0 parity).
2112
2112
  Bare sessionid is REJECTED (a sessionid carries no provider
2113
- resume incantation). Mutually exclusive with --team/--project/--size.
2113
+ resume incantation). Mutually exclusive with --team/--project/
2114
+ --size/--alias/--json.
2114
2115
 
2115
2116
  --run <id> managed mode \u2014 resolve the run's latest agent_call to the
2116
2117
  team member's provider session and step into it. Mutually
@@ -2132,12 +2133,12 @@ Examples:
2132
2133
  tokens it surfaces the resume incantation so YOU can
2133
2134
  open & self-compact. Nothing is ever changed
2134
2135
  automatically; ${Bs} is a guide, not a gate.
2135
- `),0}var UU,Bs,jS,OS=b(()=>{"use strict";Pe();tn();$e();Wc();vn();Ut();Xt();ss();oa();UU={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,jS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as sf,dirname as DS}from"node:path";function of(t,e){let r=sf(t);for(;;){let n=GU(e,r);if(n!==null)return n;let s=DS(r);if(s===r)return null;r=s}}function GU(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Da(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Pa(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function af(t){if(t.io.dal!==void 0){let o=LS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new rt(CS(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(Da()||Pa()){let o=ue(),i=pe({path:o}),a=LS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new rt(CS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?FS(t.cwd):VU(t.projectName),r=US(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new rt(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function PS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Da()||Pa()){let n=ue();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e;try{e=FS(t.cwd)}catch{throw new rt("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=US(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function LS(t,e,r){return r!==void 0?t.findProjectByName(r):of(e,t)}function CS(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 VU(t){let e=[];for(let r of Xa())for(let n of WS(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new rt(`project not found in any workspace DB: ${t}`);return e}function FS(t){let e=KU(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Xa())for(let o of WS(s)){let i=sf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new rt("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function US(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new rt(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2136
- ${MS(n)}`):new rt(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2137
- ${MS(n)}`)}function MS(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2138
- `)}function KU(t){let e=[],r=sf(t);for(;;){e.push(r);let n=DS(r);if(n===r)return e;r=n}}function WS(t){let e=null;try{e=new zs(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>al)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var rt,lf=b(()=>{"use strict";il();cl();Pe();Ve();rt=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var pf={};ce(pf,{assertNoCrossWorkflowSubflowCycle:()=>VS,firstUnregisteredArchetype:()=>mf,runWorkflow:()=>cW});import{createHash as df,randomUUID as YU}from"node:crypto";import{existsSync as zU,readFileSync as Wa,readdirSync as ZU,writeFileSync as QU}from"node:fs";import{basename as eW,join as tW,resolve as rW}from"node:path";import{pathToFileURL as nW}from"node:url";function ff(t,e){return{source_uri:nW(rW(t)).href,source_sha256:df("sha256").update(e).digest("hex")}}function HS(t){return df("sha256").update(t).digest("hex")}async function aW(t){let e=await yr(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:HS(e),remote:!0}}async function Ua(t){if(tr(t)){let n=await ts(t),s=Wa(n,"utf8");return{definition:s,source_uri:t,source_sha256:HS(s),remote:!1}}let e=Mn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(ht(t))return aW(t);let r=Wa(t,"utf8");return{definition:r,...ff(t,r),remote:!1}}function JS(t){return Ce(t.definition)}function XS(t){if(t.definition_schema_version!==3)return null;let e=mf(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function lW(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 cW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(iW),0;try{return r==="run"?await uW(n,e):await G(e,s=>{switch(r){case"load":return pW(n,e,s);case"author":return hW(n,e,s);case"list":return _W(n,e,s);case"sync":return gW(n,e,s);case"export":return yW(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof rt?y(e,s.message):me(e,s)}}async function uW(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${Fa}
2139
- `),0;let r=F(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return fr(e,r.error);if(r.positionals.length>1)return fr(e,Fa);let n=M(r,"--json"),s=N(r,"--workflow"),o=N(r,"--project"),i=N(r,"--job"),a=N(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return fr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Ht(c))return fr(e,Fa);if(tr(c))return BS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Mn(c,"remote workflow URLs");return m!==null?y(e,m):BS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return fr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return fr(e,Fa);if(i!==void 0&&(o!==void 0||a!==void 0))return fr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=dW(i);if(m===null)return fr(e,`invalid --job: ${i}`);let p=PS({cwd:process.cwd(),io:e});try{let h=await ws({dal:p.dal,job_id:m,worker_id:cf()});return uf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=GS(a,e);if(d===Ba)return 2;let f=af({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 ws({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(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 BS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=GS(o,r);if(l===Ba)return 2;let c,u;try{c=await Ua(t),u=JS(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=XS(u);if(d!==null)return y(r,d);if(c.remote&&!await fW(r,c,u,a))return 1;let f=af({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 ws({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(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 fr(t,e){return t.stderr.write(`error: ${e}
2140
- `),2}function GS(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)}
2136
+ `),0}var UU,Bs,AS,LS=b(()=>{"use strict";Pe();tn();$e();Wc();vn();Ut();Xt();ss();oa();UU={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,AS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as sf,dirname as PS}from"node:path";function of(t,e){let r=sf(t);for(;;){let n=GU(e,r);if(n!==null)return n;let s=PS(r);if(s===r)return null;r=s}}function GU(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Da(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Pa(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function af(t){if(t.io.dal!==void 0){let o=CS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new rt(MS(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(Da()||Pa()){let o=ue(),i=pe({path:o}),a=CS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new rt(MS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?US(t.cwd):VU(t.projectName),r=WS(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new rt(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function FS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Da()||Pa()){let n=ue();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e;try{e=US(t.cwd)}catch{throw new rt("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=WS(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function CS(t,e,r){return r!==void 0?t.findProjectByName(r):of(e,t)}function MS(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 VU(t){let e=[];for(let r of Xa())for(let n of BS(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new rt(`project not found in any workspace DB: ${t}`);return e}function US(t){let e=KU(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Xa())for(let o of BS(s)){let i=sf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new rt("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function WS(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new rt(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2137
+ ${DS(n)}`):new rt(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2138
+ ${DS(n)}`)}function DS(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2139
+ `)}function KU(t){let e=[],r=sf(t);for(;;){e.push(r);let n=PS(r);if(n===r)return e;r=n}}function BS(t){let e=null;try{e=new zs(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>al)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var rt,lf=b(()=>{"use strict";il();cl();Pe();Ve();rt=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var pf={};ce(pf,{assertNoCrossWorkflowSubflowCycle:()=>KS,firstUnregisteredArchetype:()=>mf,runWorkflow:()=>cW});import{createHash as df,randomUUID as YU}from"node:crypto";import{existsSync as zU,readFileSync as Wa,readdirSync as ZU,writeFileSync as QU}from"node:fs";import{basename as eW,join as tW,resolve as rW}from"node:path";import{pathToFileURL as nW}from"node:url";function ff(t,e){return{source_uri:nW(rW(t)).href,source_sha256:df("sha256").update(e).digest("hex")}}function JS(t){return df("sha256").update(t).digest("hex")}async function aW(t){let e=await yr(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:JS(e),remote:!0}}async function Ua(t){if(tr(t)){let n=await ts(t),s=Wa(n,"utf8");return{definition:s,source_uri:t,source_sha256:JS(s),remote:!1}}let e=Mn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(ht(t))return aW(t);let r=Wa(t,"utf8");return{definition:r,...ff(t,r),remote:!1}}function XS(t){return Ce(t.definition)}function GS(t){if(t.definition_schema_version!==3)return null;let e=mf(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function lW(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 cW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(iW),0;try{return r==="run"?await uW(n,e):await G(e,s=>{switch(r){case"load":return pW(n,e,s);case"author":return hW(n,e,s);case"list":return _W(n,e,s);case"sync":return gW(n,e,s);case"export":return yW(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof rt?y(e,s.message):me(e,s)}}async function uW(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${Fa}
2140
+ `),0;let r=F(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return fr(e,r.error);if(r.positionals.length>1)return fr(e,Fa);let n=M(r,"--json"),s=N(r,"--workflow"),o=N(r,"--project"),i=N(r,"--job"),a=N(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return fr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Ht(c))return fr(e,Fa);if(tr(c))return qS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Mn(c,"remote workflow URLs");return m!==null?y(e,m):qS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return fr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return fr(e,Fa);if(i!==void 0&&(o!==void 0||a!==void 0))return fr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=dW(i);if(m===null)return fr(e,`invalid --job: ${i}`);let p=FS({cwd:process.cwd(),io:e});try{let h=await ws({dal:p.dal,job_id:m,worker_id:cf()});return uf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=VS(a,e);if(d===Ba)return 2;let f=af({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 ws({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(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 qS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=VS(o,r);if(l===Ba)return 2;let c,u;try{c=await Ua(t),u=XS(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=GS(u);if(d!==null)return y(r,d);if(c.remote&&!await fW(r,c,u,a))return 1;let f=af({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 ws({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(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 fr(t,e){return t.stderr.write(`error: ${e}
2141
+ `),2}function VS(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)}
2141
2142
  `),Ba}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2142
2143
  `),Ba):r}function dW(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function cf(){return`cli-${process.pid}-${YU().slice(0,8)}`}function uf(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?q(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2143
2144
  `),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?q(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
@@ -2147,13 +2148,13 @@ ${MS(n)}`)}function MS(t){return t.map(e=>` workspace ${e.candidate.workspace_n
2147
2148
  `)),e.status==="failed"?1:0}async function fW(t,e,r,n){let s=lW(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(`
2148
2149
  `)+`
2149
2150
  `),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 mW(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
2150
- `),a}function mW(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 pW(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(tr(s))try{o=await Ua(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else if(ht(s))try{o=await Ua(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else{let c=Mn(s,"remote workflow URLs");if(c!==null)return y(e,c);o=await Ua(s)}let i;try{i=JS(o)}catch(c){if(o.remote)return y(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?XS(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}
2151
+ `),a}function mW(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 pW(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(tr(s))try{o=await Ua(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else if(ht(s))try{o=await Ua(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else{let c=Mn(s,"remote workflow URLs");if(c!==null)return y(e,c);o=await Ua(s)}let i;try{i=XS(o)}catch(c){if(o.remote)return y(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?GS(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}
2151
2152
  `),o.remote&&e.stdout.write(`source: ${o.source_uri}
2152
2153
  sha256: ${o.source_sha256}
2153
- `),0}function mf(t){let e=Fi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function qS(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 VS(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 hW(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=Wa(s,"utf8"),a;try{a=Ce(i)}catch(m){return y(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return me(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=mf(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{VS(u,qS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return qS(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,...ff(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:df("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2154
+ `),0}function mf(t){let e=Fi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function HS(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 KS(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 hW(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=Wa(s,"utf8"),a;try{a=Ce(i)}catch(m){return y(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return me(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=mf(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{KS(u,HS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return HS(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,...ff(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:df("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2154
2155
  `),0}function _W(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listWorkflows();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2155
2156
  `)}${s.length>0?`
2156
- `:""}`),0}function gW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);ti({swallow:!0});let s=gh(),o=[];try{o=zU(s)?ZU(s).filter(c=>sW.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=tW(s,c),d=Wa(u,"utf8"),f;try{f=Ce(d)}catch($){return y(e,`compile failed for ${c}: ${$ instanceof Error?$.message:String($)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:eW(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=ff(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===T.source_sha256){l+=1;continue}let k=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),k?i+=1:a+=1}return M(n,"--json")?q(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2157
+ `:""}`),0}function gW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);ti({swallow:!0});let s=yh(),o=[];try{o=zU(s)?ZU(s).filter(c=>sW.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=tW(s,c),d=Wa(u,"utf8"),f;try{f=Ce(d)}catch($){return y(e,`compile failed for ${c}: ${$ instanceof Error?$.message:String($)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:eW(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=ff(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===T.source_sha256){l+=1;continue}let k=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),k?i+=1:a+=1}return M(n,"--json")?q(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2157
2158
  `),0}function yW(t,e,r){let n=F(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:oW,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)}
2158
2159
  `,c=N(n,"--out");return c!==void 0?(QU(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2159
2160
  `)):e.stdout.write(l),0}var sW,oW,iW,Fa,Ba,hf=b(()=>{"use strict";Iu();dn();ni();$c();$e();lf();Ys();Es();sW=[".compound.json",".lmctl"],oW="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",iW=`usage: lmctl workflow <load|author|list|sync|export|run>
@@ -2162,55 +2163,55 @@ Load, author, list, synchronize, inspect, or run workflow definitions. The
2162
2163
  load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
2163
2164
  URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
2164
2165
  remote https:// workflow after a trust prompt.
2165
- `,Fa="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";Ba=Symbol("inputs-error")});function _f(t,e){let r=wW[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 wW,KS=b(()=>{"use strict";wW={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var rT={};ce(rT,{initWorkspace:()=>eT,runWorkspace:()=>IW,setWorkspaceProvider:()=>tT});import{copyFileSync as EW,cpSync as bW,existsSync as De,mkdirSync as mr,readdirSync as yf,renameSync as SW,rmSync as qa,statSync as Ha,writeFileSync as TW}from"node:fs";import{spawnSync as kW}from"node:child_process";import{homedir as YS}from"node:os";import{dirname as wf,join as qs}from"node:path";async function IW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(vW),0;switch(r){case"list":return xW(n,e);case"create":return NW(n,e);case"use":return $W(n,e);case"show":return jW(n,e);case"delete":return AW(n,e);case"migrate":return RW(n,e);case"init":return eT(n,e);case"set-provider":return tT(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function ZS(){let t=Js(),e=[],r=new Set,n=_r.default,s=De(An()),o=De(vt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Bt(n):An(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),De(hr())){let i;try{i=yf(hr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!qe(a))continue;let l=!1;try{l=Ha(vt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Bt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function xW(t,e){let r=F(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=ZS();if(M(r,"--json"))return q(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}
2166
+ `,Fa="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]";Ba=Symbol("inputs-error")});function _f(t,e){let r=wW[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 wW,YS=b(()=>{"use strict";wW={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var nT={};ce(nT,{initWorkspace:()=>tT,runWorkspace:()=>IW,setWorkspaceProvider:()=>rT});import{copyFileSync as EW,cpSync as bW,existsSync as De,mkdirSync as mr,readdirSync as yf,renameSync as SW,rmSync as qa,statSync as Ha,writeFileSync as TW}from"node:fs";import{spawnSync as kW}from"node:child_process";import{homedir as zS}from"node:os";import{dirname as wf,join as qs}from"node:path";async function IW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(vW),0;switch(r){case"list":return xW(n,e);case"create":return NW(n,e);case"use":return $W(n,e);case"show":return jW(n,e);case"delete":return AW(n,e);case"migrate":return RW(n,e);case"init":return tT(n,e);case"set-provider":return rT(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function QS(){let t=Js(),e=[],r=new Set,n=_r.default,s=De(An()),o=De(vt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Bt(n):An(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),De(hr())){let i;try{i=yf(hr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!qe(a))continue;let l=!1;try{l=Ha(vt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Bt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function xW(t,e){let r=F(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=QS();if(M(r,"--json"))return q(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}
2166
2167
  `)}return 0}function NW(t,e){let r=F(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(!qe(n))return y(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=vt(n);if(De(s))return y(e,`workspace already exists: ${n} (${s})`);let o=N(r,"--docroot")??Ga(n);mr(s,{recursive:!0}),mr(o,{recursive:!0});let i=Bt(n);mr(wf(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?q(e,l):e.stdout.write(`created workspace ${n} at ${s}
2167
2168
  `),0}function $W(t,e){let r=F(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(!qe(n))return y(e,`invalid workspace name: ${n}`);if(n!==_r.default&&!De(vt(n)))return y(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Hs();return mr(wf(s),{recursive:!0}),TW(s,`${n}
2168
2169
  `),M(r,"--json")?q(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2169
- `),0}function jW(t,e){let r=F(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(!qe(n))return y(e,`invalid workspace name: ${n}`);let s=ZS().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=De(s.db_path)?Ha(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(De(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return M(r,"--json")?q(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2170
+ `),0}function jW(t,e){let r=F(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(!qe(n))return y(e,`invalid workspace name: ${n}`);let s=QS().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=De(s.db_path)?Ha(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(De(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return M(r,"--json")?q(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2170
2171
  `),0}function AW(t,e){let r=F(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(!qe(n))return y(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return y(e,`refusing to delete workspace ${n} without --confirm`);if(n===_r.default&&!M(r,"--force"))return y(e,"refusing to delete the default workspace without --force");if(Js()===n&&!M(r,"--force"))return y(e,`refusing to delete the active workspace (${n}) without --force`);let o=vt(n);return De(o)?(qa(o,{recursive:!0,force:!0}),M(r,"--json")?q(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2171
2172
  `),0):y(e,`workspace not found: ${n}`)}function gf(t,e,r){try{SW(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
2172
2173
  `),Ha(t).isDirectory()?bW(t,e,{recursive:!0}):EW(t,e),!De(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);qa(t,{recursive:!0,force:!0})}function RW(t,e){let r=F(t,[],["--json"]);if(r.error!==void 0)return y(e,r.error);let n=M(r,"--json"),s=Va(),o=hr(),i=[],a=(f,m)=>{if(n)q(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2173
2174
  `);e.stdout.write(f?`migration complete
2174
2175
  `:`${m??"nothing to migrate"}
2175
- `)}return 0};if(!De(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=yf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ha(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!De(o))gf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>De(qs(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\`)`);mr(o,{recursive:!0});for(let m of c)gf(qs(s,m),qs(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{yf(s).length===0&&(qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Of(),d=Hs();return De(u)&&(De(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(gf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function QS(t,e){return kW(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function CW(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 zS(t){return t==="~"?YS():t.startsWith("~/")?qs(YS(),t.slice(2)):t}async function eT(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: ${$n.join(", ")}.`].join(`
2176
+ `)}return 0};if(!De(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=yf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ha(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!De(o))gf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>De(qs(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\`)`);mr(o,{recursive:!0});for(let m of c)gf(qs(s,m),qs(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{yf(s).length===0&&(qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Lf(),d=Hs();return De(u)&&(De(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(gf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function eT(t,e){return kW(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function CW(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 ZS(t){return t==="~"?zS():t.startsWith("~/")?qs(zS(),t.slice(2)):t}async function tT(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: ${$n.join(", ")}.`].join(`
2176
2177
  `)+`
2177
- `),0;let s=F(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??QS,a=$n.map(x=>_f(x,o)).filter(x=>x.status==="ok"||x.status==="unverified").map(x=>x.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${$n.join("|")} first
2178
+ `),0;let s=F(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??eT,a=$n.map(x=>_f(x,o)).filter(x=>x.status==="ok"||x.status==="unverified").map(x=>x.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${$n.join("|")} first
2178
2179
  `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??CW,u=r.promptLine!==void 0||l,d=x=>(e.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2179
2180
  `),2),f,m=N(s,"--name");if(m!==void 0){if(!qe(m))return e.stderr.write(`error: invalid workspace name: ${m}
2180
2181
  `),2;f=m}else{if(!u)return d("--name");for(;;){let x=(await c("Workspace name [default]: ")).trim(),A=x.length===0?"default":x;if(qe(A)){f=A;break}e.stderr.write(`invalid workspace name: ${A} (letters/digits/.-_, start alnum, \u226464)
2181
2182
  `)}}let p=vt(f);if(De(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2182
- `),2;let h,g=N(s,"--basedir"),_=Ga(f);if(g!==void 0)h=zS(g);else{if(!u)return d("--basedir");let x=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=x.length===0?_:zS(x)}let T={};for(let x of["provider1","provider2","provider3"]){let A=N(s,`--${x}`),D=OW[x],C=a.includes(D)?D:a[0];if(A!==void 0){if(!a.includes(A))return e.stderr.write(`error: --${x} ${A} is not an available provider (available: ${a.join(", ")})
2183
+ `),2;let h,g=N(s,"--basedir"),_=Ga(f);if(g!==void 0)h=ZS(g);else{if(!u)return d("--basedir");let x=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=x.length===0?_:ZS(x)}let T={};for(let x of["provider1","provider2","provider3"]){let A=N(s,`--${x}`),D=OW[x],C=a.includes(D)?D:a[0];if(A!==void 0){if(!a.includes(A))return e.stderr.write(`error: --${x} ${A} is not an available provider (available: ${a.join(", ")})
2183
2184
  `),2;T[x]=A;continue}if(!u)return d(`--${x}`);for(;;){let H=(await c(`${x} (${LW[x]}) [${C}]: `)).trim(),R=H.length===0?C:H;if(a.includes(R)){T[x]=R;break}e.stderr.write(`not an available provider: ${R} (available: ${a.join(", ")})
2184
2185
  `)}}mr(p,{recursive:!0}),mr(h,{recursive:!0});let E=Bt(f);mr(wf(E),{recursive:!0});let k=pe({path:E});try{k.setConfig("project.docroot",h),k.setConfig("workspace.provider1",T.provider1),k.setConfig("workspace.provider2",T.provider2),k.setConfig("workspace.provider3",T.provider3)}finally{k.close()}let $={name:f,dir:p,db_path:E,basedir:h,providers:{...T}};return M(s,"--json")?q(e,$):(e.stdout.write(`created workspace ${f} at ${p}
2185
2186
  `),e.stdout.write(` basedir: ${h}
2186
2187
  `),e.stdout.write(` provider1=${T.provider1} provider2=${T.provider2} provider3=${T.provider3}
2187
2188
  `),e.stdout.write(`activate it with: lmctl workspace use ${f}
2188
- `)),0}async function tT(t,e,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${$n.join(", ")}.`].join(`
2189
+ `)),0}async function rT(t,e,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${$n.join(", ")}.`].join(`
2189
2190
  `)+`
2190
2191
  `),0;let s=F(t,[]);if(s.error!==void 0)return y(e,s.error);let[o,i,...a]=s.positionals;if(o===void 0||i===void 0||a.length!==0)return y(e,n);let l=/^provider[123]$/.test(o)?o:/^[123]$/.test(o)?`provider${o}`:null;if(l===null)return e.stderr.write(`error: invalid slot: ${o} (expected provider1, provider2, or provider3)
2191
- `),2;let c=r.spawn??QS,u=$n.map(p=>_f(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${$n.join("|")} first
2192
+ `),2;let c=r.spawn??eT,u=$n.map(p=>_f(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${$n.join("|")} first
2192
2193
  `),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
2193
2194
  `),2;let d=e.dal===void 0,f=e.dal??pe({path:ue()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Rn()??_r.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2194
- `),0}var vW,$n,OW,LW,nT=b(()=>{"use strict";Pe();KS();$e();Ve();vW=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2195
+ `),0}var vW,$n,OW,LW,sT=b(()=>{"use strict";Pe();YS();$e();Ve();vW=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2195
2196
 
2196
2197
  Manage isolated workspace state directories, active workspace selection,
2197
2198
  legacy profile migration, and configured provider slots.
2198
- `;$n=["claude","codex","gemini","qwen"],OW={provider1:"claude",provider2:"codex",provider3:"gemini"},LW={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var iT={};ce(iT,{runProject:()=>FW});import{existsSync as MW,statSync as DW}from"node:fs";import{join as oT}from"node:path";async function FW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(PW),0;try{return await G(e,s=>{switch(r){case"create":return VW(n,e,s);case"list":return KW(n,e,s);case"show":return XW(n,e,s);case"status":return GW(n,e,s);case"workflow":return UW(n,e,s);default:return y(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function UW(t,e,r){let[n,...s]=t;switch(n){case"add":return WW(s,e,r);case"list":return BW(s,e,r);case"show":return qW(s,e,r);case"remove":return HW(s,e,r);case"enable":return sT(s,e,r,!0);case"disable":return sT(s,e,r,!1);default:return y(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function WW(t,e,r){let n=F(t,["--condition","--params","--priority"]);if(n.error!==void 0)return y(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return y(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return y(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return y(e,`workflow not found: ${o}`);let l=N(n,"--condition")??null;if(l!==null)try{sr(l)}catch{return y(e,"invalid --condition JEXL")}let c=JW(N(n,"--params"));if(typeof c=="string")return y(e,c);let u=N(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return y(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?q(e,f):e.stdout.write(`added project workflow ${f.id}
2199
+ `;$n=["claude","codex","gemini","qwen"],OW={provider1:"claude",provider2:"codex",provider3:"gemini"},LW={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var aT={};ce(aT,{runProject:()=>FW});import{existsSync as MW,statSync as DW}from"node:fs";import{join as iT}from"node:path";async function FW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(PW),0;try{return await G(e,s=>{switch(r){case"create":return VW(n,e,s);case"list":return KW(n,e,s);case"show":return XW(n,e,s);case"status":return GW(n,e,s);case"workflow":return UW(n,e,s);default:return y(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function UW(t,e,r){let[n,...s]=t;switch(n){case"add":return WW(s,e,r);case"list":return BW(s,e,r);case"show":return qW(s,e,r);case"remove":return HW(s,e,r);case"enable":return oT(s,e,r,!0);case"disable":return oT(s,e,r,!1);default:return y(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function WW(t,e,r){let n=F(t,["--condition","--params","--priority"]);if(n.error!==void 0)return y(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return y(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return y(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return y(e,`workflow not found: ${o}`);let l=N(n,"--condition")??null;if(l!==null)try{sr(l)}catch{return y(e,"invalid --condition JEXL")}let c=JW(N(n,"--params"));if(typeof c=="string")return y(e,c);let u=N(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return y(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?q(e,f):e.stdout.write(`added project workflow ${f.id}
2199
2200
  `),0}function BW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return y(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?q(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2200
2201
  `)}${i.length>0?`
2201
2202
  `:""}`),0}function qW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=Ef(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return y(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?y(e,`project workflow not found: ${s}`):(M(n,"--json")?q(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2202
2203
  `),0)}function HW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=Ef(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?y(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2203
- `),0):y(e,`project workflow not found: ${s}`)}function sT(t,e,r,n){let s=F(t,[]);if(s.error!==void 0)return y(e,s.error);let o=Ef(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return y(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?y(e,`project workflow not found: ${o}`):(M(s,"--json")?q(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2204
+ `),0):y(e,`project workflow not found: ${s}`)}function oT(t,e,r,n){let s=F(t,[]);if(s.error!==void 0)return y(e,s.error);let o=Ef(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return y(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?y(e,`project workflow not found: ${o}`):(M(s,"--json")?q(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2204
2205
  `),0)}function JW(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function Ef(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function XW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return M(n,"--json")?q(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2205
2206
  `),0}function GW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return M(n,"--json")?q(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2206
- `),0}function VW(t,e,r){let n=F(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals,o=N(n,"--owner"),i=N(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return y(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=N(n,"--local-path")??(l!==null?oT(l,u):void 0),f=N(n,"--workflow"),m=N(n,"--team");if(d===void 0||f===void 0||m===void 0)return y(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return y(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return y(e,`team not found: ${m}`);let h=N(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every($=>typeof $=="string")||k.length===0)return y(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return y(e,"--test-argv must be valid JSON")}let _=N(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return y(e,'--durable-memory-mode must be "folder" or "db"');let T=_!==void 0?_:YW(d)||Zn(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:N(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return M(n,"--json")?q(e,E):e.stdout.write(`created project ${E.name}
2207
+ `),0}function VW(t,e,r){let n=F(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals,o=N(n,"--owner"),i=N(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return y(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=N(n,"--local-path")??(l!==null?iT(l,u):void 0),f=N(n,"--workflow"),m=N(n,"--team");if(d===void 0||f===void 0||m===void 0)return y(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return y(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return y(e,`team not found: ${m}`);let h=N(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every($=>typeof $=="string")||k.length===0)return y(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return y(e,"--test-argv must be valid JSON")}let _=N(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return y(e,'--durable-memory-mode must be "folder" or "db"');let T=_!==void 0?_:YW(d)||Zn(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:N(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return M(n,"--json")?q(e,E):e.stdout.write(`created project ${E.name}
2207
2208
  `),0}function KW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listProjects();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2208
2209
  `)}${s.length>0?`
2209
- `:""}`),0}function YW(t){try{let e=oT(t,"durable-memory");return MW(e)&&DW(e).isDirectory()}catch{return!1}}var PW,aT=b(()=>{"use strict";$e();an();Qn();PW=`usage: lmctl project <create|list|show|status|workflow>
2210
+ `:""}`),0}function YW(t){try{let e=iT(t,"durable-memory");return MW(e)&&DW(e).isDirectory()}catch{return!1}}var PW,lT=b(()=>{"use strict";$e();an();Qn();PW=`usage: lmctl project <create|list|show|status|workflow>
2210
2211
 
2211
2212
  Create, list, inspect, and check projects. The workflow subcommand manages
2212
2213
  per-project workflow bindings and routing conditions.
2213
- `});import{createHash as zW,randomBytes as ZW}from"node:crypto";import{readFile as QW}from"node:fs/promises";function lT(t=new Date,e=ZW(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function eB(t){return zW("sha256").update(t).digest("hex")}async function cT(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await QW(n);return{path:r,sha256:eB(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function uT(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var bf=b(()=>{"use strict"});import{spawnSync as dT}from"node:child_process";import{mkdir as Sf,writeFile as fT,readFile as tB,rm as mT}from"node:fs/promises";import{tmpdir as rB}from"node:os";import{dirname as pT,join as Tf}from"node:path";async function hT(t){let e=t.stagingDir??Tf(rB(),`lmctl-diag-${t.ticketId}`),r=Tf(e,`diagnostic-${t.ticketId}`);await Sf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Tf(r,d);if(await Sf(pT(m),{recursive:!0}),typeof f=="string")await fT(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await fT(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2214
+ `});import{createHash as zW,randomBytes as ZW}from"node:crypto";import{readFile as QW}from"node:fs/promises";function cT(t=new Date,e=ZW(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function eB(t){return zW("sha256").update(t).digest("hex")}async function uT(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await QW(n);return{path:r,sha256:eB(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function dT(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var bf=b(()=>{"use strict"});import{spawnSync as fT}from"node:child_process";import{mkdir as Sf,writeFile as mT,readFile as tB,rm as pT}from"node:fs/promises";import{tmpdir as rB}from"node:os";import{dirname as hT,join as Tf}from"node:path";async function _T(t){let e=t.stagingDir??Tf(rB(),`lmctl-diag-${t.ticketId}`),r=Tf(e,`diagnostic-${t.ticketId}`);await Sf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Tf(r,d);if(await Sf(hT(m),{recursive:!0}),typeof f=="string")await mT(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await mT(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2214
2215
  `;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
2215
2216
  `:`${d.pid}
2216
2217
  # source=${d.pid_source} alive=${String(d.pid_alive)}
@@ -2228,26 +2229,28 @@ per-project workflow bindings and routing conditions.
2228
2229
  `:`# source=${f}
2229
2230
  # tail_lines=${d.tail_lines}
2230
2231
  `;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
2231
- `:""}`)}if(await s("README.md",nB(t)),t.sanitized)for(let d of n){let f=await tB(d.absPath);try{Pf(d.bundlePath,f.toString("utf8"))}catch(m){throw await mT(e,{recursive:!0,force:!0}),m instanceof gr,m}}let i=await cT(n),a=uT({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await Sf(pT(t.outputPath),{recursive:!0});let l=dT("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=dT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await mT(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function nB(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2232
- `)}var _T=b(()=>{"use strict";bf();Xs()});import{spawnSync as sB}from"node:child_process";import{stat as oB}from"node:fs/promises";async function gT(t){try{if(!(await oB(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return iB(t);case"hq":return aB(t)}}function iB(t){let r=sB("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function aB(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var yT=b(()=>{"use strict"});var ET={};ce(ET,{parseDiagnoseArgs:()=>wT,runDiagnose:()=>uB});import{tmpdir as lB}from"node:os";import{join as cB}from"node:path";async function uB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${mB()}
2233
- `),0;let r=wT(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2232
+ `:""}`)}if(await s("README.md",nB(t)),t.sanitized)for(let d of n){let f=await tB(d.absPath);try{Ff(d.bundlePath,f.toString("utf8"))}catch(m){throw await pT(e,{recursive:!0,force:!0}),m instanceof gr,m}}let i=await uT(n),a=dT({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await Sf(hT(t.outputPath),{recursive:!0});let l=fT("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=fT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await pT(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function nB(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2233
+ `)}var gT=b(()=>{"use strict";bf();Xs()});import{spawnSync as sB}from"node:child_process";import{stat as oB}from"node:fs/promises";async function yT(t){try{if(!(await oB(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return iB(t);case"hq":return aB(t)}}function iB(t){let r=sB("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function aB(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var wT=b(()=>{"use strict"});var bT={};ce(bT,{parseDiagnoseArgs:()=>ET,runDiagnose:()=>uB});import{tmpdir as lB}from"node:os";import{join as cB}from"node:path";async function uB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${mB()}
2234
+ `),0;let r=ET(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2234
2235
  `),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
2235
2236
  `),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2236
- `),2;let n=lT(),s=r.outputPath??fB(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await G(e,async i=>{let a=await Uf({dal:i,include:r.include,dbPath:ue(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await hT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:st(),sanitized:!r.noSanitize})}catch(d){if(d instanceof gr)return e.stderr.write(`sanitization failed: ${d.message}
2237
- `),2;throw d}let c=await gT({mode:o,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),u={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(u,null,2)}
2237
+ `),2;let n=cT(),s=r.outputPath??fB(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await G(e,async i=>{let a=await Wf({dal:i,include:r.include,dbPath:ue(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await _T({ticketId:n,data:a,outputPath:s,lmctlNextVersion:st(),sanitized:!r.noSanitize})}catch(d){if(d instanceof gr)return e.stderr.write(`sanitization failed: ${d.message}
2238
+ `),2;throw d}let c=await yT({mode:o,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),u={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(u,null,2)}
2238
2239
  `):(e.stdout.write(`ticket: ${n}
2239
2240
  `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2240
2241
  `),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2241
2242
  `)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
2242
- `),1}}function wT(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!dB(o))return`unknown section: ${o} (expected one of ${Gs.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function dB(t){return Gs.includes(t)}function fB(t){return cB(lB(),`lmctl-diag-${t}.tar.gz`)}function mB(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
2243
- `)}var bT=b(()=>{"use strict";Cn();_T();bf();Xs();yT();Ve();$e()});var NT={};ce(NT,{ATTENTION_STATES:()=>vf,DAEMON_INTERVAL_FAST_MS:()=>kf,REQUIRED_TEAM_ALIASES:()=>TT,chooseDiagnoses:()=>IT,collectEvidence:()=>vT,diagnose:()=>kT,renderReport:()=>xT,runDiagnosePrompt:()=>_B});function kT(t,e){let r=vT(t,e),n=IT(r);return xT(r,n)}function vT(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:Ss(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=hB(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=TT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function IT(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>kf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${kf}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>vf.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function xT(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${pB(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>vf.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2243
+ `),1}}function ET(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!dB(o))return`unknown section: ${o} (expected one of ${Gs.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function dB(t){return Gs.includes(t)}function fB(t){return cB(lB(),`lmctl-diag-${t}.tar.gz`)}function mB(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
2244
+ `)}var ST=b(()=>{"use strict";Cn();gT();bf();Xs();wT();Ve();$e()});var NT={};ce(NT,{ATTENTION_STATES:()=>If,DAEMON_INTERVAL_FAST_MS:()=>vf,REQUIRED_TEAM_ALIASES:()=>TT,chooseDiagnoses:()=>IT,collectEvidence:()=>vT,diagnose:()=>kT,renderReport:()=>xT,runDiagnosePrompt:()=>_B});function kT(t,e){let r=vT(t,e),n=IT(r);return xT(r,n)}function vT(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:Ss(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=hB(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=TT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function IT(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>vf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${vf}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>If.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function xT(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${pB(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>If.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2244
2245
  `)+`
2245
- `}function pB(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function hB(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function _B(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${ST()}
2246
- `),0;let r=t.filter(s=>!s.startsWith("--"));if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2247
- `),e.stderr.write(`${ST()}
2246
+ `}function pB(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function hB(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function _B(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${kf()}
2247
+ `),0;let r=[];for(let s of t){if(s.startsWith("--"))return e.stderr.write(`error: unknown flag: ${s}
2248
+ `),e.stderr.write(`${kf()}
2249
+ `),2;r.push(s)}if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2250
+ `),e.stderr.write(`${kf()}
2248
2251
  `),2;let n=r[0];try{return await G(e,s=>(e.stdout.write(kT(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2249
- `),1}}function ST(){return["usage: lmctl diagnose-prompt <prompt_id>","",'Narrow read-only diagnostic for the WT-6 "prompt-pending-forever"',"symptom. Renders prompt + dispatch + run + project + workflows + team","state, then picks the top 1-3 likely root causes (daemon interval,","missing workflows, missing team aliases, etc).","","options:"," -h, --help show this help and exit"].join(`
2250
- `)}var TT,kf,vf,$T=b(()=>{"use strict";ed();$e();TT=["Coder","Reviewer1","Polisher"],kf=3e4,vf=new Set(["attention_needed","paused","escalation"])});var OT={};ce(OT,{appendIntent:()=>RT,resolveIntentLogPath:()=>AT,runStatus:()=>vB});import{appendFileSync as gB,mkdirSync as yB}from"node:fs";import{homedir as wB}from"node:os";import{dirname as EB,join as bB}from"node:path";function AT(){return process.env.LMCTL_INTENT_LOG??bB(wB(),".lmctl","recent-intents.log")}function RT(t){try{let e=AT();yB(EB(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});gB(e,`${r}
2252
+ `),1}}function kf(){return["usage: lmctl diagnose-prompt <prompt_id>","",'Narrow read-only diagnostic for the WT-6 "prompt-pending-forever"',"symptom. Renders prompt + dispatch + run + project + workflows + team","state, then picks the top 1-3 likely root causes (daemon interval,","missing workflows, missing team aliases, etc).","","options:"," -h, --help show this help and exit"].join(`
2253
+ `)}var TT,vf,If,$T=b(()=>{"use strict";ed();$e();TT=["Coder","Reviewer1","Polisher"],vf=3e4,If=new Set(["attention_needed","paused","escalation"])});var OT={};ce(OT,{appendIntent:()=>RT,resolveIntentLogPath:()=>AT,runStatus:()=>vB});import{appendFileSync as gB,mkdirSync as yB}from"node:fs";import{homedir as wB}from"node:os";import{dirname as EB,join as bB}from"node:path";function AT(){return process.env.LMCTL_INTENT_LOG??bB(wB(),".lmctl","recent-intents.log")}function RT(t){try{let e=AT();yB(EB(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});gB(e,`${r}
2251
2254
  `)}catch{}}async function vB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(kB),0;let r=F(t,["--project"],["--web","--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=M(r,"--web"),s=N(r,"--project"),o=M(r,"--json");return n&&s!==void 0?y(e,"--web and --project are mutually exclusive"):G(e,i=>{let a=IB(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2252
2255
  `),1;if(a.kind==="no-web-focus")return e.stderr.write(`no active webui focus; run lmctl status --web after navigating webui to a project, or omit --web.
2253
2256
  `),1;if(a.kind==="project-not-found")return y(e,`project not found: ${a.name}`);let l=a.project,c=xB(i,l,a.source);return o?q(e,c):e.stdout.write(RB(c)),RT({verb:"status",args:t}),0})}function IB(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=of(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function xB(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=NB(t,e.id,TB),a=$B(t,e.id),l=jB(t,e.id,SB);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:AB(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function NB(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function $B(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function jB(t,e,r){return t.db.prepare(`
@@ -2265,9 +2268,9 @@ Show the current project context, active run, unacked attentions, and recent
2265
2268
  runs. Defaults to resolving the project from the current working directory;
2266
2269
  --project selects a project by name, and --web uses the web UI focus.
2267
2270
  `});Ve();Cn();je();import{pathToFileURL as OB}from"node:url";Ys();Cn();import{mkdirSync as xk,readFileSync as Nk,renameSync as $k,writeFileSync as jk}from"node:fs";import{homedir as Ak}from"node:os";import{dirname as Rk,join as Ok}from"node:path";var Lk="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",Ck=60*60*1e3,Mk=1500;function Dk(){let t=process.env.HOME??Ak();return Ok(t,".lmctl",".update-check.json")}function Pk(t){return t.isTTY===!0}function Fk(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 el(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!Pk(e.stderr)||t.includes("--json")||t.includes("--from")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function Uk(t,e){try{let r=JSON.parse(Nk(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<Ck)return r.latest}catch{}return null}function Wk(t,e){xk(Rk(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;jk(r,`${JSON.stringify(e)}
2268
- `,"utf8"),$k(r,t)}async function Bk(){let t=await yr(Lk,{description:"lmctl npm metadata",timeoutMs:Mk}),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 Vf(t,e=[],r={}){try{if(el(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??Dk();if(Uk(s,n)!==null)return;let i=await(r.fetchLatest??Bk)();try{Wk(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??st();Fk(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2269
- `)}catch{}}var Nf=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2270
- `,If=`${Nf}
2271
+ `,"utf8"),$k(r,t)}async function Bk(){let t=await yr(Lk,{description:"lmctl npm metadata",timeoutMs:Mk}),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 Kf(t,e=[],r={}){try{if(el(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??Dk();if(Uk(s,n)!==null)return;let i=await(r.fetchLatest??Bk)();try{Wk(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??st();Fk(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2272
+ `)}catch{}}var $f=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2273
+ `,xf=`${$f}
2271
2274
  Setup & status:
2272
2275
  status Show current project context, active run, attentions, and recent runs.
2273
2276
  diagnose Collect a sanitized troubleshooting bundle, with optional upload.
@@ -2312,14 +2315,14 @@ Global flags:
2312
2315
  chain and context.
2313
2316
 
2314
2317
  Run 'lmctl help <command>' for command-specific help.
2315
- `,CT=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","health","ls","lint","seed","hire","refresh","clone","plan","workflow","run","project","workspace","diagnose","diagnose-prompt","status","db"]);function xf(t,e){return t.stderr.write(`error: ${e}
2316
- ${Nf}Run 'lmctl help' for usage.
2318
+ `,CT=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","health","ls","lint","seed","hire","refresh","clone","plan","workflow","run","project","workspace","diagnose","diagnose-prompt","status","db"]);function Nf(t,e){return t.stderr.write(`error: ${e}
2319
+ ${$f}Run 'lmctl help' for usage.
2317
2320
  `),2}function DT(t,e){return t.stderr.write(`error: unknown command: ${e}
2318
- ${Nf}Run 'lmctl help' for usage.
2319
- `),1}async function LB(t,e={stdout:process.stdout,stderr:process.stderr}){let r=Jf();try{return await CB(t,e)}finally{Xf(r)}}async function CB(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 xf(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 xf(e,"missing value for --workspace");if(!qe(l))return xf(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){Hf();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${st()}
2320
- `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(If),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(If),0):CT.has(i)?MT(i,[...a,"--help"],e):DT(e,i)}Rf(ue(),e.stderr),Lf(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(If),0;Qa()&&e.stderr.write(`[debug] lmctl ${st()} | node ${process.version} | cmd ${s} ${o.join(" ")}
2321
+ ${$f}Run 'lmctl help' for usage.
2322
+ `),1}async function LB(t,e={stdout:process.stdout,stderr:process.stderr}){let r=Xf();try{return await CB(t,e)}finally{Gf(r)}}async function CB(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 Nf(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 Nf(e,"missing value for --workspace");if(!qe(l))return Nf(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){Jf();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${st()}
2323
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(xf),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(xf),0):CT.has(i)?MT(i,[...a,"--help"],e):DT(e,i)}Of(ue(),e.stderr),Cf(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(xf),0;Qa()&&e.stderr.write(`[debug] lmctl ${st()} | node ${process.version} | cmd ${s} ${o.join(" ")}
2321
2324
  [debug] cwd ${process.cwd()} | db ${ue()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}
2322
- `);try{let i=await MT(s,o,e);return CT.has(s)&&!el(r,e)&&await Vf(e,r),i}catch(i){return MB(i,s,o,e)}}function MB(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Qa())return n.stderr.write(`error: ${s.message}
2325
+ `);try{let i=await MT(s,o,e);return CT.has(s)&&!el(r,e)&&await Kf(e,r),i}catch(i){return MB(i,s,o,e)}}function MB(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Qa())return n.stderr.write(`error: ${s.message}
2323
2326
  `),n.stderr.write(`(re-run with --debug for the full stack trace and context)
2324
2327
  `),1;n.stderr.write(`error: ${s.message}
2325
2328
  `),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}
@@ -2327,7 +2330,7 @@ ${Nf}Run 'lmctl help' for usage.
2327
2330
  `),s.stack&&n.stderr.write(`${s.stack}
2328
2331
  `);let o=s.cause,i=0;for(;o!=null&&i<8;){let a=o instanceof Error?o:new Error(String(o));n.stderr.write(`caused by: ${a.message}
2329
2332
  `),a.stack&&n.stderr.write(`${a.stack}
2330
- `),o=a.cause,i+=1}return 1}async function MT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(yc(),ih));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Wc(),Wh));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(KE(),VE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(zE(),YE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Sb(),bb));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>($b(),Nb));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(Db(),Mb));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Fb(),Pb));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(Bb(),Wb));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Yb(),Kb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(Zb(),zb));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(tS(),eS));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(vS(),kS));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>($S(),NS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(OS(),RS));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(hf(),pf));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(hf(),pf));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(nT(),rT));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(aT(),iT));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(bT(),ET));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>($T(),NT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(LT(),OT));return n(e,r)}case"db":return DB(e,r);default:return DT(r,t)}}function DB(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2333
+ `),o=a.cause,i+=1}return 1}async function MT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(yc(),ah));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Wc(),Bh));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(YE(),KE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(ZE(),zE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Tb(),Sb));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(jb(),$b));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(Pb(),Db));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Ub(),Fb));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(qb(),Bb));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(zb(),Yb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(Qb(),Zb));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(rS(),tS));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(IS(),vS));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(jS(),$S));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(LS(),OS));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(hf(),pf));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(hf(),pf));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(sT(),nT));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(lT(),aT));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(ST(),bT));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>($T(),NT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(LT(),OT));return n(e,r)}case"db":return DB(e,r);default:return DT(r,t)}}function DB(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2331
2334
 
2332
2335
  Database utilities. The downgrade command is currently a documented stub;
2333
2336
  restore from backup for rollback and use normal migrations for forward changes.