@lmctl-ai/lmctl 0.1.332 → 0.1.333

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 +192 -192
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  var k0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{for(var n in e)k0(t,n,{get:e[n],enumerable:!0})};var __={};oe(__,{defaultDbPath:()=>m_,describeStateLocation:()=>Ts,isSlowWslMount:()=>p_,lmctlNextHome:()=>Xi,resolveDbPath:()=>Q,warnIfSlowDbPath:()=>cc});import{platform as u_}from"node:os";import{homedir as I0}from"node:os";import{join as f_}from"node:path";function Xi(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:f_(I0(),N0)}function m_(){return f_(Xi(),A0)}function Q(t){return t!==void 0&&t.length>0?t:process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?process.env.LMCTL_DB:m_()}function Ts(t){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}function p_(t,e=u_()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function cc(t,e=process.stderr,n=u_()){p_(t,n)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
- `)}var N0,A0,qe=E(()=>{"use strict";N0=".lmctl",A0="state.db"});function L0(t){for(let e of O0)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 C0(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function D0(t){let e=t.split(".");if(e.length!==4)return!1;for(let n of e){if(n.length===0||n.length>3)return!1;let r=Number(n);if(!Number.isFinite(r)||r<0||r>255)return!1}return!0}function vs(t){let e=t;for(let{re:n,replacement:r}of R0)e=e.replace(n,r);return e=e.replace($0,n=>!D0(n)||L0(n)?n:h_),e=e.replace(M0,n=>C0(n)?n:h_),e}function Ss(t){return t.split(`
2
+ `)}var N0,A0,He=E(()=>{"use strict";N0=".lmctl",A0="state.db"});function L0(t){for(let e of O0)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 C0(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function D0(t){let e=t.split(".");if(e.length!==4)return!1;for(let n of e){if(n.length===0||n.length>3)return!1;let r=Number(n);if(!Number.isFinite(r)||r<0||r>255)return!1}return!0}function vs(t){let e=t;for(let{re:n,replacement:r}of R0)e=e.replace(n,r);return e=e.replace($0,n=>!D0(n)||L0(n)?n:h_),e=e.replace(M0,n=>C0(n)?n:h_),e}function Ss(t){return t.split(`
3
3
  `).map(e=>vs(e)).join(`
4
- `)}function y_(t,e){let n=t.toUpperCase();return n.includes("TOKEN")||n.includes("SECRET")||n.includes("KEY")||n.includes("PASSWORD")||n.includes("PASSWD")||n.includes("CREDENTIAL")||n.includes("AUTH")?{key:t,value:It}:{key:t,value:vs(e)}}function vn(t){if(typeof t=="string")return vs(t);if(Array.isArray(t))return t.map(e=>vn(e));if(t!==null&&typeof t=="object"){let e={};for(let[n,r]of Object.entries(t)){let s=n.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[n]=typeof r=="string"?It:vn(r):e[n]=vn(r)}return e}return t}function w_(t,e){for(let{name:n,re:r}of j0){let s=e.match(r);if(s!==null&&!s[0].includes(It))throw new Kn(t,n)}}var It,x0,h_,g_,R0,O0,$0,M0,j0,Kn,Ji=E(()=>{"use strict";It="[REDACTED]",x0="[REDACTED_EMAIL]",h_="[REDACTED_IP]",g_="[USER]",R0=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${It}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${It}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${It}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:It},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:It},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:It},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:It},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${It}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${g_}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${g_}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:x0}],O0=["127.","10.","192.168.","0.0.0.0"];$0=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,M0=/\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;j0=[{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"'`]+/}],Kn=class extends Error{bundlePath;patternName;constructor(e,n){super(`sanitization failed: ${n} pattern matched in ${e}`),this.bundlePath=e,this.patternName=n,this.name="SanitizationError"}}});import{spawnSync as dc}from"node:child_process";import{readFileSync as P0}from"node:fs";import{readFile as fc,stat as E_}from"node:fs/promises";import{homedir as F0}from"node:os";import{join as U0}from"node:path";import{fileURLToPath as W0}from"node:url";function Ut(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(P0(W0(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function T_(t){let e=new Set(t.include??Gi),n={};return e.has("serve")&&(n.serve=await H0(t)),e.has("db")&&(n.db=B0(t)),e.has("runs")&&(n.runs=X0(t)),e.has("jobs")&&(n.jobs=J0(t)),e.has("attentions")&&(n.attentions=G0(t)),e.has("env")&&(n.env=await K0(t)),e.has("intents")&&(n.intents=await Y0(t)),n}async function H0(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,n=t.serveLog??process.env.LMCTL_SERVE_LOG,r=t.logTailLines??1e3,s=null,i="none";if(e!==void 0)try{let u=(await fc(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,c=0;if(n===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let d=(await fc(n,"utf8")).split(`
4
+ `)}function y_(t,e){let n=t.toUpperCase();return n.includes("TOKEN")||n.includes("SECRET")||n.includes("KEY")||n.includes("PASSWORD")||n.includes("PASSWD")||n.includes("CREDENTIAL")||n.includes("AUTH")?{key:t,value:kt}:{key:t,value:vs(e)}}function vn(t){if(typeof t=="string")return vs(t);if(Array.isArray(t))return t.map(e=>vn(e));if(t!==null&&typeof t=="object"){let e={};for(let[n,r]of Object.entries(t)){let s=n.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[n]=typeof r=="string"?kt:vn(r):e[n]=vn(r)}return e}return t}function w_(t,e){for(let{name:n,re:r}of j0){let s=e.match(r);if(s!==null&&!s[0].includes(kt))throw new Kn(t,n)}}var kt,x0,h_,g_,R0,O0,$0,M0,j0,Kn,Ji=E(()=>{"use strict";kt="[REDACTED]",x0="[REDACTED_EMAIL]",h_="[REDACTED_IP]",g_="[USER]",R0=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${kt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${kt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${kt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:kt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:kt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:kt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:kt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${kt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${g_}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${g_}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:x0}],O0=["127.","10.","192.168.","0.0.0.0"];$0=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,M0=/\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;j0=[{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"'`]+/}],Kn=class extends Error{bundlePath;patternName;constructor(e,n){super(`sanitization failed: ${n} pattern matched in ${e}`),this.bundlePath=e,this.patternName=n,this.name="SanitizationError"}}});import{spawnSync as dc}from"node:child_process";import{readFileSync as P0}from"node:fs";import{readFile as fc,stat as E_}from"node:fs/promises";import{homedir as F0}from"node:os";import{join as U0}from"node:path";import{fileURLToPath as W0}from"node:url";function Ut(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(P0(W0(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function T_(t){let e=new Set(t.include??Gi),n={};return e.has("serve")&&(n.serve=await H0(t)),e.has("db")&&(n.db=B0(t)),e.has("runs")&&(n.runs=X0(t)),e.has("jobs")&&(n.jobs=J0(t)),e.has("attentions")&&(n.attentions=G0(t)),e.has("env")&&(n.env=await K0(t)),e.has("intents")&&(n.intents=await Y0(t)),n}async function H0(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,n=t.serveLog??process.env.LMCTL_SERVE_LOG,r=t.logTailLines??1e3,s=null,i="none";if(e!==void 0)try{let u=(await fc(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,c=0;if(n===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let d=(await fc(n,"utf8")).split(`
5
5
  `),f=d.slice(Math.max(0,d.length-r));c=f.length,a=Ss(f.join(`
6
6
  `))}catch(u){l=`serve log unreadable: ${u instanceof Error?u.message:String(u)}`}return{pid:s,pid_source:i,pid_alive:o,log_tail_lines:c,log_tail:a,log_note:l}}function B0(t){let{dal:e}=t,n="unknown";try{n=e.query("PRAGMA integrity_check;").map(o=>o.integrity_check??JSON.stringify(o)).join(`
7
7
  `)}catch(i){n=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let r=0;try{r=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{r=0}let s={};try{let i=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:n,schema_version:r,table_counts:s}}function X0(t){let{dal:e}=t,n=(t.now??new Date).toISOString(),r=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(n)-r).toISOString(),i=e.query(`SELECT ${uc} FROM run ORDER BY id DESC LIMIT 50`),o=e.query(`SELECT ${uc} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${uc} FROM run
@@ -11,13 +11,13 @@ var k0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
11
11
  FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:vn(n)}}async function K0(t){let e=Ut(),n=process.version,r=dc("uname",["-a"],{encoding:"utf8"}),s=Ss((r.stdout??"").trim()),i=[],o=t.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await E_(o);let u=dc("du",["-sh",o],{encoding:"utf8"});u.status===0&&i.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await E_(a);let u=dc("du",["-sh",a],{encoding:"utf8"});u.status===0&&i.push(u.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":Ss(i.join(`
12
12
  `)),c=[];for(let u of q0){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(y_(u,d))}return{lmctl_next_version:e,node_version:n,os_info:s,disk_usage:l,env_keys_present:c}}function V0(){return process.env.LMCTL_INTENT_LOG??U0(F0(),".lmctl","recent-intents.log")}async function Y0(t){let e=t.intentLog??V0(),n=t.intentLogTailLines??500;try{let s=(await fc(e,"utf8")).split(`
13
13
  `).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-n));return{source_path:e,tail_lines:i.length,tail:Ss(i.join(`
14
- `)),note:null}}catch(r){return r.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: ${r instanceof Error?r.message:String(r)}`}}}var Gi,q0,uc,bs=E(()=>{"use strict";Ji();Gi=["serve","db","runs","jobs","attentions","env","intents"];q0=["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"];uc=["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 b_,appendFileSync as z0,mkdirSync as Z0,existsSync as yz,readdirSync as wz,unlinkSync as Ez}from"node:fs";import{join as Vi,dirname as Q0}from"node:path";import{homedir as eR}from"node:os";function mc(){return Vi(eR(),".lmctl")}function k_(){vr=!0,process.env.LMCTL_DEBUG="1"}function I_(){return{cliDebug:vr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function N_(t){vr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ue(){if(vr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-S_>=tR&&(v_=sR(),S_=t),v_}function A_(){return vr||process.env.LMCTL_DEBUG==="1"}function nR(){let t=new Date,e=t.getTimezoneOffset(),n=e<=0?"+":"-",r=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",`${n}${r}:${s}`)}function je(t,e){if(e?.verbose){if(!vr)return}else if(!e?.always&&!ue())return;try{rR();let n={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};z0(Ki,JSON.stringify(n)+`
15
- `)}catch{}}function rR(){if(!Ki){let e=nR().slice(0,13).replace("T","-");Ki=Vi(mc(),`debug-${e}.log`)}Z0(Q0(Ki),{recursive:!0})}function Me(...t){je({event:"legacy",msg:t.join(" ")})}function Pe(...t){je({event:"legacy",msg:t.join(" ")},{verbose:!0})}function C(t){je(t,{always:!0})}function sR(){return iR()||oR()}function iR(){try{let t=b_(Vi(mc(),"config.toml"),"utf-8");for(let e of t.split(`
14
+ `)),note:null}}catch(r){return r.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: ${r instanceof Error?r.message:String(r)}`}}}var Gi,q0,uc,bs=E(()=>{"use strict";Ji();Gi=["serve","db","runs","jobs","attentions","env","intents"];q0=["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"];uc=["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 b_,appendFileSync as z0,mkdirSync as Z0,existsSync as yz,readdirSync as wz,unlinkSync as Ez}from"node:fs";import{join as Vi,dirname as Q0}from"node:path";import{homedir as eR}from"node:os";function mc(){return Vi(eR(),".lmctl")}function k_(){vr=!0,process.env.LMCTL_DEBUG="1"}function I_(){return{cliDebug:vr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function N_(t){vr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ue(){if(vr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-S_>=tR&&(v_=sR(),S_=t),v_}function A_(){return vr||process.env.LMCTL_DEBUG==="1"}function nR(){let t=new Date,e=t.getTimezoneOffset(),n=e<=0?"+":"-",r=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",`${n}${r}:${s}`)}function Pe(t,e){if(e?.verbose){if(!vr)return}else if(!e?.always&&!ue())return;try{rR();let n={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};z0(Ki,JSON.stringify(n)+`
15
+ `)}catch{}}function rR(){if(!Ki){let e=nR().slice(0,13).replace("T","-");Ki=Vi(mc(),`debug-${e}.log`)}Z0(Q0(Ki),{recursive:!0})}function Me(...t){Pe({event:"legacy",msg:t.join(" ")})}function Fe(...t){Pe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function C(t){Pe(t,{always:!0})}function sR(){return iR()||oR()}function iR(){try{let t=b_(Vi(mc(),"config.toml"),"utf-8");for(let e of t.split(`
16
16
  `)){let n=e.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function oR(){try{let t=b_(Vi(mc(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var vr,v_,S_,tR,Ki,ae=E(()=>{"use strict";vr=!1,v_=!1,S_=0,tR=5e3;Ki=null});var $_={};oe($_,{INFRA_CLI_CONTRACT_EXPECTED:()=>kR,INFRA_FLAT_COMMANDS:()=>C_,INFRA_NAMESPACE_COMMAND:()=>_c,infraCliEnabled:()=>Yi,isInfraCommand:()=>zi,runInfraCommand:()=>NR});function Yi(t=process.env){return t.LMCTL_INFRA_CLI==="1"||t.LMCTL_INFRA_CLI==="true"}function zi(t){return C_.includes(t)||t===_c}async function NR(t,e,n,r=AR){let s;try{s=await r()}catch{return n.stderr.write(IR),1}if(s.INFRA_CLI_CONTRACT!==1)return n.stderr.write(`lmctl: infra command library contract version ${s.INFRA_CLI_CONTRACT} does not match the version this lmctl build expects (1).
17
17
  `),1;let i=t===_c?e:[t,...e],o=s.createRuntime();return s.dispatch(i,o)}async function AR(){throw new Error("infra CLI adapter target (lmt) is retired; no successor module currently implements this contract")}var kR,C_,_c,IR,hc=E(()=>{"use strict";kR=1,C_=["lmchat","lmmail","lmnote","lmsheet","lmtext","lmsound","login","whoami","exec","tell","peers","site"],_c="auto";IR=`lmctl: infra commands (site/auto/exec/tell/peers/login/whoami/lmchat/lmmail/lmnote/lmsheet/lmtext/lmsound) are not available in this build.
18
- `});import{existsSync as xR}from"node:fs";import{createRequire as RR}from"node:module";function OR(){return gc===null&&(gc=RR(import.meta.url)("node:sqlite").DatabaseSync),gc}function yc(t){return t.length===1&&LR(t[0])?[t[0]]:t}function LR(t){if(!Tc(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Tc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var gc,wc,Vn,Ec,Zi=E(()=>{"use strict";gc=null;wc=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,n={}){if(n.fileMustExist===!0&&e!==":memory:"&&!xR(e))throw new Error("unable to open database file");this.name=e,this.handle=new(OR())(e,{readOnly:n.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Ec(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,n){let r=`PRAGMA ${e}`;if(e.includes("=")){this.exec(r);return}let s=this.prepare(r).get();return n?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...n)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...n);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let r=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${r}`);try{let s=e(...n);return this.exec(`RELEASE ${r}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${r}`),this.exec(`RELEASE ${r}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let n=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(n!==void 0){if(n==="BEGIN"||n==="SAVEPOINT"){this.transactionDepth+=1;return}if(n==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(n==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}n==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},Vn=wc,Ec=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let n=this.handle.get(...yc(e));return this.normalizeRow(n)}all(...e){return this.handle.all(...yc(e)).map(n=>this.normalizeRow(n))}run(...e){let n=this.handle.run(...yc(e));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Tc(e)?Object.values(e):Tc(e)?{...e}:e}}});import{createHash as CR}from"node:crypto";function $R(t,e,n){return CR("sha256").update(`${t}\0${e}\0${n}`).digest("hex")}function He(t,e,n){let r=$R(e.stream_id,e.intentKey??e.event_type,e.observedLastSeq),s=t.prepare(`INSERT INTO message_event (event_id, ts, stream_id, event_type, payload)
18
+ `});import{existsSync as xR}from"node:fs";import{createRequire as RR}from"node:module";function OR(){return gc===null&&(gc=RR(import.meta.url)("node:sqlite").DatabaseSync),gc}function yc(t){return t.length===1&&LR(t[0])?[t[0]]:t}function LR(t){if(!Tc(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Tc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var gc,wc,Vn,Ec,Zi=E(()=>{"use strict";gc=null;wc=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,n={}){if(n.fileMustExist===!0&&e!==":memory:"&&!xR(e))throw new Error("unable to open database file");this.name=e,this.handle=new(OR())(e,{readOnly:n.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Ec(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,n){let r=`PRAGMA ${e}`;if(e.includes("=")){this.exec(r);return}let s=this.prepare(r).get();return n?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...n)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...n);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let r=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${r}`);try{let s=e(...n);return this.exec(`RELEASE ${r}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${r}`),this.exec(`RELEASE ${r}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let n=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(n!==void 0){if(n==="BEGIN"||n==="SAVEPOINT"){this.transactionDepth+=1;return}if(n==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(n==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}n==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},Vn=wc,Ec=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let n=this.handle.get(...yc(e));return this.normalizeRow(n)}all(...e){return this.handle.all(...yc(e)).map(n=>this.normalizeRow(n))}run(...e){let n=this.handle.run(...yc(e));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Tc(e)?Object.values(e):Tc(e)?{...e}:e}}});import{createHash as CR}from"node:crypto";function $R(t,e,n){return CR("sha256").update(`${t}\0${e}\0${n}`).digest("hex")}function Be(t,e,n){let r=$R(e.stream_id,e.intentKey??e.event_type,e.observedLastSeq),s=t.prepare(`INSERT INTO message_event (event_id, ts, stream_id, event_type, payload)
19
19
  VALUES (?, ?, ?, ?, ?)
20
- ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(r,e.ts??new Date().toISOString(),e.stream_id,e.event_type,JSON.stringify(e.payload));if(a.changes===0)return{appended:!1,seq:i.get(r).seq,event_id:r};let l=Number(a.lastInsertRowid);return n(l),{appended:!0,seq:l,event_id:r}})()}var Qi=E(()=>{"use strict"});var D_={};oe(D_,{backfillEventLog:()=>vc,rebuildProjections:()=>M_});import{createHash as MR}from"node:crypto";function Yn(t,e){return t==null?null:{teamfile:t,alias:e??""}}function DR(t,e,n){return`lease_${MR("sha256").update(`${t}\0${e}\0${n}`).digest("hex").slice(0,16)}`}function eo(t,e,n,r){n.forEach((s,i)=>{He(t,{stream_id:e,event_type:s.event_type,payload:s.payload,observedLastSeq:i,ts:s.ts},()=>{}).appended?r.appended+=1:r.skipped+=1})}function jR(t){let e=`msg_tcl_${t.id}`,n=Yn(t.sender_teamfile,t.sender_alias),r=Yn(t.receiver_teamfile,t.receiver_alias),s={table:"team_chat_log",id:t.id},i={message_id:e,sender:n,receiver:r,root_teamfile:t.root_teamfile,legacy:s},o=[{event_type:le.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.message,origin:t.origin,correlation_status:"legacy-unavailable"}}];return t.status!=="running"&&o.push({event_type:le.HANDLED,ts:t.created_at,payload:{...i,outcome:t.status,receipt:t.response,error:t.error_detail,truncated:t.truncated===1}}),{streamId:e,events:o}}function PR(t){let e=`msg_mbx_${t.id}`,n=Yn(t.sender_teamfile,t.sender_alias),r=Yn(t.receiver_teamfile,t.receiver_alias),s={table:"agent_mailbox",id:t.id},i={message_id:e,sender:n,receiver:r,root_teamfile:t.root_teamfile,legacy:s},o=[];if(t.message_type==="response"){let a=t.request_mailbox_id!==null?`msg_mbx_${t.request_mailbox_id}`:null;return o.push({event_type:le.RESPONSE_CREATE,ts:t.created_at,payload:{...i,message_type:"response",content:t.payload,in_reply_to_message_id:a,correlation_status:"legacy-unavailable"}}),o.push({event_type:le.RESPONSE_ENQUEUE,ts:t.created_at,payload:{...i,message_type:"response",in_reply_to_message_id:a}}),t.delivered_at!==null&&o.push({event_type:le.RESPONSE_DELIVERED,ts:t.delivered_at,payload:{...i,message_type:"response",receipt:t.receipt}}),{streamId:e,events:o}}return o.push({event_type:le.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.payload,correlation_status:"legacy-unavailable"}}),o.push({event_type:le.ENQUEUE,ts:t.created_at,payload:{...i,message_type:"request"}}),t.waited_at!==null&&o.push({event_type:le.WAIT_REGISTER,ts:t.waited_at,payload:{...i,waited_by:t.waited_by}}),(t.delivering_at!==null||t.delivery_holder_pid!==null)&&o.push({event_type:le.DELIVER_CLAIM,ts:t.delivering_at??t.created_at,payload:{...i,pid:t.delivery_holder_pid,host:t.delivery_holder_host}}),t.delivered_at!==null&&o.push({event_type:le.DELIVERED,ts:t.delivered_at,payload:{...i,receipt:t.receipt}}),{streamId:e,events:o}}function FR(t){let e=`inv_${t.id}`,n=Yn(t.target_teamfile,t.target_alias),r={table:"tracked_invocation",id:t.id},s=[{event_type:le.INVOCATION_START,ts:t.started_at,payload:{invocation_id:e,kind:t.kind,origin:t.origin,launch_source:t.launch_source,from_identity:t.from_identity,target:n,root_teamfile:t.root_teamfile,scope_teamfile:t.scope_teamfile,cwd:t.cwd,command:t.command,request_payload:t.request_payload,started_at:t.started_at,request_message_id:t.team_chat_log_id!==null?`msg_tcl_${t.team_chat_log_id}`:null,holder_pid:t.holder_pid,holder_host:t.holder_host,legacy:r}}];return t.notified_by!==null&&s.push({event_type:le.INVOCATION_NOTIFY_CLAIM,ts:t.notified_at??t.started_at,payload:{invocation_id:e,notified_by:t.notified_by,notified_at:t.notified_at,legacy:r}}),t.status!=="running"&&s.push({event_type:le.INVOCATION_FINISH,ts:t.ended_at??t.started_at,payload:{invocation_id:e,status:t.status,ended_at:t.ended_at,exit_code:t.exit_code,signal:t.signal,result_summary:t.result_summary,error:t.error,legacy:r}}),{streamId:e,events:s}}function UR(t){let e=DR(t.receiver_teamfile,t.receiver_alias,t.started_at),n=Yn(t.receiver_teamfile,t.receiver_alias),r=Yn(t.sender_teamfile,t.sender_alias);return{streamId:e,events:[{event_type:le.INFLIGHT_TAKE,ts:t.started_at,payload:{lease_id:e,receiver:n,sender:r,holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at,legacy:{table:"agent_inflight",receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias}}}]}}function to(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function vc(t){let e={appended:0,skipped:0},n={team_chat_log:0,agent_mailbox:0,tracked_invocation:0,agent_inflight:0};t.transaction(()=>{if(to(t,"team_chat_log"))for(let i of t.prepare("SELECT * FROM team_chat_log ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=jR(i);eo(t,a,l,e),n.team_chat_log+=e.appended+e.skipped-o}if(to(t,"agent_mailbox"))for(let i of t.prepare("SELECT * FROM agent_mailbox ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=PR(i);eo(t,a,l,e),n.agent_mailbox+=e.appended+e.skipped-o}if(to(t,"tracked_invocation"))for(let i of t.prepare("SELECT * FROM tracked_invocation ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=FR(i);eo(t,a,l,e),n.tracked_invocation+=e.appended+e.skipped-o}if(to(t,"agent_inflight"))for(let i of t.prepare("SELECT * FROM agent_inflight ORDER BY receiver_teamfile, receiver_alias").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=UR(i);eo(t,a,l,e),n.agent_inflight+=e.appended+e.skipped-o}M_(t)})();let s=i=>t.prepare(`SELECT count(*) AS n FROM ${i}`).get().n;return{appended:e.appended,skipped:e.skipped,bySource:n,projections:{agent_state:s("agent_state"),message_pending:s("message_pending"),invocation_state:s("invocation_state")}}}function M_(t){t.exec("DELETE FROM agent_state"),t.exec("DELETE FROM message_pending"),t.exec("DELETE FROM invocation_state");let e=t.prepare("SELECT seq, stream_id, event_type, payload FROM message_event ORDER BY seq").all();for(let n of e){let r=JSON.parse(n.payload);WR(t,n.seq,n.stream_id,n.event_type,r)}}function xe(t,e,n){let r=t[e];return r!=null?r[n]??null:null}function WR(t,e,n,r,s){switch(r){case le.ENQUEUE:case le.RESPONSE_ENQUEUE:{let i=r===le.RESPONSE_ENQUEUE;t.prepare(`INSERT INTO message_pending
20
+ ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(r,e.ts??new Date().toISOString(),e.stream_id,e.event_type,JSON.stringify(e.payload));if(a.changes===0)return{appended:!1,seq:i.get(r).seq,event_id:r};let l=Number(a.lastInsertRowid);return n(l),{appended:!0,seq:l,event_id:r}})()}var Qi=E(()=>{"use strict"});var D_={};oe(D_,{backfillEventLog:()=>vc,rebuildProjections:()=>M_});import{createHash as MR}from"node:crypto";function Yn(t,e){return t==null?null:{teamfile:t,alias:e??""}}function DR(t,e,n){return`lease_${MR("sha256").update(`${t}\0${e}\0${n}`).digest("hex").slice(0,16)}`}function eo(t,e,n,r){n.forEach((s,i)=>{Be(t,{stream_id:e,event_type:s.event_type,payload:s.payload,observedLastSeq:i,ts:s.ts},()=>{}).appended?r.appended+=1:r.skipped+=1})}function jR(t){let e=`msg_tcl_${t.id}`,n=Yn(t.sender_teamfile,t.sender_alias),r=Yn(t.receiver_teamfile,t.receiver_alias),s={table:"team_chat_log",id:t.id},i={message_id:e,sender:n,receiver:r,root_teamfile:t.root_teamfile,legacy:s},o=[{event_type:le.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.message,origin:t.origin,correlation_status:"legacy-unavailable"}}];return t.status!=="running"&&o.push({event_type:le.HANDLED,ts:t.created_at,payload:{...i,outcome:t.status,receipt:t.response,error:t.error_detail,truncated:t.truncated===1}}),{streamId:e,events:o}}function PR(t){let e=`msg_mbx_${t.id}`,n=Yn(t.sender_teamfile,t.sender_alias),r=Yn(t.receiver_teamfile,t.receiver_alias),s={table:"agent_mailbox",id:t.id},i={message_id:e,sender:n,receiver:r,root_teamfile:t.root_teamfile,legacy:s},o=[];if(t.message_type==="response"){let a=t.request_mailbox_id!==null?`msg_mbx_${t.request_mailbox_id}`:null;return o.push({event_type:le.RESPONSE_CREATE,ts:t.created_at,payload:{...i,message_type:"response",content:t.payload,in_reply_to_message_id:a,correlation_status:"legacy-unavailable"}}),o.push({event_type:le.RESPONSE_ENQUEUE,ts:t.created_at,payload:{...i,message_type:"response",in_reply_to_message_id:a}}),t.delivered_at!==null&&o.push({event_type:le.RESPONSE_DELIVERED,ts:t.delivered_at,payload:{...i,message_type:"response",receipt:t.receipt}}),{streamId:e,events:o}}return o.push({event_type:le.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.payload,correlation_status:"legacy-unavailable"}}),o.push({event_type:le.ENQUEUE,ts:t.created_at,payload:{...i,message_type:"request"}}),t.waited_at!==null&&o.push({event_type:le.WAIT_REGISTER,ts:t.waited_at,payload:{...i,waited_by:t.waited_by}}),(t.delivering_at!==null||t.delivery_holder_pid!==null)&&o.push({event_type:le.DELIVER_CLAIM,ts:t.delivering_at??t.created_at,payload:{...i,pid:t.delivery_holder_pid,host:t.delivery_holder_host}}),t.delivered_at!==null&&o.push({event_type:le.DELIVERED,ts:t.delivered_at,payload:{...i,receipt:t.receipt}}),{streamId:e,events:o}}function FR(t){let e=`inv_${t.id}`,n=Yn(t.target_teamfile,t.target_alias),r={table:"tracked_invocation",id:t.id},s=[{event_type:le.INVOCATION_START,ts:t.started_at,payload:{invocation_id:e,kind:t.kind,origin:t.origin,launch_source:t.launch_source,from_identity:t.from_identity,target:n,root_teamfile:t.root_teamfile,scope_teamfile:t.scope_teamfile,cwd:t.cwd,command:t.command,request_payload:t.request_payload,started_at:t.started_at,request_message_id:t.team_chat_log_id!==null?`msg_tcl_${t.team_chat_log_id}`:null,holder_pid:t.holder_pid,holder_host:t.holder_host,legacy:r}}];return t.notified_by!==null&&s.push({event_type:le.INVOCATION_NOTIFY_CLAIM,ts:t.notified_at??t.started_at,payload:{invocation_id:e,notified_by:t.notified_by,notified_at:t.notified_at,legacy:r}}),t.status!=="running"&&s.push({event_type:le.INVOCATION_FINISH,ts:t.ended_at??t.started_at,payload:{invocation_id:e,status:t.status,ended_at:t.ended_at,exit_code:t.exit_code,signal:t.signal,result_summary:t.result_summary,error:t.error,legacy:r}}),{streamId:e,events:s}}function UR(t){let e=DR(t.receiver_teamfile,t.receiver_alias,t.started_at),n=Yn(t.receiver_teamfile,t.receiver_alias),r=Yn(t.sender_teamfile,t.sender_alias);return{streamId:e,events:[{event_type:le.INFLIGHT_TAKE,ts:t.started_at,payload:{lease_id:e,receiver:n,sender:r,holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at,legacy:{table:"agent_inflight",receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias}}}]}}function to(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function vc(t){let e={appended:0,skipped:0},n={team_chat_log:0,agent_mailbox:0,tracked_invocation:0,agent_inflight:0};t.transaction(()=>{if(to(t,"team_chat_log"))for(let i of t.prepare("SELECT * FROM team_chat_log ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=jR(i);eo(t,a,l,e),n.team_chat_log+=e.appended+e.skipped-o}if(to(t,"agent_mailbox"))for(let i of t.prepare("SELECT * FROM agent_mailbox ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=PR(i);eo(t,a,l,e),n.agent_mailbox+=e.appended+e.skipped-o}if(to(t,"tracked_invocation"))for(let i of t.prepare("SELECT * FROM tracked_invocation ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=FR(i);eo(t,a,l,e),n.tracked_invocation+=e.appended+e.skipped-o}if(to(t,"agent_inflight"))for(let i of t.prepare("SELECT * FROM agent_inflight ORDER BY receiver_teamfile, receiver_alias").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=UR(i);eo(t,a,l,e),n.agent_inflight+=e.appended+e.skipped-o}M_(t)})();let s=i=>t.prepare(`SELECT count(*) AS n FROM ${i}`).get().n;return{appended:e.appended,skipped:e.skipped,bySource:n,projections:{agent_state:s("agent_state"),message_pending:s("message_pending"),invocation_state:s("invocation_state")}}}function M_(t){t.exec("DELETE FROM agent_state"),t.exec("DELETE FROM message_pending"),t.exec("DELETE FROM invocation_state");let e=t.prepare("SELECT seq, stream_id, event_type, payload FROM message_event ORDER BY seq").all();for(let n of e){let r=JSON.parse(n.payload);WR(t,n.seq,n.stream_id,n.event_type,r)}}function xe(t,e,n){let r=t[e];return r!=null?r[n]??null:null}function WR(t,e,n,r,s){switch(r){case le.ENQUEUE:case le.RESPONSE_ENQUEUE:{let i=r===le.RESPONSE_ENQUEUE;t.prepare(`INSERT INTO message_pending
21
21
  (message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
22
22
  receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
23
23
  VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)
@@ -41,7 +41,7 @@ var k0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
41
41
  cwd, command, request_message_id, request_payload, holder_pid, holder_host, status, started_at, last_seq)
42
42
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?)
43
43
  ON CONFLICT(invocation_id) DO NOTHING`).run(n,s.kind??"chat",s.origin??"unknown",s.launch_source??"",s.from_identity??"",xe(s,"target","teamfile"),xe(s,"target","alias"),s.root_teamfile??null,s.cwd??null,s.command??null,s.request_message_id??null,s.request_payload??null,s.holder_pid??null,s.holder_host??null,s.started_at??"",e);break;case le.INVOCATION_FINISH:t.prepare(`UPDATE invocation_state SET status=?, ended_at=?, result_summary=?, error=?, last_seq=?
44
- WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,e,n);break;case le.INVOCATION_NOTIFY_CLAIM:t.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,e,n);break;default:break}}var le,Sc=E(()=>{"use strict";Qi();le={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"}});var B_={};oe(B_,{CURRENT_USER_VERSION:()=>ut,SchemaSkewError:()=>qt,_resetNewerSchemaWarningForTests:()=>QR,currentSchemaSkew:()=>eO,migrate:()=>ks});import{existsSync as qR,mkdirSync as HR,readFileSync as P_}from"node:fs";import{randomUUID as BR}from"node:crypto";import{homedir as XR}from"node:os";import{dirname as F_,join as JR,resolve as U_}from"node:path";import{fileURLToPath as GR,pathToFileURL as KR}from"node:url";function ks(t){t.dbPath!==":memory:"&&HR(F_(t.dbPath),{recursive:!0});let e=new Vn(t.dbPath);try{e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let n=H_(e);if(n===0)e.exec(P_(q_,"utf8")),e.pragma(`user_version = ${ut}`);else if(n>ut){if(kc={dbVersion:n,buildVersion:ut},!t.allowSchemaSkew)throw e.close(),new qt(t.dbPath,n);return ZR(t.dbPath,n),e}return YR(e,n),zR(e),e}catch(n){try{e.close()}catch{}throw n}}function YR(t,e){let n=e;if(n<2&&n!==0&&(t.exec(`
44
+ WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,e,n);break;case le.INVOCATION_NOTIFY_CLAIM:t.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,e,n);break;default:break}}var le,Sc=E(()=>{"use strict";Qi();le={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"}});var B_={};oe(B_,{CURRENT_USER_VERSION:()=>dt,SchemaSkewError:()=>qt,_resetNewerSchemaWarningForTests:()=>QR,currentSchemaSkew:()=>eO,migrate:()=>ks});import{existsSync as qR,mkdirSync as HR,readFileSync as P_}from"node:fs";import{randomUUID as BR}from"node:crypto";import{homedir as XR}from"node:os";import{dirname as F_,join as JR,resolve as U_}from"node:path";import{fileURLToPath as GR,pathToFileURL as KR}from"node:url";function ks(t){t.dbPath!==":memory:"&&HR(F_(t.dbPath),{recursive:!0});let e=new Vn(t.dbPath);try{e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let n=H_(e);if(n===0)e.exec(P_(q_,"utf8")),e.pragma(`user_version = ${dt}`);else if(n>dt){if(kc={dbVersion:n,buildVersion:dt},!t.allowSchemaSkew)throw e.close(),new qt(t.dbPath,n);return ZR(t.dbPath,n),e}return YR(e,n),zR(e),e}catch(n){try{e.close()}catch{}throw n}}function YR(t,e){let n=e;if(n<2&&n!==0&&(t.exec(`
45
45
  CREATE TABLE IF NOT EXISTS session_size (
46
46
  id INTEGER PRIMARY KEY AUTOINCREMENT,
47
47
  team_name TEXT NOT NULL,
@@ -797,9 +797,9 @@ var k0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
797
797
  FROM team_chat_log;
798
798
  DROP TABLE team_chat_log;
799
799
  ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
800
- `)}finally{t.pragma("foreign_keys = ON")}}function H_(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function ZR(t,e){bc||(bc=!0,process.stderr.write(`warning: ${t}: state.db is v${e}; this build understands v${ut} -- some newer data or features may not be visible, proceeding best-effort. Update: npm install -g @lmctl-ai/lmctl@latest
801
- `),process.argv.includes("--json")&&process.stderr.write(`${JSON.stringify({schema_skew:{db_version:e,build_version:ut,mode:"best_effort"}})}
802
- `))}function QR(){bc=!1,kc=null}function eO(){return kc}function tO(){return process.env.LMCTL_DB??JR(XR(),".lmctl","state.db")}var W_,q_,VR,ut,qt,bc,kc,Is=E(()=>{"use strict";Zi();Sc();W_=F_(GR(import.meta.url)),q_=U_(W_,"schema.sql"),VR=U_(W_,"migrations"),ut=59,qt=class extends Error{dbPath;dbVersion;buildVersion;constructor(e,n){super(`${e}: state.db is v${n}; this build understands v${ut} -- refusing to proceed rather than risk misreading newer data or corrupting it. Update: npm install -g @lmctl-ai/lmctl@latest -- or, only if you must run THIS exact build against this db right now, re-run with --allow-schema-skew (best-effort; newer data/features may be invisible).`),this.name="SchemaSkewError",this.dbPath=e,this.dbVersion=n,this.buildVersion=ut}};bc=!1;kc=null;if(process.argv[1]&&import.meta.url===KR(process.argv[1]).href){let t=ks({dbPath:process.argv[2]??tO()});try{process.stdout.write(`migrated user_version=${H_(t)}
800
+ `)}finally{t.pragma("foreign_keys = ON")}}function H_(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function ZR(t,e){bc||(bc=!0,process.stderr.write(`warning: ${t}: state.db is v${e}; this build understands v${dt} -- some newer data or features may not be visible, proceeding best-effort. Update: npm install -g @lmctl-ai/lmctl@latest
801
+ `),process.argv.includes("--json")&&process.stderr.write(`${JSON.stringify({schema_skew:{db_version:e,build_version:dt,mode:"best_effort"}})}
802
+ `))}function QR(){bc=!1,kc=null}function eO(){return kc}function tO(){return process.env.LMCTL_DB??JR(XR(),".lmctl","state.db")}var W_,q_,VR,dt,qt,bc,kc,Is=E(()=>{"use strict";Zi();Sc();W_=F_(GR(import.meta.url)),q_=U_(W_,"schema.sql"),VR=U_(W_,"migrations"),dt=59,qt=class extends Error{dbPath;dbVersion;buildVersion;constructor(e,n){super(`${e}: state.db is v${n}; this build understands v${dt} -- refusing to proceed rather than risk misreading newer data or corrupting it. Update: npm install -g @lmctl-ai/lmctl@latest -- or, only if you must run THIS exact build against this db right now, re-run with --allow-schema-skew (best-effort; newer data/features may be invisible).`),this.name="SchemaSkewError",this.dbPath=e,this.dbVersion=n,this.buildVersion=dt}};bc=!1;kc=null;if(process.argv[1]&&import.meta.url===KR(process.argv[1]).href){let t=ks({dbPath:process.argv[2]??tO()});try{process.stdout.write(`migrated user_version=${H_(t)}
803
803
  `)}finally{t.close()}}});function X_(t){return{getAgentInflight:t.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:t.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:t.prepare(`
804
804
  INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
805
805
  VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
@@ -1022,7 +1022,7 @@ var k0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
1022
1022
  AND status = 'running'
1023
1023
  AND launch_source = 'terminal'
1024
1024
  ORDER BY started_at DESC, id DESC
1025
- LIMIT 1`,e,n)[0]??null}function oO(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===Sr())?Re(t.holder_pid):aO(t)}function aO(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=Sn():!1}function ro(t,e){return t.holder_pid===null?t.started_at<e:!Re(t.holder_pid)}function Sn(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return eh;let n=Number(e);return!Number.isFinite(n)||n<=0?eh:n}function lO(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return th;let n=Number(e);return!Number.isFinite(n)||n<=0?th:n}var eh,th,Nc,ft=E(()=>{"use strict";Bt();eh=8*60*60*1e3,th=12e4,Nc=3e4});import{randomUUID as cO}from"node:crypto";import{hostname as dO}from"node:os";function bn(t,e){return{teamfile:t,alias:e}}function rh(t,e,n={}){return{teamfile:t,alias:e,...n.provider===void 0||n.provider===null?{}:{provider:n.provider},...n.sessionId===void 0||n.sessionId===null?{}:{session_id:n.sessionId}}}function xc(t,e){return t===null?null:bn(t,e??"")}function on(t){return`msg_tcl_${t}`}function Zn(t){return`inv_${t}`}function Ir(t,e,n){return t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
1025
+ LIMIT 1`,e,n)[0]??null}function oO(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===Sr())?Re(t.holder_pid):aO(t)}function aO(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=Sn():!1}function ro(t,e){return t.holder_pid===null?t.started_at<e:!Re(t.holder_pid)}function Sn(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return eh;let n=Number(e);return!Number.isFinite(n)||n<=0?eh:n}function lO(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return th;let n=Number(e);return!Number.isFinite(n)||n<=0?th:n}var eh,th,Nc,ut=E(()=>{"use strict";Bt();eh=8*60*60*1e3,th=12e4,Nc=3e4});import{randomUUID as cO}from"node:crypto";import{hostname as dO}from"node:os";function bn(t,e){return{teamfile:t,alias:e}}function rh(t,e,n={}){return{teamfile:t,alias:e,...n.provider===void 0||n.provider===null?{}:{provider:n.provider},...n.sessionId===void 0||n.sessionId===null?{}:{session_id:n.sessionId}}}function xc(t,e){return t===null?null:bn(t,e??"")}function on(t){return`msg_tcl_${t}`}function Zn(t){return`inv_${t}`}function Ir(t,e,n){return t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
1026
1026
  holder_pid, holder_host, started_at, terminal_lock_id,
1027
1027
  terminal_invocation_id, currently_handling_message_id,
1028
1028
  currently_handling_since, last_seq
@@ -1040,12 +1040,12 @@ var k0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
1040
1040
  currently_handling_since = NULL
1041
1041
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1042
1042
  AND currently_handling_message_id = ?`).run(e,n,r).changes===1}function pO(t,e){let n=e??new Date(Date.now()-Sn()).toISOString();return ro({holder_pid:t.holder_pid,started_at:t.started_at??""},n)}function _O(t,e,n){return e==="force"||e==="session-idle"?e:n?"force":t.holder_pid!==null&&!Re(t.holder_pid)?"dead-pid":"stale"}function hO(t){return{sender:xc(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at}}function Ac(t,e){return t.prepare(`SELECT message_id, lifecycle_state, delivery_lease_id, last_seq
1043
- FROM message_pending WHERE message_id = ?`).get(e)??null}function Nr(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function Oc(t,e,n){let r=on(e),s=xc(n.sender_teamfile,n.sender_alias),i=rh(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),o={message_id:r,message_type:"request",sender:s,receiver:i,root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:e}};return He(t,{stream_id:r,event_type:"CREATE",observedLastSeq:0,ts:n.created_at,payload:{...o,content:n.message,provider_prompt:n.provider_prompt??n.message,origin:n.origin,...mO(t,n.sender_teamfile,n.sender_alias)}},()=>{Rs(t,n.receiver_teamfile,n.receiver_alias,r,n.created_at)}),r}function so(t,e,n){let r=on(e),s={message_id:r,message_type:"request",sender:xc(n.sender_teamfile,n.sender_alias),receiver:rh(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:e}};return He(t,{stream_id:r,event_type:"HANDLED",observedLastSeq:1,ts:n.created_at,payload:{...s,outcome:n.status,receipt:n.response,error:n.error_detail,truncated:n.truncated===1}},()=>{Rc(t,n.receiver_teamfile,n.receiver_alias,r)}),r}function gO(t){return{sender:bn(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at}}function sh(t,e,n,r){let s=t.prepare(`UPDATE agent_state
1043
+ FROM message_pending WHERE message_id = ?`).get(e)??null}function Nr(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function Oc(t,e,n){let r=on(e),s=xc(n.sender_teamfile,n.sender_alias),i=rh(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),o={message_id:r,message_type:"request",sender:s,receiver:i,root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:e}};return Be(t,{stream_id:r,event_type:"CREATE",observedLastSeq:0,ts:n.created_at,payload:{...o,content:n.message,provider_prompt:n.provider_prompt??n.message,origin:n.origin,...mO(t,n.sender_teamfile,n.sender_alias)}},()=>{Rs(t,n.receiver_teamfile,n.receiver_alias,r,n.created_at)}),r}function so(t,e,n){let r=on(e),s={message_id:r,message_type:"request",sender:xc(n.sender_teamfile,n.sender_alias),receiver:rh(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:e}};return Be(t,{stream_id:r,event_type:"HANDLED",observedLastSeq:1,ts:n.created_at,payload:{...s,outcome:n.status,receipt:n.response,error:n.error_detail,truncated:n.truncated===1}},()=>{Rc(t,n.receiver_teamfile,n.receiver_alias,r)}),r}function gO(t){return{sender:bn(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at}}function sh(t,e,n,r){let s=t.prepare(`UPDATE agent_state
1044
1044
  SET lease_id = NULL, sender_teamfile = NULL, sender_alias = NULL,
1045
1045
  holder_pid = NULL, holder_host = NULL, started_at = NULL,
1046
1046
  last_heartbeat_at = NULL, last_seq = ?
1047
1047
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1048
- AND lease_id IS ? AND last_seq = ?`).run(n,e.receiver_teamfile,e.receiver_alias,e.lease_id,e.last_seq);Nr(s.changes,r)}function ih(t,e,n,r,s=null,i=!1){let o=dO();if(n!==null&&r===null)throw new Error("agent inflight takeover is missing a reclaim reason");let a=Ir(t,e.receiver_teamfile,e.receiver_alias);if(a!==null&&a.lease_id!==null){if(!(i||pO(a,s)))throw new Error("event projection rejected INFLIGHT_TAKE: receiver already holds a live lease");let d=_O(a,r,i),f=hO(a),m=a.lease_id;He(t,{stream_id:m,event_type:"INFLIGHT_RECLAIM",observedLastSeq:a.last_seq,ts:e.started_at,payload:{receiver:bn(e.receiver_teamfile,e.receiver_alias),reason:d,previous_holder:f}},p=>sh(t,a,p,"INFLIGHT_RECLAIM")),a=Ir(t,e.receiver_teamfile,e.receiver_alias)}let l=a?.last_seq??0,c=`lease_${cO()}`;return He(t,{stream_id:c,event_type:"INFLIGHT_TAKE",observedLastSeq:l,ts:e.started_at,payload:{lease_id:c,receiver:bn(e.receiver_teamfile,e.receiver_alias),sender:bn(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:o,started_at:e.started_at}},u=>{if(a===null){t.prepare(`INSERT INTO agent_state
1048
+ AND lease_id IS ? AND last_seq = ?`).run(n,e.receiver_teamfile,e.receiver_alias,e.lease_id,e.last_seq);Nr(s.changes,r)}function ih(t,e,n,r,s=null,i=!1){let o=dO();if(n!==null&&r===null)throw new Error("agent inflight takeover is missing a reclaim reason");let a=Ir(t,e.receiver_teamfile,e.receiver_alias);if(a!==null&&a.lease_id!==null){if(!(i||pO(a,s)))throw new Error("event projection rejected INFLIGHT_TAKE: receiver already holds a live lease");let d=_O(a,r,i),f=hO(a),m=a.lease_id;Be(t,{stream_id:m,event_type:"INFLIGHT_RECLAIM",observedLastSeq:a.last_seq,ts:e.started_at,payload:{receiver:bn(e.receiver_teamfile,e.receiver_alias),reason:d,previous_holder:f}},p=>sh(t,a,p,"INFLIGHT_RECLAIM")),a=Ir(t,e.receiver_teamfile,e.receiver_alias)}let l=a?.last_seq??0,c=`lease_${cO()}`;return Be(t,{stream_id:c,event_type:"INFLIGHT_TAKE",observedLastSeq:l,ts:e.started_at,payload:{lease_id:c,receiver:bn(e.receiver_teamfile,e.receiver_alias),sender:bn(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:o,started_at:e.started_at}},u=>{if(a===null){t.prepare(`INSERT INTO agent_state
1049
1049
  (receiver_teamfile, receiver_alias, lease_id, sender_teamfile,
1050
1050
  sender_alias, holder_pid, holder_host, started_at,
1051
1051
  last_heartbeat_at, last_seq)
@@ -1059,11 +1059,11 @@ var k0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
1059
1059
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1060
1060
  AND lease_id = ?
1061
1061
  AND sender_teamfile = ? AND sender_alias = ?
1062
- AND started_at = ? AND holder_pid IS ?`).run(r,e.receiver_teamfile,e.receiver_alias,n,e.sender_teamfile,e.sender_alias,e.started_at,e.holder_pid).changes===1}function Os(t,e,n,r){let s=Ir(t,e.receiver_teamfile,e.receiver_alias);s===null||s.lease_id===null||He(t,{stream_id:s.lease_id,event_type:n,observedLastSeq:s.last_seq,payload:{receiver:bn(e.receiver_teamfile,e.receiver_alias),...n==="INFLIGHT_RECLAIM"?{reason:r??"stale",previous_holder:gO(e)}:{lease_id:s.lease_id}}},i=>sh(t,s,i,n))}function ah(t,e){let n=Ir(t,e.teamfile,e.alias),r=n?.last_seq??0;He(t,{stream_id:e.lock_id,event_type:"TERMINAL_LOCK_TAKE",observedLastSeq:r,ts:e.started_at,payload:{receiver:bn(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at}},s=>{if(n===null){t.prepare(`INSERT INTO agent_state
1062
+ AND started_at = ? AND holder_pid IS ?`).run(r,e.receiver_teamfile,e.receiver_alias,n,e.sender_teamfile,e.sender_alias,e.started_at,e.holder_pid).changes===1}function Os(t,e,n,r){let s=Ir(t,e.receiver_teamfile,e.receiver_alias);s===null||s.lease_id===null||Be(t,{stream_id:s.lease_id,event_type:n,observedLastSeq:s.last_seq,payload:{receiver:bn(e.receiver_teamfile,e.receiver_alias),...n==="INFLIGHT_RECLAIM"?{reason:r??"stale",previous_holder:gO(e)}:{lease_id:s.lease_id}}},i=>sh(t,s,i,n))}function ah(t,e){let n=Ir(t,e.teamfile,e.alias),r=n?.last_seq??0;Be(t,{stream_id:e.lock_id,event_type:"TERMINAL_LOCK_TAKE",observedLastSeq:r,ts:e.started_at,payload:{receiver:bn(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at}},s=>{if(n===null){t.prepare(`INSERT INTO agent_state
1063
1063
  (receiver_teamfile, receiver_alias, terminal_lock_id, last_seq)
1064
1064
  VALUES (?, ?, ?, ?)`).run(e.teamfile,e.alias,e.lock_id,s);return}let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = ?, last_seq = ?
1065
1065
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1066
- AND terminal_lock_id IS NULL AND last_seq = ?`).run(e.lock_id,s,e.teamfile,e.alias,n.last_seq);Nr(i.changes,"TERMINAL_LOCK_TAKE")})}function Lc(t,e,n=!1){let r=Ir(t,e.teamfile,e.alias);r===null||r.terminal_lock_id!==e.lock_id||He(t,{stream_id:e.lock_id,event_type:n?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE",observedLastSeq:r.last_seq,payload:{receiver:bn(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host}},s=>{let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = NULL, last_seq = ?
1066
+ AND terminal_lock_id IS NULL AND last_seq = ?`).run(e.lock_id,s,e.teamfile,e.alias,n.last_seq);Nr(i.changes,"TERMINAL_LOCK_TAKE")})}function Lc(t,e,n=!1){let r=Ir(t,e.teamfile,e.alias);r===null||r.terminal_lock_id!==e.lock_id||Be(t,{stream_id:e.lock_id,event_type:n?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE",observedLastSeq:r.last_seq,payload:{receiver:bn(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host}},s=>{let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = NULL, last_seq = ?
1067
1067
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1068
1068
  AND terminal_lock_id = ? AND last_seq = ?`).run(s,e.teamfile,e.alias,e.lock_id,r.last_seq);Nr(i.changes,n?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE")})}function lh(t,e,n){let r=Ir(t,n.targetTeamfile,n.targetAlias);if(r===null){t.prepare(`INSERT INTO agent_state
1069
1069
  (receiver_teamfile, receiver_alias, terminal_invocation_id,
@@ -1086,19 +1086,19 @@ var k0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
1086
1086
  AND terminal_invocation_id = ? AND last_seq = ?`).run(e,r.receiver_teamfile,r.receiver_alias,n,r.last_seq);Nr(s.changes,"terminal INVOCATION_FINISH")}function uh(t,e){let n=e.ts??new Date().toISOString();return t.transaction(()=>{let r=t.prepare(`SELECT seq FROM message_event
1087
1087
  WHERE stream_id = ? AND event_type = 'MESSAGE_HANDLING_STARTED'
1088
1088
  AND json_extract(payload, '$.handling_by') = ?
1089
- ORDER BY seq LIMIT 1`).get(e.messageId,e.handlingBy);if(r!==void 0)return Rs(t,e.handlingTeamfile,e.handlingAlias,e.messageId,n),{appended:!1,seq:r.seq,handling_at:n};let s=t.prepare("SELECT COALESCE(MAX(seq), 0) AS s FROM message_event WHERE stream_id = ?").get(e.messageId).s,i=He(t,{stream_id:e.messageId,event_type:"MESSAGE_HANDLING_STARTED",intentKey:`MESSAGE_HANDLING_STARTED:${e.handlingBy}`,observedLastSeq:s,ts:n,payload:{handling_by:e.handlingBy,handling_at:n}},()=>{Rs(t,e.handlingTeamfile,e.handlingAlias,e.messageId,n)});return{appended:i.appended,seq:i.seq,handling_at:n}})()}function fh(t,e){let n=t.prepare(`SELECT seq FROM message_event
1089
+ ORDER BY seq LIMIT 1`).get(e.messageId,e.handlingBy);if(r!==void 0)return Rs(t,e.handlingTeamfile,e.handlingAlias,e.messageId,n),{appended:!1,seq:r.seq,handling_at:n};let s=t.prepare("SELECT COALESCE(MAX(seq), 0) AS s FROM message_event WHERE stream_id = ?").get(e.messageId).s,i=Be(t,{stream_id:e.messageId,event_type:"MESSAGE_HANDLING_STARTED",intentKey:`MESSAGE_HANDLING_STARTED:${e.handlingBy}`,observedLastSeq:s,ts:n,payload:{handling_by:e.handlingBy,handling_at:n}},()=>{Rs(t,e.handlingTeamfile,e.handlingAlias,e.messageId,n)});return{appended:i.appended,seq:i.seq,handling_at:n}})()}function fh(t,e){let n=t.prepare(`SELECT seq FROM message_event
1090
1090
  WHERE stream_id = ? AND event_type = 'MESSAGE_ACKNOWLEDGED'
1091
1091
  AND json_extract(payload, '$.acked_by') = ?
1092
- ORDER BY seq LIMIT 1`).get(e.messageId,e.ackedBy),r=e.terminalizePending===!0,s=()=>t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?"removed":Ac(t,e.messageId)===null?"not-pending":"claimed";if(n!==void 0)return{appended:!1,seq:n.seq,pending_outcome:r?s():"record-only"};let i=t.prepare("SELECT COALESCE(MAX(seq), 0) AS s FROM message_event WHERE stream_id = ?").get(e.messageId).s,o=Ac(t,e.messageId),a=r?"not-pending":"record-only",l=He(t,{stream_id:e.messageId,event_type:"MESSAGE_ACKNOWLEDGED",intentKey:`MESSAGE_ACKNOWLEDGED:${e.ackedBy}`,observedLastSeq:i,...e.ts!==void 0?{ts:e.ts}:{},payload:{acked_by:e.ackedBy,acked_at:e.ts??new Date().toISOString(),...e.note!==void 0?{note:e.note}:{},pid:e.holderPid??null,host:e.holderHost??null}},()=>{if(!r)return;t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?a="removed":o!==null&&(a="claimed")});if(!l.appended){let c=Ac(t,e.messageId);a=r?c===null?"removed":"claimed":"record-only"}return{appended:l.appended,seq:l.seq,pending_outcome:a}}var uO,Ls=E(()=>{"use strict";Qi();ft();Bt();uO=60*60*1e3});function mh(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function Cc(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function ph(t,e){let n=Zn(e.id),r=e.target_teamfile===null?null:{teamfile:e.target_teamfile,alias:e.target_alias??""},s=e.last_heartbeat_at??e.started_at;He(t,{stream_id:n,event_type:yO,observedLastSeq:0,ts:e.started_at,payload:{invocation_id:n,kind:e.kind,origin:e.origin,launch_source:e.launch_source,from_identity:e.from_identity,target:r,root_teamfile:e.root_teamfile,scope_teamfile:e.scope_teamfile,cwd:e.cwd,command:e.command,request_payload:e.request_payload,request_message_id:e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,legacy:{table:"tracked_invocation",id:e.id}}},i=>{t.prepare(`INSERT INTO invocation_state
1092
+ ORDER BY seq LIMIT 1`).get(e.messageId,e.ackedBy),r=e.terminalizePending===!0,s=()=>t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?"removed":Ac(t,e.messageId)===null?"not-pending":"claimed";if(n!==void 0)return{appended:!1,seq:n.seq,pending_outcome:r?s():"record-only"};let i=t.prepare("SELECT COALESCE(MAX(seq), 0) AS s FROM message_event WHERE stream_id = ?").get(e.messageId).s,o=Ac(t,e.messageId),a=r?"not-pending":"record-only",l=Be(t,{stream_id:e.messageId,event_type:"MESSAGE_ACKNOWLEDGED",intentKey:`MESSAGE_ACKNOWLEDGED:${e.ackedBy}`,observedLastSeq:i,...e.ts!==void 0?{ts:e.ts}:{},payload:{acked_by:e.ackedBy,acked_at:e.ts??new Date().toISOString(),...e.note!==void 0?{note:e.note}:{},pid:e.holderPid??null,host:e.holderHost??null}},()=>{if(!r)return;t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?a="removed":o!==null&&(a="claimed")});if(!l.appended){let c=Ac(t,e.messageId);a=r?c===null?"removed":"claimed":"record-only"}return{appended:l.appended,seq:l.seq,pending_outcome:a}}var uO,Ls=E(()=>{"use strict";Qi();ut();Bt();uO=60*60*1e3});function mh(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function Cc(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function ph(t,e){let n=Zn(e.id),r=e.target_teamfile===null?null:{teamfile:e.target_teamfile,alias:e.target_alias??""},s=e.last_heartbeat_at??e.started_at;Be(t,{stream_id:n,event_type:yO,observedLastSeq:0,ts:e.started_at,payload:{invocation_id:n,kind:e.kind,origin:e.origin,launch_source:e.launch_source,from_identity:e.from_identity,target:r,root_teamfile:e.root_teamfile,scope_teamfile:e.scope_teamfile,cwd:e.cwd,command:e.command,request_payload:e.request_payload,request_message_id:e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,legacy:{table:"tracked_invocation",id:e.id}}},i=>{t.prepare(`INSERT INTO invocation_state
1093
1093
  (invocation_id, kind, origin, launch_source, from_identity, target_teamfile, target_alias,
1094
1094
  root_teamfile, cwd, command, request_message_id, request_payload, holder_pid, holder_host,
1095
1095
  status, started_at, last_heartbeat_at, last_seq)
1096
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,i),Cc(e)&&lh(t,i,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function io(t,e){let n=Zn(e.id),r=mh(t,n);return r===null?!1:(He(t,{stream_id:n,event_type:wO,observedLastSeq:r.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:n,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
1096
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,i),Cc(e)&&lh(t,i,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function io(t,e){let n=Zn(e.id),r=mh(t,n);return r===null?!1:(Be(t,{stream_id:n,event_type:wO,observedLastSeq:r.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:n,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
1097
1097
  SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
1098
- WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);Cc(e)&&dh(t,s,n)}),!0)}function _h(t,e,n,r){let s=Zn(e.id),i=mh(t,s);return i===null?!1:(He(t,{stream_id:s,event_type:EO,observedLastSeq:i.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},o=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,o,s,i.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function hh(t,e,n){let r=Zn(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),Cc(e)&&ch(t,r,n)}function gh(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Zn(e))}function yh(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Zn(e))}var yO,wO,EO,wh=E(()=>{"use strict";Qi();Ls();yO="INVOCATION_START",wO="INVOCATION_FINISH",EO="INVOCATION_NOTIFY_CLAIM"});function Ar(t){return typeof t=="string"&&TO.has(t)}function vh(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: ${oo[0]}`,` STANCE: ${oo[1]}`,` STANCE: ${oo[2]}`,` STANCE: ${Eh}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
1099
- `)}var Eh,oo,TO,Cs,Th,$c,ao,$s=E(()=>{"use strict";Eh="other",oo=["not_enough_information","dont_know","other_work"],TO=new Set([Eh,...oo]),Cs="@abort",Th="invalid_decision",$c="escalation_aborted",ao="workflow_escalation"});import{randomUUID as Sh}from"node:crypto";import{existsSync as Ah,mkdirSync as vO,renameSync as SO,rmdirSync as bO}from"node:fs";import{hostname as Mc}from"node:os";function Qe(t){return t.provider_resolved??t.provider}function P(){return new Date().toISOString()}function kO(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!Ah(t))return e;let n;try{n=new Vn(t,{readonly:!0})}catch{return e}try{let r=[];try{r=n.prepare("SELECT teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at FROM root_team").all()}catch{}let s=[];try{s=n.prepare("SELECT key, value FROM lmctl_config").all()}catch{}return{rootTeams:r,config:s}}finally{n.close()}}function IO(t){if(t===":memory:"||!Ah(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{SO(r,`${e}${n}`)}catch{}}return e}function bh(t,e){let n=e instanceof Error?e.message:String(e);try{let r=kO(t),s=IO(t),i=new lo(ks({dbPath:t}));for(let o of r.rootTeams)i.upsertRootTeam(o);for(let{key:o,value:a}of r.config)i.setConfig(o,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${ut} (${n}); started a fresh database instead. Preserved ${r.rootTeams.length} team registration(s) and ${r.config.length} config value(s).`+(s!==null?` Old database backed up at ${s}.
1098
+ WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);Cc(e)&&dh(t,s,n)}),!0)}function _h(t,e,n,r){let s=Zn(e.id),i=mh(t,s);return i===null?!1:(Be(t,{stream_id:s,event_type:EO,observedLastSeq:i.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},o=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,o,s,i.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function hh(t,e,n){let r=Zn(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),Cc(e)&&ch(t,r,n)}function gh(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Zn(e))}function yh(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Zn(e))}var yO,wO,EO,wh=E(()=>{"use strict";Qi();Ls();yO="INVOCATION_START",wO="INVOCATION_FINISH",EO="INVOCATION_NOTIFY_CLAIM"});function Ar(t){return typeof t=="string"&&TO.has(t)}function vh(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: ${oo[0]}`,` STANCE: ${oo[1]}`,` STANCE: ${oo[2]}`,` STANCE: ${Eh}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
1099
+ `)}var Eh,oo,TO,Cs,Th,$c,ao,$s=E(()=>{"use strict";Eh="other",oo=["not_enough_information","dont_know","other_work"],TO=new Set([Eh,...oo]),Cs="@abort",Th="invalid_decision",$c="escalation_aborted",ao="workflow_escalation"});import{randomUUID as Sh}from"node:crypto";import{existsSync as Ah,mkdirSync as vO,renameSync as SO,rmdirSync as bO}from"node:fs";import{hostname as Mc}from"node:os";function Ze(t){return t.provider_resolved??t.provider}function P(){return new Date().toISOString()}function kO(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!Ah(t))return e;let n;try{n=new Vn(t,{readonly:!0})}catch{return e}try{let r=[];try{r=n.prepare("SELECT teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at FROM root_team").all()}catch{}let s=[];try{s=n.prepare("SELECT key, value FROM lmctl_config").all()}catch{}return{rootTeams:r,config:s}}finally{n.close()}}function IO(t){if(t===":memory:"||!Ah(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{SO(r,`${e}${n}`)}catch{}}return e}function bh(t,e){let n=e instanceof Error?e.message:String(e);try{let r=kO(t),s=IO(t),i=new lo(ks({dbPath:t}));for(let o of r.rootTeams)i.upsertRootTeam(o);for(let{key:o,value:a}of r.config)i.setConfig(o,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${dt} (${n}); started a fresh database instead. Preserved ${r.rootTeams.length} team registration(s) and ${r.config.length} config value(s).`+(s!==null?` Old database backed up at ${s}.
1100
1100
  `:`
1101
- `)),i}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${t}: unusable (${n}), and recovery into a fresh database also failed (${s}). Check that the containing directory is writable, or move the file aside manually and retry.`)}}function kh(t,e){let n;try{return n=ks({dbPath:t,allowSchemaSkew:e}),{dal:new lo(n)}}catch(r){if(r instanceof qt)throw r;let s;if(n!==void 0)try{s=n.pragma("user_version",{simple:!0})}catch{}try{n?.close()}catch{}return{cause:r,dbVersion:s}}}function RO(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function OO(t){if(t===":memory:")return!0;try{return vO(`${t}${xh}`),!0}catch{return!1}}function LO(t){if(t!==":memory:")try{bO(`${t}${xh}`)}catch{}}function Be(t){let e=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1",n={};for(let r=0;r<NO;r+=1)if(n=kh(t.path,e),n.dal!==void 0)return n.dal;if(n.dbVersion!==void 0&&n.dbVersion>ut){let r=n.cause instanceof Error?n.cause.message:String(n.cause);throw new Error(`${t.path}: state.db schema is v${n.dbVersion}; this build (understands v${ut}) can no longer operate on it (${r}). Update lmctl: npm install -g @lmctl-ai/lmctl@latest`)}for(let r=0;r<AO;r+=1){if(OO(t.path))try{return bh(t.path,n.cause)}finally{LO(t.path)}RO(xO);let s=kh(t.path,e);if(s.dal!==void 0)return s.dal}return bh(t.path,n.cause)}function Ih(t,e,n){let r=Nh(e);if(r.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Nh(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let u of o(l))a(u)}finally{i.pop()}s.add(l)}};a(t)}function Nh(t){let e=CO(t),n=e===null?null:$O(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))co(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function CO(t){try{let e=JSON.parse(t);return co(e)?e:null}catch{return null}}function $O(t,e){let n=t[e];return co(n)?n:null}function co(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function MO(t){try{let e=JSON.parse(t);return!co(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function DO(t,e){return t===null?!0:t.holder_host===Mc()?!Re(t.holder_pid):t.last_heartbeat<e}function jO(t){return{getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
1101
+ `)),i}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${t}: unusable (${n}), and recovery into a fresh database also failed (${s}). Check that the containing directory is writable, or move the file aside manually and retry.`)}}function kh(t,e){let n;try{return n=ks({dbPath:t,allowSchemaSkew:e}),{dal:new lo(n)}}catch(r){if(r instanceof qt)throw r;let s;if(n!==void 0)try{s=n.pragma("user_version",{simple:!0})}catch{}try{n?.close()}catch{}return{cause:r,dbVersion:s}}}function RO(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function OO(t){if(t===":memory:")return!0;try{return vO(`${t}${xh}`),!0}catch{return!1}}function LO(t){if(t!==":memory:")try{bO(`${t}${xh}`)}catch{}}function Xe(t){let e=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1",n={};for(let r=0;r<NO;r+=1)if(n=kh(t.path,e),n.dal!==void 0)return n.dal;if(n.dbVersion!==void 0&&n.dbVersion>dt){let r=n.cause instanceof Error?n.cause.message:String(n.cause);throw new Error(`${t.path}: state.db schema is v${n.dbVersion}; this build (understands v${dt}) can no longer operate on it (${r}). Update lmctl: npm install -g @lmctl-ai/lmctl@latest`)}for(let r=0;r<AO;r+=1){if(OO(t.path))try{return bh(t.path,n.cause)}finally{LO(t.path)}RO(xO);let s=kh(t.path,e);if(s.dal!==void 0)return s.dal}return bh(t.path,n.cause)}function Ih(t,e,n){let r=Nh(e);if(r.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Nh(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let u of o(l))a(u)}finally{i.pop()}s.add(l)}};a(t)}function Nh(t){let e=CO(t),n=e===null?null:$O(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))co(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function CO(t){try{let e=JSON.parse(t);return co(e)?e:null}catch{return null}}function $O(t,e){let n=t[e];return co(n)?n:null}function co(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function MO(t){try{let e=JSON.parse(t);return!co(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function DO(t,e){return t===null?!0:t.holder_host===Mc()?!Re(t.holder_pid):t.last_heartbeat<e}function jO(t){return{getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
1102
1102
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
1103
1103
  VALUES (?, ?, ?, ?, ?)
1104
1104
  ON CONFLICT(scope, key, kind) DO UPDATE SET
@@ -1505,11 +1505,11 @@ var k0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
1505
1505
  response = NULL
1506
1506
  WHERE id = ?
1507
1507
  AND status = 'running'
1508
- `),...K_(t),...X_(t)}}function PO(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var NO,xh,AO,xO,lo,mt=E(()=>{"use strict";Zi();Is();J_();V_();z_();Bt();Ls();wh();$s();NO=3,xh=".recovery.lock",AO=20,xO=50;lo=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=jO(e),this.claimTxn=e.transaction((n,r,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(n,r,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((n,r,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(n,r,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((n,r,s,i,o)=>{let a=this.getJob(n);if(a===null)return{claimed:!1,reason:"not_found",job_id:n};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=o(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,i,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(r,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:n,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:n}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((n,r,s)=>PO("state_not_found")),this.resumeInteractiveTxn=e.transaction((n,r,s,i)=>{let o=this.getInteractiveSessionByStepId(n);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,r,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(n),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ao)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let u=JSON.parse(i.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(o=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(r!==Cs&&!a.includes(r))return{resumed:!1,reason:Th};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[o]=r,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,n),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(n,r={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(n.receiver_teamfile,n.receiver_alias),i=r.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...n,holder_pid:process.pid,stale_before:r.stale_before??null,force:r.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:r.reclaim_reason??(r.force===!0?"force":r.reclaim_observed!==void 0?"dead-pid":"stale"),c=ih(this.db,o,s,l,r.stale_before??null,r.force===!0);a={acquired:!0,current:o,lease_id:c}}else a={acquired:!1,current:this.getAgentInflight(n.receiver_teamfile,n.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...n){let r=e.trim().toLowerCase();if(!r.startsWith("select")&&!r.startsWith("with")&&!r.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...n)}insertWorkflow(e){Ih(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,P()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,e.definition,e.author??null,P());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,e.definition),i}upsertWorkflow(e){Ih(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(e.name);if(n===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(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,e.definition,e.author??null,P());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??n.definition_schema_version,s,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,e.definition),this.getWorkflow(n.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,n){return(n===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,n))??null}findWorkflowByName(e,n){return this.getWorkflowByName(e,n)}insertWorkflowVersion(e,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,n,r??null,P());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(r.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(n,r.definition,s,e),this.syncWorkflowTriggers(e,r.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,n){return this.stmts.setTriggerCursor.run(n,P(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,n){return this.stmts.setTriggerFailure.run(P(),n,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,n){let r;try{r=JSON.parse(n)}catch{return}if(r===null||typeof r!="object"||Array.isArray(r))return;let s=r.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let n=this.stmts.insertTeam.run(e.name,P());return this.stmts.getTeam.get(n.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 n=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(n.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,n){return this.stmts.findTeamMemberByAlias.get(e,n)??null}updateTeamMemberSession(e,n){return this.stmts.updateTeamMemberSession.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,n,r){return this.stmts.setMemberState.run(n,r??null,P(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,n){return this.stmts.setMemberPromptSnapshot.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,n){return this.stmts.setMemberProviderResolved.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,n){return this.stmts.setMemberRolePrompt.run(n,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,n){let r=this.stmts.getTeamMember.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"role_prompt"),i=Object.prototype.hasOwnProperty.call(n,"model"),o=Object.prototype.hasOwnProperty.call(n,"provider");return this.stmts.updateTeamMemberMeta.run(s?n.role_prompt??null:r.role_prompt,i?n.model??null:r.model,o?n.provider??r.provider:r.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let n=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,P());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(e){let n=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(n.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,n){return this.stmts.setProjectIntakeConfig.run(n,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,n){let r=this.stmts.getProject.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"local_path"),i=Object.prototype.hasOwnProperty.call(n,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(n,"default_branch"),a=Object.prototype.hasOwnProperty.call(n,"intake_config");return this.stmts.updateProjectSettings.run(s?n.local_path:r.local_path,i?n.durable_memory_mode:r.durable_memory_mode,o?n.default_branch??null:r.default_branch,a?n.intake_config??null:r.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 n=JSON.parse(e.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let n=e.condition??null,r=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,n,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,n)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,n={}){return n.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,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let n=P(),r=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,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,n={}){return this.stmts.listIssuesForProject.all(e).filter(r=>!(n.status!==void 0&&!n.status.includes(r.status)||n.severity!==void 0&&!n.severity.includes(r.severity)||n.ai_test_path!==void 0&&r.ai_test_path!==n.ai_test_path))}claimNextIssue(e,n){return this.stmts.claimNextIssue.get(n,P(),e)??null}claimIssue(e,n){return this.stmts.claimIssue.get(n,P(),e)??null}closeIssue(e,n,r){let s=P(),i=this.stmts.closeIssue.get(n,r??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,n){let r=this.stmts.reopenIssue.get(n,P(),e);if(r===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return r}updateIssue(e,n){let r=this.getIssue(e);if(r===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(n,"labels"),i=Object.prototype.hasOwnProperty.call(n,"ai_test_path"),o=this.stmts.updateIssue.get(n.title??r.title,n.body??r.body,n.severity??r.severity,s?n.labels??null:r.labels,i?n.ai_test_path??null:r.ai_test_path,P(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,n){let r=this.stmts.getWebuiSession.get(e);if(r!==void 0)return r;let s=P();return this.stmts.insertWebuiSession.run(e,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,n){if(this.stmts.setWebuiSessionChatbot.run(n,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,n){let r=Sh(),s=P();return this.stmts.insertChatbotSession.run(r,e,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,n,r,s){let i=P(),o=this.stmts.insertChatbotMessage.run(e,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,n){this.stmts.upsertConfig.run(e,n,P())}getConfigAll(){let e=this.stmts.listConfig.all(),n={};for(let r of e)n[r.key]=r.value;return n}enqueueJob(e){let n=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(n.changes===1)return this.stmts.getJob.get(n.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 n=P(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,r,n)}claimNextJobWithConcurrency(e){let n=P(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,r,n,e.evaluator)}claimJobByIdWithConcurrency(e){let n=P(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,r,n,e.evaluator)}releaseJob(e,n,r){let s=n==="queued"||n==="running"?null:P();return this.stmts.releaseJob.run(n,r??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,n){return this.stmts.findJobByDedupe.get(e,n)??null}insertRun(e){let n=this.getWorkflow(e.workflow_id);if(n===null)throw new Error(`workflow not found: ${e.workflow_id}`);let r=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,n.active_version_id,e.parent_run_id??null,P()),s=this.stmts.getRun.get(r.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,n){return this.stmts.setJobRun.run(n,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,n){return this.stmts.setPromptDispatchCompleted.run(n??P(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let n=e.id??"default";this.stmts.ensureWorkspace.run(n,e.name??"Default workspace",e.idleThresholdMs??6e5,P());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let n=P(),r=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,n,n),s=Number(r.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let n=this.getWebProject(e.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??n.name,e.config_json===void 0?n.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,n){return this.stmts.loadMailboxCursor.get(e,n)??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,n,r){return this.stmts.loadUsage.get(e,n,r)??null}sumUsageForPeriod(e,n){let r=this.stmts.sumUsageForPeriod.get(e,n);return{put:r?.put??0,get:r?.get??0,list:r?.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){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),r=Number(n.lastInsertRowid);return Oc(this.db,r,e),so(this.db,r,e),r})()}beginTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),r=Number(n.lastInsertRowid);return Oc(this.db,r,e),r})()}finishTeamChatLog(e,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);so(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{Rs(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>Rc(this.db,e,n,r))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,n=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let n=e.started_at??P(),r=e.holder_host??Mc(),s=e.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Ht(e.command),n,e.holder_pid??null,r,s,Ht(e.meta),e.launch_source??e.kind,e.request_payload??null,e.parent_invocation_id??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return ph(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,n,r={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,n];r.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(r.sinceMs).toISOString())),r.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(r.untilMs).toISOString()));let o=Math.max(1,Math.trunc(r.limit??200));return this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${s.join(" AND ")} ORDER BY started_at DESC LIMIT ?`).all(...i,o)}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}listRecentlyFinishedTrackedInvocations(e){return this.stmts.listRecentlyFinishedTrackedInvocations.all(e)}finishTrackedInvocation(e,n){return this.db.transaction(()=>{let r=n.ended_at??P();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,Ht(n.result_summary),Ht(n.error),n.team_chat_log_id??null,Ht(n.meta),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return io(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,n,r){return this.db.transaction(()=>{let s=r.ended_at??P();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,Ht(r.result_summary),Ht(r.error),r.team_chat_log_id??null,Ht(r.meta),s,e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return io(this.db,o),o})()}heartbeatTrackedInvocation(e,n=P()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return hh(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(gh(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:(yh(this.db,e,on(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=P();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Ht(r),e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return io(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(e,n){let r=this.stmts.getTeamChatLogById.get(e);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,e).changes!==1||so(this.db,e,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:P()})}listClaimableTerminalTrackedInvocations(e){let n=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(e,n,r=P()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return _h(this.db,i,n,r),i})()}listTrackedInvocations(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status)),e.kind!==void 0&&(n.push("kind = ?"),r.push(e.kind)),e.origin!==void 0&&(n.push("origin = ?"),r.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));r.push(s);let i=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}updateTeamChatLogResponse(e,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e)}getAgentInflight(e,n){return this.stmts.getAgentInflight.get(e,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,n){return this.tryAcquireAgentInflightTxn(e,n)}heartbeatAgentInflight(e,n,r=P()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:oh(this.db,s,n,r)})()}clearAgentInflight(e,n){this.db.transaction(()=>{let s=this.getAgentInflight(e,n);if(s===null)return;this.stmts.clearAgentInflight.run(e,n).changes===1&&Os(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(e,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return o.changes===1&&i!==null&&Os(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,n){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(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
1509
- WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&Os(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Os(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(Ns,xs(e,n),As);return r===void 0?null:Y_(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&Lc(this.db,r,!0),this.stmts.upsertRuntimeState.run(Ns,xs(e.teamfile,e.alias),As,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&ah(this.db,e)})()}heartbeatTerminalLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,n);if(i===null||i.lock_id!==r)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Ns,xs(e,n),As,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Ns,xs(e,n),As);return i.changes===1&&Lc(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,n,r){let s=this.stmts.getRuntimeState.get(e,n,r);return s===void 0?null:MO(s.data)}tryAcquireRuntimeProcessLock(e,n,r,s,i=P()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,n,r);if(o!==null&&!DO(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Sh(),holder_pid:process.pid,holder_host:Mc(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,n,r,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,n){return this.stmts.setRunCurrentState.run(n,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,n,r){return this.stmts.setRunPausedState.run(n,r,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,n){return this.stmts.setRunPendingEscalationDecision.run(n,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,n){return this.stmts.setRunTerminalState.run(n,P(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,n){return this.resumeRunTxn(e,n,P())}insertStep(e){let n=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(n.lastInsertRowid)}finishStep(e,n,r){return this.stmts.finishStep.run(n??null,r??null,P(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let n=this.stmts.listLatestStepOutcomesByState.all(e),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(e){let n=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(n.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 n=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(n.lastInsertRowid)}insertExternalObject(e){let r=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:r}}insertExternalSignal(e){let n=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()),r=n.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:r}}raiseAttention(e){let n=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(n.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(P(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let n=P();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,n,n),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,n){return this.stmts.getDurableMemoryByName.get(e,n)??null}deleteDurableMemory(e,n){return this.stmts.deleteDurableMemory.run(e,n).changes>0}listDurableMemory(e,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(e,n):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(e).filter(s=>n.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(e){let n=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(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,n,r=20){return this.stmts.sessionSizeHistory.all(e,n,r)}insertSessionEvent(e){let n=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(n.lastInsertRowid)}listSessionEvents(e,n){return n!==void 0?this.stmts.listSessionEventsSince.all(e,n):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,n=1e3){return this.stmts.listAllEventsSince.all(e,n)}latestAgentCall(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(n===void 0)return null;try{let r=JSON.parse(n.payload);return typeof r.alias!="string"||typeof r.provider!="string"?null:{alias:r.alias,provider:r.provider,...typeof r.model=="string"?{model:r.model}:{}}}catch{return null}}agentCallTokenTotals(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),r=0,s=0,i=0;for(let o of n)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(r+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:r,totalOutputTokens:s,agentCallCount:i}}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 n=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(n.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,n,r){return this.stmts.findUnackedDrift.get(e,n??null,r)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let n=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,n,n),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,n){return this.stmts.getInteractiveSessionByRunAndState.get(e,n)??null}setInteractiveAgentOutput(e,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),e)}resumeInteractive(e,n,r){return this.resumeInteractiveTxn(e,n,r,P())}resumeEscalation(e,n){return this.resumeEscalationTxn(e,n,P())}}});import{realpathSync as FO}from"node:fs";import{resolve as UO}from"node:path";function Dc(t){let e=UO(t);try{return FO(e)}catch{return e}}var Rh=E(()=>{"use strict"});import{platform as Oh}from"node:os";function Jt(t){let e=new Ms;for(let n of t)e.registerAdapter(n);return e}var Ms,jc=E(()=>{"use strict";Rh();Ms=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(e?.workspace){let o=Dc(e.workspace);i=i.filter(a=>Dc(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=Oh()==="darwin"||Oh()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as Lh}from"node:fs";import{createInterface as Ch}from"node:readline";import{stat as WO}from"node:fs/promises";import{homedir as qO}from"node:os";function $h(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*Xe(t){let e=Lh(t,{encoding:"utf-8"}),n=Ch({input:e,crlfDelay:1/0});try{for await(let r of n){let s=r.trim();if(!s)continue;let i=$h(s);i!==void 0&&(yield i)}}finally{e.destroy()}}async function Ke(t,e){let n=[],r=Lh(t,{encoding:"utf-8"}),s=Ch({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=$h(o);if(a!==void 0&&n.push(a),n.length>=e)break}}finally{s.close(),r.destroy()}return n}async function Le(t){let e=await WO(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function _e(t){return t.replace(/\\n/g,`
1510
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function pt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var ge,Nt=E(()=>{"use strict";ge=qO()});import{readdir as uo,stat as Mh,unlink as HO}from"node:fs/promises";import{join as xr,basename as Dh}from"node:path";function BO(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function XO(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return _e(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 jh(t){let e=0,n=0,r=0,s=0,i=0,o=0,a;for await(let l of Xe(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;n+=d+f+m,r+=m,s+=f,i+=p;let h=d+f+m;h&&(o=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}function JO(t){let e=GO(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/Command running in background with ID:\s*([A-Za-z0-9_-]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function GO(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var fo,Ph=E(()=>{"use strict";Nt();fo=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||xr(ge,".claude"),this.projectsDir=xr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await uo(this.projectsDir)}catch{return e}for(let r of n){let s=xr(this.projectsDir,r);if(!(await Mh(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await uo(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Dh(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=xr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,n){let r=await Ke(e,50),s=await Le(e),i="",o,a,l,c,u,d;for(let m of r)if(!BO(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=G(p.trim(),80)),u=G(p.trim(),80)}}if(!i)return null;let f=await jh(e);return{provider:"claude",sessionId:n,slug:o,cwd:i,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 n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d,f,m=e,p;for await(let _ of Xe(n))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:XO(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let y=new Date(_.timestamp||0),g=_.message.content;if(typeof g=="string"){if(g.includes("<command-name>")||g.includes("<local-command-"))continue;u||(u=G(g.trim(),80)),d=G(g.trim(),80),p=void 0,s.push({role:"user",timestamp:y,content:_e(g.trim())})}else if(Array.isArray(g)){for(let w of g)if(w.type==="tool_result"){let T=typeof w.content=="string"?_e(w.content):JSON.stringify(w.content);s.push({role:"tool_result",timestamp:y,content:T,toolCallId:w.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.stop_reason===null||_.message.stop_reason==="tool_use"?p="in_progress":typeof _.message.stop_reason=="string"&&(p="complete"),_.message.model&&(l=_.message.model);let y=new Date(_.timestamp||0),g=_.message.content;if(Array.isArray(g))for(let w of g)w.type==="text"&&w.text?s.push({role:"assistant",timestamp:y,content:_e(w.text),model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):w.type==="tool_use"?s.push({role:"tool_use",timestamp:y,content:w.name||"unknown tool",toolName:w.name,toolInput:JSON.stringify(w.input,null,2),toolInputData:w.input,toolCallId:w.id,model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):w.type==="thinking"&&w.thinking&&s.push({role:"thinking",timestamp:y,content:w.thinking})}}if(!i)return null;JO(s);let h=await jh(n);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||r.createdAt,modifiedAt:r.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,turnStatus:p,firstUserMessage:u,lastUserMessage:d,messageCount:h.messageCount,filePath:n,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:h.totalCacheWriteInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await HO(n),!0):!1}async resolveSessionFile(e){let n;try{n=await uo(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=xr(this.projectsDir,o);if(!(await Mh(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await uo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Dh(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&r.push({filePath:xr(a,u),fileSessionId:d})}}let s=r.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of r){let a=await Ke(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{readFileSync as KO,writeFileSync as P6,mkdirSync as F6}from"node:fs";import{join as VO,dirname as W6}from"node:path";import{homedir as YO}from"node:os";function ZO(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function QO(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=ZO(t.slice(e+1).trim());return n?{key:n,value:r}:null}function eL(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function mo(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function tL(){return VO(YO(),".lmctl","config.toml")}function Uh(t){let e=t??tL(),n;try{n=KO(e,"utf-8")}catch{return{tools:{}}}return nL(n)}function Fh(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function nL(t){let e={},n={},r=t.split(`
1511
- `),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let d=e[s.tool]??{};if(s.profile){let f=d.profiles?.[s.profile]??{};i.description&&(f.description=i.description),i.flags!==void 0&&(f.flags=i.flags),d.profiles||(d.profiles={}),d.profiles[s.profile]=f}else i.start&&(d.start=i.start),i.resume&&(d.resume=i.resume),i.agent&&(d.agent=i.agent),i.profile_flag!==void 0&&(d.profile_flag=i.profile_flag);e[s.tool]=d}else if(s.kind==="compact"){let d=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let f=Fh(i.min);f!==null&&(d.min=f)}if(i.max!==void 0){let f=Fh(i.max);f!==null&&(d.max=f)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=d):n.global=d}i={}}for(let d of r){let f=d.trim();if(!f||f.startsWith("#"))continue;let m=eL(f);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let h=".profile.",_=m.indexOf(h);_!==-1?s={kind:"tool",tool:m.slice(5,_),profile:m.slice(_+h.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=QO(f);p&&s.kind!=="none"?i[p.key]=p.value:p&&!o&&(a[p.key]=p.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let u=a.site_name;return u!==void 0&&u.length>0&&(c.site_name=u),c}function Wh(t){return t.site_name??null}function rL(t,e,n){if(!n)return"";let r=t.tools[e]??Pc[e],s=r?.profiles?.[n]?.flags??Pc[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function qh(t,e){return!!t.tools[e]}function Hh(t,e,n,r,s){let i=t.tools[e]??Pc[e],o;if(i?.agent){let l=mo(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=zO[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let u=c.map(mo).join(" ");o=`printf '%s\\n' ${mo(r)} | ${u}`}else o=c.map(mo).join(" ")}let a=rL(t,e,s);return a&&(o+=" "+a),o}var Pc,zO,Fc=E(()=>{"use strict";Pc={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:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}},hermes:{start:"hermes",resume:"hermes --yolo --resume {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}}},zO={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"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]},hermes:{mode:"argv",argv:["hermes","--yolo","-z","{{prompt}}","--resume","{{session_id}}"]}}});function Bh(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var Xh=E(()=>{"use strict"});var sL,ce,po,it=E(()=>{"use strict";sL="ACK: waiting for explicit lmctl task.",ce=`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: ${sL}`,po=`send this exact lmctl seed instruction: "${ce}"`});import{existsSync as iL}from"node:fs";function Jh(t){let e=t.CLAUDE_CODE_EXECPATH;if(e===void 0||e.length===0)return t;let n=process.platform!=="win32"&&e.toLowerCase().endsWith(".exe"),r=!n&&!iL(e);if(!n&&!r)return t;C({event:"claude_execpath_sanitized",reason:n?"wrong_platform_exe":"missing_file",value:e,platform:process.platform});let s={...t};return delete s.CLAUDE_CODE_EXECPATH,s}function kn(t,e){let n={...t??process.env,PWD:e};return delete n.OLDPWD,n}function aL(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Ds]:e}}function Ve(t,e,n,r="chat"){return{...aL(kn(t,e),n),[oL]:r}}var Ds,oL,At=E(()=>{"use strict";ae();Ds="LMCTL_SELF_SESSIONID",oL="LMCTL_LAUNCH_SOURCE"});function _o(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var Uc=E(()=>{"use strict"});import{spawn as Gh}from"node:child_process";import{mkdirSync as lL}from"node:fs";var Wc,Te,_t=E(()=>{"use strict";Fc();Xh();it();At();Uc();Wc=class t extends Error{cancelReason;constructor(e,n){super(e),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,t.prototype)}},Te=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 n=e?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===ce?n:r)}turnOptsFor(e){return e}seed(e,n){return lL(e,{recursive:!0}),new Promise(r=>{let s;try{s=Gh(this.binary,this.seedArgsFor(n),{cwd:e,env:kn(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return r({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=n?.prompt!==void 0&&this.seedStdin!==void 0?`${n.prompt}
1512
- `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{if(a===0||a===null)r({success:!0});else{let l=_o(i).trim();r({success:!1,error:l.slice(0,500)||`exit code ${a}`})}}),s.on("error",a=>{r({success:!1,error:a.message})})})}resumeCommand(e,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:po,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,n){let r=this.turnOptsFor(n);if(r.userConfig&&qh(r.userConfig,this.name)){let i=r.userConfig.tools[this.name];if(i?.agent)return this.runOneShotAgent(e,r,i.agent)}let s=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return s<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(s,e,r)}withTimeouts(e,n,r){let s=new AbortController,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:r.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let d={...r,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),r.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),r.onProgress?.(p)}},f=this.transportFn(n,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),o==="external"?new Wc("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,n,r){let s=Hh(n.userConfig,this.name,n.sessionId,e,n.profile),i=Date.now();return new Promise((o,a)=>{let l=Bh(n.env),c=Gh(s,{shell:!0,cwd:n.cwd,env:Ve(n.env,n.cwd,n.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 _=h.toString();m+=_,n.onDelta?.(_)}),c.stderr?.on("data",h=>{p+=h.toString()}),n.signal){if(n.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let _=Date.now()-i;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:n.sessionId,durationMs:_}):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 go(t,e){let n;if(e&&typeof e=="object"){let r=e.code;typeof r=="number"&&(n=r)}return new ln(t,n,e)}var ht,we,an,ho,ln,Rr=E(()=>{"use strict";ht=class extends Error{constructor(e,n){super(e,n),this.name=this.constructor.name}},we=class extends ht{},an=class extends ht{exitCode;signal;stderr;constructor(e,n,r=null,s){super(e),this.exitCode=n,this.signal=r,this.stderr=s}},ho=class extends ht{line;constructor(e,n,r){super(e,{cause:r}),this.line=n}},ln=class extends ht{rpcCode;rpcData;constructor(e,n,r){super(e),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as Hc from"node:child_process";function dL(t){if(typeof Hc.spawnSync=="function")try{Hc.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Kh(t){return t.exitCode!==null||t.signalCode!==null}function qc(t,e){return Kh(t)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,t.removeListener("exit",s),n(!1))},e);t.once("exit",s)})}async function et(t,e={}){let n=Date.now(),r=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??dL;if(Kh(t))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await qc(t,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await qc(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await qc(t,cL)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var cL,js=E(()=>{"use strict";cL=1e3});function Vh(t){ue()&&je({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function In(t,e){let n=fL[t];if(n)return n[e]??n.yolo}function pL(t,e){if(e.length===0)return!0;for(let n=0;n+e.length<=t.length;n++){let r=!0;for(let s=0;s<e.length;s++)if(t[n+s]!==e[s]){r=!1;break}if(r)return!0}return!1}function tt(t,e,n="yolo"){if(mL.has(t)){Vh(`YOLO ${t} [mode=${n}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:t==="dsh"?"DSH_PERMISSION_MODE=danger-full-access env var on the sidecar spawn \u2014 no argv flag":t==="hermes"?"HERMES_YOLO_MODE=1 shell gate + ACP session/set_mode (modeId=dont_ask) edit gate":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?In(t,"plan"):uL[t];if(!r){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 C({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new we(s)}if(!pL(e,r)){let s=r.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw C({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:n,args:e.join(" "),message:i}),new we(i)}Vh(`YOLO ${t} [mode=${n}]: argv flag '${r.join(" ")}'`)}var uL,fL,mL,Qn=E(()=>{"use strict";Rr();ae();uL={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},fL={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};mL=new Set(["codex","opencode","kimi","dsh","hermes"])});async function EL(t,e,n){if(typeof t=="boolean")return t;let r,s;try{return await Promise.race([t,new Promise(i=>{r=setTimeout(()=>i(Bc),e),r.unref?.(),n!==void 0&&(s=()=>i(Bc),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function yo(t,e){if(t===void 0){e.closeStdin();return}let n=!1,r=i=>{if(!n){n=!0;try{t.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}e.closeStdin()},s=Date.now();TL(t,e,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function TL(t,e,n,r){let s=t.pollMs??_L,i=t.maxHoldMs??hL,o=t.settleMs??gL,a=t.backgroundGraceMs??yL,l=!1,c=null,u=d=>r({startedMs:n,held:l,reason:d});for(;;){if(e.isAborted())return u("aborted");if(e.hasChildExited())return u("child-exited");let d=i-(Date.now()-n);if(d<=0)return u("max-hold");let f;try{f=await EL(t.hasOutstandingWork(),d,e.signal)}catch{return u("check-error")}if(f===Bc)return u(e.isAborted()||e.signal?.aborted===!0?"aborted":"max-hold");if(f)c=null;else{if(!l&&e.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let h=a-(Date.now()-n);await new Promise(_=>setTimeout(_,Math.max(0,Math.min(s,wL,h))).unref?.());continue}if(!l||o<=0)return u("cleared");c===null&&(c=Date.now(),Pe(`${e.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let p=Math.max(c,e.lastEventAtMs());if(!e.isTurnInFlight()&&Date.now()-p>=o)return u("cleared")}if(l||(l=!0,t.onHold?.(),Pe(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return C({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-n}),u("max-hold");let m=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(p=>setTimeout(p,m).unref?.())}}var _L,hL,gL,yL,wL,Bc,Xc=E(()=>{"use strict";ae();_L=2e3,hL=8*60*60*1e3,gL=5e3,yL=1e3,wL=50,Bc=Symbol("check-timed-out")});function Yh(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let n=0;n<t.length;n++)n===0?e.push(t[n]):e.push(`
1508
+ `),...K_(t),...X_(t)}}function PO(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var NO,xh,AO,xO,lo,ft=E(()=>{"use strict";Zi();Is();J_();V_();z_();Bt();Ls();wh();$s();NO=3,xh=".recovery.lock",AO=20,xO=50;lo=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=jO(e),this.claimTxn=e.transaction((n,r,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(n,r,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((n,r,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(n,r,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((n,r,s,i,o)=>{let a=this.getJob(n);if(a===null)return{claimed:!1,reason:"not_found",job_id:n};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=o(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,i,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(r,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:n,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:n}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((n,r,s)=>PO("state_not_found")),this.resumeInteractiveTxn=e.transaction((n,r,s,i)=>{let o=this.getInteractiveSessionByStepId(n);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,r,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(n),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ao)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let u=JSON.parse(i.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(o=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(r!==Cs&&!a.includes(r))return{resumed:!1,reason:Th};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[o]=r,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,n),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(n,r={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(n.receiver_teamfile,n.receiver_alias),i=r.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...n,holder_pid:process.pid,stale_before:r.stale_before??null,force:r.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:r.reclaim_reason??(r.force===!0?"force":r.reclaim_observed!==void 0?"dead-pid":"stale"),c=ih(this.db,o,s,l,r.stale_before??null,r.force===!0);a={acquired:!0,current:o,lease_id:c}}else a={acquired:!1,current:this.getAgentInflight(n.receiver_teamfile,n.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...n){let r=e.trim().toLowerCase();if(!r.startsWith("select")&&!r.startsWith("with")&&!r.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...n)}insertWorkflow(e){Ih(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,P()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,e.definition,e.author??null,P());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,e.definition),i}upsertWorkflow(e){Ih(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(e.name);if(n===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(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,e.definition,e.author??null,P());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??n.definition_schema_version,s,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,e.definition),this.getWorkflow(n.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,n){return(n===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,n))??null}findWorkflowByName(e,n){return this.getWorkflowByName(e,n)}insertWorkflowVersion(e,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,n,r??null,P());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(r.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(n,r.definition,s,e),this.syncWorkflowTriggers(e,r.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,n){return this.stmts.setTriggerCursor.run(n,P(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,n){return this.stmts.setTriggerFailure.run(P(),n,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,n){let r;try{r=JSON.parse(n)}catch{return}if(r===null||typeof r!="object"||Array.isArray(r))return;let s=r.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let n=this.stmts.insertTeam.run(e.name,P());return this.stmts.getTeam.get(n.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 n=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(n.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,n){return this.stmts.findTeamMemberByAlias.get(e,n)??null}updateTeamMemberSession(e,n){return this.stmts.updateTeamMemberSession.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,n,r){return this.stmts.setMemberState.run(n,r??null,P(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,n){return this.stmts.setMemberPromptSnapshot.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,n){return this.stmts.setMemberProviderResolved.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,n){return this.stmts.setMemberRolePrompt.run(n,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,n){let r=this.stmts.getTeamMember.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"role_prompt"),i=Object.prototype.hasOwnProperty.call(n,"model"),o=Object.prototype.hasOwnProperty.call(n,"provider");return this.stmts.updateTeamMemberMeta.run(s?n.role_prompt??null:r.role_prompt,i?n.model??null:r.model,o?n.provider??r.provider:r.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let n=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,P());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(e){let n=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(n.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,n){return this.stmts.setProjectIntakeConfig.run(n,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,n){let r=this.stmts.getProject.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"local_path"),i=Object.prototype.hasOwnProperty.call(n,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(n,"default_branch"),a=Object.prototype.hasOwnProperty.call(n,"intake_config");return this.stmts.updateProjectSettings.run(s?n.local_path:r.local_path,i?n.durable_memory_mode:r.durable_memory_mode,o?n.default_branch??null:r.default_branch,a?n.intake_config??null:r.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 n=JSON.parse(e.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let n=e.condition??null,r=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,n,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,n)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,n={}){return n.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,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let n=P(),r=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,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,n={}){return this.stmts.listIssuesForProject.all(e).filter(r=>!(n.status!==void 0&&!n.status.includes(r.status)||n.severity!==void 0&&!n.severity.includes(r.severity)||n.ai_test_path!==void 0&&r.ai_test_path!==n.ai_test_path))}claimNextIssue(e,n){return this.stmts.claimNextIssue.get(n,P(),e)??null}claimIssue(e,n){return this.stmts.claimIssue.get(n,P(),e)??null}closeIssue(e,n,r){let s=P(),i=this.stmts.closeIssue.get(n,r??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,n){let r=this.stmts.reopenIssue.get(n,P(),e);if(r===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return r}updateIssue(e,n){let r=this.getIssue(e);if(r===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(n,"labels"),i=Object.prototype.hasOwnProperty.call(n,"ai_test_path"),o=this.stmts.updateIssue.get(n.title??r.title,n.body??r.body,n.severity??r.severity,s?n.labels??null:r.labels,i?n.ai_test_path??null:r.ai_test_path,P(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,n){let r=this.stmts.getWebuiSession.get(e);if(r!==void 0)return r;let s=P();return this.stmts.insertWebuiSession.run(e,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,n){if(this.stmts.setWebuiSessionChatbot.run(n,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,n){let r=Sh(),s=P();return this.stmts.insertChatbotSession.run(r,e,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,n,r,s){let i=P(),o=this.stmts.insertChatbotMessage.run(e,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,n){this.stmts.upsertConfig.run(e,n,P())}getConfigAll(){let e=this.stmts.listConfig.all(),n={};for(let r of e)n[r.key]=r.value;return n}enqueueJob(e){let n=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(n.changes===1)return this.stmts.getJob.get(n.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 n=P(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,r,n)}claimNextJobWithConcurrency(e){let n=P(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,r,n,e.evaluator)}claimJobByIdWithConcurrency(e){let n=P(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,r,n,e.evaluator)}releaseJob(e,n,r){let s=n==="queued"||n==="running"?null:P();return this.stmts.releaseJob.run(n,r??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,n){return this.stmts.findJobByDedupe.get(e,n)??null}insertRun(e){let n=this.getWorkflow(e.workflow_id);if(n===null)throw new Error(`workflow not found: ${e.workflow_id}`);let r=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,n.active_version_id,e.parent_run_id??null,P()),s=this.stmts.getRun.get(r.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,n){return this.stmts.setJobRun.run(n,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,n){return this.stmts.setPromptDispatchCompleted.run(n??P(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let n=e.id??"default";this.stmts.ensureWorkspace.run(n,e.name??"Default workspace",e.idleThresholdMs??6e5,P());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let n=P(),r=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,n,n),s=Number(r.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let n=this.getWebProject(e.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??n.name,e.config_json===void 0?n.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,n){return this.stmts.loadMailboxCursor.get(e,n)??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,n,r){return this.stmts.loadUsage.get(e,n,r)??null}sumUsageForPeriod(e,n){let r=this.stmts.sumUsageForPeriod.get(e,n);return{put:r?.put??0,get:r?.get??0,list:r?.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){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),r=Number(n.lastInsertRowid);return Oc(this.db,r,e),so(this.db,r,e),r})()}beginTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),r=Number(n.lastInsertRowid);return Oc(this.db,r,e),r})()}finishTeamChatLog(e,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);so(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{Rs(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>Rc(this.db,e,n,r))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,n=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let n=e.started_at??P(),r=e.holder_host??Mc(),s=e.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Ht(e.command),n,e.holder_pid??null,r,s,Ht(e.meta),e.launch_source??e.kind,e.request_payload??null,e.parent_invocation_id??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return ph(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,n,r={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,n];r.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(r.sinceMs).toISOString())),r.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(r.untilMs).toISOString()));let o=Math.max(1,Math.trunc(r.limit??200));return this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${s.join(" AND ")} ORDER BY started_at DESC LIMIT ?`).all(...i,o)}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}listRecentlyFinishedTrackedInvocations(e){return this.stmts.listRecentlyFinishedTrackedInvocations.all(e)}finishTrackedInvocation(e,n){return this.db.transaction(()=>{let r=n.ended_at??P();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,Ht(n.result_summary),Ht(n.error),n.team_chat_log_id??null,Ht(n.meta),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return io(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,n,r){return this.db.transaction(()=>{let s=r.ended_at??P();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,Ht(r.result_summary),Ht(r.error),r.team_chat_log_id??null,Ht(r.meta),s,e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return io(this.db,o),o})()}heartbeatTrackedInvocation(e,n=P()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return hh(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(gh(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:(yh(this.db,e,on(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=P();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Ht(r),e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return io(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(e,n){let r=this.stmts.getTeamChatLogById.get(e);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,e).changes!==1||so(this.db,e,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:P()})}listClaimableTerminalTrackedInvocations(e){let n=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(e,n,r=P()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return _h(this.db,i,n,r),i})()}listTrackedInvocations(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status)),e.kind!==void 0&&(n.push("kind = ?"),r.push(e.kind)),e.origin!==void 0&&(n.push("origin = ?"),r.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));r.push(s);let i=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}updateTeamChatLogResponse(e,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e)}getAgentInflight(e,n){return this.stmts.getAgentInflight.get(e,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,n){return this.tryAcquireAgentInflightTxn(e,n)}heartbeatAgentInflight(e,n,r=P()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:oh(this.db,s,n,r)})()}clearAgentInflight(e,n){this.db.transaction(()=>{let s=this.getAgentInflight(e,n);if(s===null)return;this.stmts.clearAgentInflight.run(e,n).changes===1&&Os(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(e,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return o.changes===1&&i!==null&&Os(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,n){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(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
1509
+ WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&Os(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Os(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(Ns,xs(e,n),As);return r===void 0?null:Y_(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&Lc(this.db,r,!0),this.stmts.upsertRuntimeState.run(Ns,xs(e.teamfile,e.alias),As,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&ah(this.db,e)})()}heartbeatTerminalLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,n);if(i===null||i.lock_id!==r)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Ns,xs(e,n),As,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Ns,xs(e,n),As);return i.changes===1&&Lc(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,n,r){let s=this.stmts.getRuntimeState.get(e,n,r);return s===void 0?null:MO(s.data)}tryAcquireRuntimeProcessLock(e,n,r,s,i=P()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,n,r);if(o!==null&&!DO(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Sh(),holder_pid:process.pid,holder_host:Mc(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,n,r,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,n){return this.stmts.setRunCurrentState.run(n,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,n,r){return this.stmts.setRunPausedState.run(n,r,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,n){return this.stmts.setRunPendingEscalationDecision.run(n,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,n){return this.stmts.setRunTerminalState.run(n,P(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,n){return this.resumeRunTxn(e,n,P())}insertStep(e){let n=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(n.lastInsertRowid)}finishStep(e,n,r){return this.stmts.finishStep.run(n??null,r??null,P(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let n=this.stmts.listLatestStepOutcomesByState.all(e),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(e){let n=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(n.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 n=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(n.lastInsertRowid)}insertExternalObject(e){let r=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:r}}insertExternalSignal(e){let n=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()),r=n.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:r}}raiseAttention(e){let n=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(n.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(P(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let n=P();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,n,n),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,n){return this.stmts.getDurableMemoryByName.get(e,n)??null}deleteDurableMemory(e,n){return this.stmts.deleteDurableMemory.run(e,n).changes>0}listDurableMemory(e,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(e,n):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(e).filter(s=>n.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(e){let n=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(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,n,r=20){return this.stmts.sessionSizeHistory.all(e,n,r)}insertSessionEvent(e){let n=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(n.lastInsertRowid)}listSessionEvents(e,n){return n!==void 0?this.stmts.listSessionEventsSince.all(e,n):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,n=1e3){return this.stmts.listAllEventsSince.all(e,n)}latestAgentCall(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(n===void 0)return null;try{let r=JSON.parse(n.payload);return typeof r.alias!="string"||typeof r.provider!="string"?null:{alias:r.alias,provider:r.provider,...typeof r.model=="string"?{model:r.model}:{}}}catch{return null}}agentCallTokenTotals(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),r=0,s=0,i=0;for(let o of n)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(r+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:r,totalOutputTokens:s,agentCallCount:i}}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 n=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(n.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,n,r){return this.stmts.findUnackedDrift.get(e,n??null,r)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let n=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,n,n),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,n){return this.stmts.getInteractiveSessionByRunAndState.get(e,n)??null}setInteractiveAgentOutput(e,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),e)}resumeInteractive(e,n,r){return this.resumeInteractiveTxn(e,n,r,P())}resumeEscalation(e,n){return this.resumeEscalationTxn(e,n,P())}}});import{realpathSync as FO}from"node:fs";import{resolve as UO}from"node:path";function Dc(t){let e=UO(t);try{return FO(e)}catch{return e}}var Rh=E(()=>{"use strict"});import{platform as Oh}from"node:os";function Jt(t){let e=new Ms;for(let n of t)e.registerAdapter(n);return e}var Ms,jc=E(()=>{"use strict";Rh();Ms=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(e?.workspace){let o=Dc(e.workspace);i=i.filter(a=>Dc(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=Oh()==="darwin"||Oh()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as Lh}from"node:fs";import{createInterface as Ch}from"node:readline";import{stat as WO}from"node:fs/promises";import{homedir as qO}from"node:os";function $h(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*De(t){let e=Lh(t,{encoding:"utf-8"}),n=Ch({input:e,crlfDelay:1/0});try{for await(let r of n){let s=r.trim();if(!s)continue;let i=$h(s);i!==void 0&&(yield i)}}finally{e.destroy()}}async function It(t,e){let n=[],r=Lh(t,{encoding:"utf-8"}),s=Ch({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=$h(o);if(a!==void 0&&n.push(a),n.length>=e)break}}finally{s.close(),r.destroy()}return n}async function Le(t){let e=await WO(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function _e(t){return t.replace(/\\n/g,`
1510
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function H(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function mt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var ge,Nt=E(()=>{"use strict";ge=qO()});import{readdir as uo,stat as Mh,unlink as HO}from"node:fs/promises";import{join as xr,basename as Dh}from"node:path";function BO(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function XO(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return _e(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 jh(t){let e=0,n=0,r=0,s=0,i=0,o=0,a,l;for await(let c of De(t))if(!c.isSidechain){if(c.type==="user"&&!c.isMeta&&c.message){let u=c.message.content;if(typeof u=="string"){if(u.includes("<command-name>")||u.includes("<local-command-"))continue;e++,l=H(u.trim(),80)}}else if(c.type==="assistant"&&c.message){let u=c.message.content;if(Array.isArray(u))for(let f of u)f.type==="text"&&e++;let d=c.message.usage;if(d){let f=d.input_tokens||0,m=d.cache_creation_input_tokens||0,p=d.cache_read_input_tokens||0,h=d.output_tokens||0;n+=f+m+p,r+=p,s+=m,i+=h;let _=f+m+p;_&&(o=_),a={inputTokens:f,cacheWriteInputTokens:m,cachedInputTokens:p,outputTokens:h}}}}return{messageCount:e,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a,lastUserMessage:l}}function JO(t){let e=GO(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/Command running in background with ID:\s*([A-Za-z0-9_-]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function GO(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var fo,Ph=E(()=>{"use strict";Nt();fo=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||xr(ge,".claude"),this.projectsDir=xr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await uo(this.projectsDir)}catch{return e}for(let r of n){let s=xr(this.projectsDir,r);if(!(await Mh(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await uo(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Dh(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=xr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,n){let r=await It(e,50),s=await Le(e),i="",o,a,l,c,u,d;for(let m of r)if(!BO(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=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=H(p.trim(),80)),u=H(p.trim(),80)}}if(!i)return null;let f=await jh(e);return{provider:"claude",sessionId:n,slug:o,cwd:i,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:f.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 n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d,f,m=e,p;for await(let _ of De(n))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:XO(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let y=new Date(_.timestamp||0),g=_.message.content;if(typeof g=="string"){if(g.includes("<command-name>")||g.includes("<local-command-"))continue;u||(u=H(g.trim(),80)),d=H(g.trim(),80),p=void 0,s.push({role:"user",timestamp:y,content:_e(g.trim())})}else if(Array.isArray(g)){for(let w of g)if(w.type==="tool_result"){let T=typeof w.content=="string"?_e(w.content):JSON.stringify(w.content);s.push({role:"tool_result",timestamp:y,content:T,toolCallId:w.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.stop_reason===null||_.message.stop_reason==="tool_use"?p="in_progress":typeof _.message.stop_reason=="string"&&(p="complete"),_.message.model&&(l=_.message.model);let y=new Date(_.timestamp||0),g=_.message.content;if(Array.isArray(g))for(let w of g)w.type==="text"&&w.text?s.push({role:"assistant",timestamp:y,content:_e(w.text),model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):w.type==="tool_use"?s.push({role:"tool_use",timestamp:y,content:w.name||"unknown tool",toolName:w.name,toolInput:JSON.stringify(w.input,null,2),toolInputData:w.input,toolCallId:w.id,model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):w.type==="thinking"&&w.thinking&&s.push({role:"thinking",timestamp:y,content:w.thinking})}}if(!i)return null;JO(s);let h=await jh(n);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||r.createdAt,modifiedAt:r.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,turnStatus:p,firstUserMessage:u,lastUserMessage:d,messageCount:h.messageCount,filePath:n,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:h.totalCacheWriteInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await HO(n),!0):!1}async resolveSessionFile(e){let n;try{n=await uo(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=xr(this.projectsDir,o);if(!(await Mh(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await uo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Dh(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&r.push({filePath:xr(a,u),fileSessionId:d})}}let s=r.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of r){let a=await It(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{readFileSync as KO,writeFileSync as P6,mkdirSync as F6}from"node:fs";import{join as VO,dirname as W6}from"node:path";import{homedir as YO}from"node:os";function ZO(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function QO(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=ZO(t.slice(e+1).trim());return n?{key:n,value:r}:null}function eL(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function mo(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function tL(){return VO(YO(),".lmctl","config.toml")}function Uh(t){let e=t??tL(),n;try{n=KO(e,"utf-8")}catch{return{tools:{}}}return nL(n)}function Fh(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function nL(t){let e={},n={},r=t.split(`
1511
+ `),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let d=e[s.tool]??{};if(s.profile){let f=d.profiles?.[s.profile]??{};i.description&&(f.description=i.description),i.flags!==void 0&&(f.flags=i.flags),d.profiles||(d.profiles={}),d.profiles[s.profile]=f}else i.start&&(d.start=i.start),i.resume&&(d.resume=i.resume),i.agent&&(d.agent=i.agent),i.profile_flag!==void 0&&(d.profile_flag=i.profile_flag);e[s.tool]=d}else if(s.kind==="compact"){let d=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let f=Fh(i.min);f!==null&&(d.min=f)}if(i.max!==void 0){let f=Fh(i.max);f!==null&&(d.max=f)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=d):n.global=d}i={}}for(let d of r){let f=d.trim();if(!f||f.startsWith("#"))continue;let m=eL(f);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let h=".profile.",_=m.indexOf(h);_!==-1?s={kind:"tool",tool:m.slice(5,_),profile:m.slice(_+h.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=QO(f);p&&s.kind!=="none"?i[p.key]=p.value:p&&!o&&(a[p.key]=p.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let u=a.site_name;return u!==void 0&&u.length>0&&(c.site_name=u),c}function Wh(t){return t.site_name??null}function rL(t,e,n){if(!n)return"";let r=t.tools[e]??Pc[e],s=r?.profiles?.[n]?.flags??Pc[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function qh(t,e){return!!t.tools[e]}function Hh(t,e,n,r,s){let i=t.tools[e]??Pc[e],o;if(i?.agent){let l=mo(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=zO[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let u=c.map(mo).join(" ");o=`printf '%s\\n' ${mo(r)} | ${u}`}else o=c.map(mo).join(" ")}let a=rL(t,e,s);return a&&(o+=" "+a),o}var Pc,zO,Fc=E(()=>{"use strict";Pc={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:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}},hermes:{start:"hermes",resume:"hermes --yolo --resume {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}}},zO={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"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]},hermes:{mode:"argv",argv:["hermes","--yolo","-z","{{prompt}}","--resume","{{session_id}}"]}}});function Bh(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var Xh=E(()=>{"use strict"});var sL,ce,po,st=E(()=>{"use strict";sL="ACK: waiting for explicit lmctl task.",ce=`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: ${sL}`,po=`send this exact lmctl seed instruction: "${ce}"`});import{existsSync as iL}from"node:fs";function Jh(t){let e=t.CLAUDE_CODE_EXECPATH;if(e===void 0||e.length===0)return t;let n=process.platform!=="win32"&&e.toLowerCase().endsWith(".exe"),r=!n&&!iL(e);if(!n&&!r)return t;C({event:"claude_execpath_sanitized",reason:n?"wrong_platform_exe":"missing_file",value:e,platform:process.platform});let s={...t};return delete s.CLAUDE_CODE_EXECPATH,s}function kn(t,e){let n={...t??process.env,PWD:e};return delete n.OLDPWD,n}function aL(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Ds]:e}}function Ke(t,e,n,r="chat"){return{...aL(kn(t,e),n),[oL]:r}}var Ds,oL,At=E(()=>{"use strict";ae();Ds="LMCTL_SELF_SESSIONID",oL="LMCTL_LAUNCH_SOURCE"});function _o(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var Uc=E(()=>{"use strict"});import{spawn as Gh}from"node:child_process";import{mkdirSync as lL}from"node:fs";var Wc,Te,pt=E(()=>{"use strict";Fc();Xh();st();At();Uc();Wc=class t extends Error{cancelReason;constructor(e,n){super(e),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,t.prototype)}},Te=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 n=e?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===ce?n:r)}turnOptsFor(e){return e}seed(e,n){return lL(e,{recursive:!0}),new Promise(r=>{let s;try{s=Gh(this.binary,this.seedArgsFor(n),{cwd:e,env:kn(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return r({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=n?.prompt!==void 0&&this.seedStdin!==void 0?`${n.prompt}
1512
+ `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{if(a===0||a===null)r({success:!0});else{let l=_o(i).trim();r({success:!1,error:l.slice(0,500)||`exit code ${a}`})}}),s.on("error",a=>{r({success:!1,error:a.message})})})}resumeCommand(e,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:po,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,n){let r=this.turnOptsFor(n);if(r.userConfig&&qh(r.userConfig,this.name)){let i=r.userConfig.tools[this.name];if(i?.agent)return this.runOneShotAgent(e,r,i.agent)}let s=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return s<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(s,e,r)}withTimeouts(e,n,r){let s=new AbortController,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:r.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let d={...r,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),r.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),r.onProgress?.(p)}},f=this.transportFn(n,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),o==="external"?new Wc("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,n,r){let s=Hh(n.userConfig,this.name,n.sessionId,e,n.profile),i=Date.now();return new Promise((o,a)=>{let l=Bh(n.env),c=Gh(s,{shell:!0,cwd:n.cwd,env:Ke(n.env,n.cwd,n.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 _=h.toString();m+=_,n.onDelta?.(_)}),c.stderr?.on("data",h=>{p+=h.toString()}),n.signal){if(n.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let _=Date.now()-i;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:n.sessionId,durationMs:_}):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 go(t,e){let n;if(e&&typeof e=="object"){let r=e.code;typeof r=="number"&&(n=r)}return new ln(t,n,e)}var _t,we,an,ho,ln,Rr=E(()=>{"use strict";_t=class extends Error{constructor(e,n){super(e,n),this.name=this.constructor.name}},we=class extends _t{},an=class extends _t{exitCode;signal;stderr;constructor(e,n,r=null,s){super(e),this.exitCode=n,this.signal=r,this.stderr=s}},ho=class extends _t{line;constructor(e,n,r){super(e,{cause:r}),this.line=n}},ln=class extends _t{rpcCode;rpcData;constructor(e,n,r){super(e),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as Hc from"node:child_process";function dL(t){if(typeof Hc.spawnSync=="function")try{Hc.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Kh(t){return t.exitCode!==null||t.signalCode!==null}function qc(t,e){return Kh(t)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,t.removeListener("exit",s),n(!1))},e);t.once("exit",s)})}async function Qe(t,e={}){let n=Date.now(),r=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??dL;if(Kh(t))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await qc(t,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await qc(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await qc(t,cL)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var cL,js=E(()=>{"use strict";cL=1e3});function Vh(t){ue()&&Pe({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function In(t,e){let n=fL[t];if(n)return n[e]??n.yolo}function pL(t,e){if(e.length===0)return!0;for(let n=0;n+e.length<=t.length;n++){let r=!0;for(let s=0;s<e.length;s++)if(t[n+s]!==e[s]){r=!1;break}if(r)return!0}return!1}function et(t,e,n="yolo"){if(mL.has(t)){Vh(`YOLO ${t} [mode=${n}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:t==="dsh"?"DSH_PERMISSION_MODE=danger-full-access env var on the sidecar spawn \u2014 no argv flag":t==="hermes"?"HERMES_YOLO_MODE=1 shell gate + ACP session/set_mode (modeId=dont_ask) edit gate":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?In(t,"plan"):uL[t];if(!r){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 C({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new we(s)}if(!pL(e,r)){let s=r.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw C({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:n,args:e.join(" "),message:i}),new we(i)}Vh(`YOLO ${t} [mode=${n}]: argv flag '${r.join(" ")}'`)}var uL,fL,mL,Qn=E(()=>{"use strict";Rr();ae();uL={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},fL={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};mL=new Set(["codex","opencode","kimi","dsh","hermes"])});async function EL(t,e,n){if(typeof t=="boolean")return t;let r,s;try{return await Promise.race([t,new Promise(i=>{r=setTimeout(()=>i(Bc),e),r.unref?.(),n!==void 0&&(s=()=>i(Bc),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function yo(t,e){if(t===void 0){e.closeStdin();return}let n=!1,r=i=>{if(!n){n=!0;try{t.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}e.closeStdin()},s=Date.now();TL(t,e,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function TL(t,e,n,r){let s=t.pollMs??_L,i=t.maxHoldMs??hL,o=t.settleMs??gL,a=t.backgroundGraceMs??yL,l=!1,c=null,u=d=>r({startedMs:n,held:l,reason:d});for(;;){if(e.isAborted())return u("aborted");if(e.hasChildExited())return u("child-exited");let d=i-(Date.now()-n);if(d<=0)return u("max-hold");let f;try{f=await EL(t.hasOutstandingWork(),d,e.signal)}catch{return u("check-error")}if(f===Bc)return u(e.isAborted()||e.signal?.aborted===!0?"aborted":"max-hold");if(f)c=null;else{if(!l&&e.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let h=a-(Date.now()-n);await new Promise(_=>setTimeout(_,Math.max(0,Math.min(s,wL,h))).unref?.());continue}if(!l||o<=0)return u("cleared");c===null&&(c=Date.now(),Fe(`${e.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let p=Math.max(c,e.lastEventAtMs());if(!e.isTurnInFlight()&&Date.now()-p>=o)return u("cleared")}if(l||(l=!0,t.onHold?.(),Fe(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return C({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-n}),u("max-hold");let m=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(p=>setTimeout(p,m).unref?.())}}var _L,hL,gL,yL,wL,Bc,Xc=E(()=>{"use strict";ae();_L=2e3,hL=8*60*60*1e3,gL=5e3,yL=1e3,wL=50,Bc=Symbol("check-timed-out")});function Yh(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let n=0;n<t.length;n++)n===0?e.push(t[n]):e.push(`
1513
1513
 
1514
1514
  --- additional response (turn ${n+1} of ${t.length}; likely an injected mid-call notification) ---
1515
1515
 
@@ -1517,16 +1517,16 @@ var k0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
1517
1517
  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:
1518
1518
  ${e}
1519
1519
 
1520
- ${n}`:n}function Zh(t,e){return new Promise((n,r)=>{let s=e.tool||"claude",i=e.binaryPath||bL[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=In(s,a)??IL[s]??["--dangerously-skip-permissions"];o.push(...l);try{tt(s,o,a)}catch(b){return r(b)}if(e.cwd&&!SL(e.cwd))return C({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),r(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Ve(e.env,e.cwd,e.sessionId),u=vL(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:s==="claude"?Jh(c):c});u.stdin?.on("error",b=>{Pe(`stream-json: stdin pipe error, ignored (exit handler reports): ${b.message}`)});let d=!1;if(e.signal){if(e.signal.aborted)return d=!0,C({event:"transport_abort",provider:s,phase:"pre_spawn"}),et(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,C({event:"transport_abort",provider:s}),et(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f="",m=!1,p=!1,h=0,_=!1,y=Jc({onEvent:b=>{h=Date.now(),_=b.type!=="result",e.onEvent?.(b)},onText:e.onText});function g(){p||(p=!0,yo(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>m,isTurnInFlight:()=>_,lastEventAtMs:()=>h,closeStdin:()=>{u.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function w(b){let R=y.sawResult();y.processLine(b),!R&&y.sawResult()&&g()}u.stdout?.on("data",b=>{f+=b.toString();let R=f.split(`
1521
- `);f=R.pop()||"";for(let K of R)w(K)});let T="";u.stderr?.on("data",b=>{T+=b.toString()}),u.on("error",b=>{C({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:b.message}),r(new we(`Failed to spawn ${i}: ${b.message}`,{cause:b}))}),u.on("exit",b=>{if(m=!0,d)return;f.trim()&&w(f);let R=y.finalize();R?.isError?(C({event:"transport_error",provider:s,error_class:"Error",reason:"provider_result_error",error_message:R.errorMessage}),r(new Error(`${s} reported an error for this turn (no assistant output)`+(e.sessionId?` \u2014 session=${e.sessionId}`:"")+`: ${R.errorMessage??"unknown error"}`))):R?(Pe(`stream-json: result ${R.result.slice(0,80)}${R.result.length>80?"...":""} (${R.durationMs}ms)`),n({result:R.result,sessionId:R.sessionId,durationMs:R.durationMs,numTurns:R.numTurns,exitCode:b})):(C({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:b,stderr_tail:T.slice(0,500)}),r(new Error(kL({tool:s,exitCode:b,stderr:T}))))});let N=JSON.stringify({type:"user",message:{role:"user",content:t}});u.stdin?.write(N+`
1522
- `),Pe(`stream-json: prompt sent (${t.length} chars)`)})}var bL,IL,Qh=E(()=>{"use strict";Rr();js();Qn();ae();Xc();At();Gc();Gc();bL={claude:"claude",qwen:"qwen"};IL={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function wo(t={}){return[]}var Kc=E(()=>{"use strict"});function Vc(t){return t==="plan"?"read-only":"danger-full-access"}function eg(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function Yc(){return{agentItems:new Map,resultText:""}}function Eo(t,e,n,r){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),n?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,n?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(r&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,u=typeof i?.turnId=="string"?i.turnId:void 0;r({itemId:o.id,threadId:c,turnId:u,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function zc(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function tg(t){let e=t.params,n=e?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Zc(){return{pendingCodexError:null}}function Qc(t,e){let n=tg(t);return n.willRetry||(e.pendingCodexError=n.turnError),n}function ed(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let r=t.params?.turn;if((typeof r?.status=="string"?r.status:void 0)==="failed"){let i=r?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var td=E(()=>{"use strict"});import{spawn as NL}from"node:child_process";import{createInterface as AL}from"node:readline";import{existsSync as xL,readFileSync as RL}from"node:fs";import{fileURLToPath as OL}from"node:url";function CL(){return eg(LL)}function Nn(t,e){Pe(`[codex:${t}] ${JSON.stringify(e)}`)}function $L(t){let e=t.stderr.trim().slice(0,500),n=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1520
+ ${n}`:n}function Zh(t,e){return new Promise((n,r)=>{let s=e.tool||"claude",i=e.binaryPath||bL[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=In(s,a)??IL[s]??["--dangerously-skip-permissions"];o.push(...l);try{et(s,o,a)}catch(b){return r(b)}if(e.cwd&&!SL(e.cwd))return C({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),r(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Ke(e.env,e.cwd,e.sessionId),u=vL(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:s==="claude"?Jh(c):c});u.stdin?.on("error",b=>{Fe(`stream-json: stdin pipe error, ignored (exit handler reports): ${b.message}`)});let d=!1;if(e.signal){if(e.signal.aborted)return d=!0,C({event:"transport_abort",provider:s,phase:"pre_spawn"}),Qe(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,C({event:"transport_abort",provider:s}),Qe(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f="",m=!1,p=!1,h=0,_=!1,y=Jc({onEvent:b=>{h=Date.now(),_=b.type!=="result",e.onEvent?.(b)},onText:e.onText});function g(){p||(p=!0,yo(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>m,isTurnInFlight:()=>_,lastEventAtMs:()=>h,closeStdin:()=>{u.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function w(b){let R=y.sawResult();y.processLine(b),!R&&y.sawResult()&&g()}u.stdout?.on("data",b=>{f+=b.toString();let R=f.split(`
1521
+ `);f=R.pop()||"";for(let K of R)w(K)});let T="";u.stderr?.on("data",b=>{T+=b.toString()}),u.on("error",b=>{C({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:b.message}),r(new we(`Failed to spawn ${i}: ${b.message}`,{cause:b}))}),u.on("exit",b=>{if(m=!0,d)return;f.trim()&&w(f);let R=y.finalize();R?.isError?(C({event:"transport_error",provider:s,error_class:"Error",reason:"provider_result_error",error_message:R.errorMessage}),r(new Error(`${s} reported an error for this turn (no assistant output)`+(e.sessionId?` \u2014 session=${e.sessionId}`:"")+`: ${R.errorMessage??"unknown error"}`))):R?(Fe(`stream-json: result ${R.result.slice(0,80)}${R.result.length>80?"...":""} (${R.durationMs}ms)`),n({result:R.result,sessionId:R.sessionId,durationMs:R.durationMs,numTurns:R.numTurns,exitCode:b})):(C({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:b,stderr_tail:T.slice(0,500)}),r(new Error(kL({tool:s,exitCode:b,stderr:T}))))});let N=JSON.stringify({type:"user",message:{role:"user",content:t}});u.stdin?.write(N+`
1522
+ `),Fe(`stream-json: prompt sent (${t.length} chars)`)})}var bL,IL,Qh=E(()=>{"use strict";Rr();js();Qn();ae();Xc();At();Gc();Gc();bL={claude:"claude",qwen:"qwen"};IL={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function wo(t={}){return[]}var Kc=E(()=>{"use strict"});function Vc(t){return t==="plan"?"read-only":"danger-full-access"}function eg(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function Yc(){return{agentItems:new Map,resultText:""}}function Eo(t,e,n,r){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),n?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,n?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(r&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,u=typeof i?.turnId=="string"?i.turnId:void 0;r({itemId:o.id,threadId:c,turnId:u,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function zc(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function tg(t){let e=t.params,n=e?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Zc(){return{pendingCodexError:null}}function Qc(t,e){let n=tg(t);return n.willRetry||(e.pendingCodexError=n.turnError),n}function ed(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let r=t.params?.turn;if((typeof r?.status=="string"?r.status:void 0)==="failed"){let i=r?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var td=E(()=>{"use strict"});import{spawn as NL}from"node:child_process";import{createInterface as AL}from"node:readline";import{existsSync as xL,readFileSync as RL}from"node:fs";import{fileURLToPath as OL}from"node:url";function CL(){return eg(LL)}function Nn(t,e){Fe(`[codex:${t}] ${JSON.stringify(e)}`)}function $L(t){let e=t.stderr.trim().slice(0,500),n=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1523
1523
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
1524
1524
  ${e}
1525
1525
 
1526
- ${n}`:n}function ng(t,e){return new Promise((n,r)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?wo():[];i.push(...a),ue()&&Me(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",c=Vc(l);try{tt("codex",i,l)}catch(j){return r(j)}if(e.cwd&&!xL(e.cwd))return C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),r(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=NL(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,C({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),et(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,C({event:"transport_abort",provider:"codex"}),et(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f=AL({input:u.stdout}),m=new Map,p=1,h=e.threadId||"",_="",y=!1,g=!1,w=Date.now(),T=Yc(),N=Zc();function b(j,U={}){return new Promise((x,O)=>{let W=p++;m.set(W,{resolve:x,reject:O});let I=JSON.stringify({jsonrpc:"2.0",id:W,method:j,params:U});u.stdin?.write(I+`
1526
+ ${n}`:n}function ng(t,e){return new Promise((n,r)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?wo():[];i.push(...a),ue()&&Me(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",c=Vc(l);try{et("codex",i,l)}catch(j){return r(j)}if(e.cwd&&!xL(e.cwd))return C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),r(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=NL(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,C({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),Qe(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,C({event:"transport_abort",provider:"codex"}),Qe(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f=AL({input:u.stdout}),m=new Map,p=1,h=e.threadId||"",_="",y=!1,g=!1,w=Date.now(),T=Yc(),N=Zc();function b(j,U={}){return new Promise((x,O)=>{let W=p++;m.set(W,{resolve:x,reject:O});let I=JSON.stringify({jsonrpc:"2.0",id:W,method:j,params:U});u.stdin?.write(I+`
1527
1527
  `)})}function R(j,U={}){let x=JSON.stringify({jsonrpc:"2.0",method:j,params:U});u.stdin?.write(x+`
1528
1528
  `)}f.on("line",j=>{let U;try{U=JSON.parse(j)}catch{return}if(typeof U.id=="number"&&m.has(U.id)){let W=m.get(U.id);if(m.delete(U.id),U.error){let I=U.error,A=typeof I?.message=="string"&&I.message.length>0?I.message:JSON.stringify(U.error);W.reject(go(`codex app-server error: ${A}`,I))}else W.resolve(U);e.onEvent?.(U);return}let x=U.method;if(!x){e.onEvent?.(U);return}if(x==="thread/started"){let I=U.params?.thread;I?.id&&(h=I.id)}let O=ue()?W=>{Nn("item.text/buffer-mismatch",{itemId:W.itemId,threadId:W.threadId??null,turnId:W.turnId??null,expectedFromItemText:W.expectedFromItemText,gotFromBuffer:W.gotFromBuffer,expectedLen:W.expectedFromItemText.length,gotLen:W.gotFromBuffer.length})}:void 0;if(x==="turn/started"){let W=U.params,I=W?.turn;I?.id&&(_=I.id),Eo(U,T,e.onDelta,O),ue()&&Nn("turn/started",{params:W??null})}if(ue()&&(x==="item/started"||x==="item/completed")){let W=U.params;W?.item?.type==="agentMessage"&&Nn(x,{params:W??null})}if(x==="item/started"||x==="item/agentMessage/delta"||x==="item/completed"){if(x==="item/agentMessage/delta"){let W=U.params;ue()&&Nn("agentMessage/delta",{params:W??null})}Eo(U,T,e.onDelta,O)}if(x==="turn/completed"){let W=U.params;if(ue())for(let[A,D]of T.agentItems.entries())D.buffer&&Nn("turn/completed/unflushed-item",{itemId:A,phase:D.phase,bufferLen:D.buffer.length});zc(T),ue()&&Nn("turn/completed",{params:W??null});let I=ed(U,N);I.shouldReject?(ue()&&Nn("turn/completed/terminal-reject",{message:I.turnError.message}),g=!0,y=!0,u.stdin?.end(),r(I.turnError)):(y=!0,u.stdin?.end())}if(x==="error"){let W=Qc(U,N);if(ue()){let I=U.params,A=I?.error,D=typeof A?.message=="string"?A.message:"(no message)";Nn(W.willRetry?"error/retry":"error/terminal-deferred",{message:D,willRetry:W.willRetry,params:I??null})}}e.onEvent?.(U)});let K="";u.stderr?.on("data",j=>{K+=j.toString()}),u.on("error",j=>{C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:j.message}),r(new we(`Failed to spawn codex app-server: ${j.message}`,{cause:j}))}),u.on("exit",j=>{if(!d&&!g){if(y){n({result:T.resultText,threadId:h,turnId:_,durationMs:Date.now()-w,exitCode:j});return}if(N.pendingCodexError){r(N.pendingCodexError);return}C({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:j,stderr_tail:K.slice(0,500)}),r(new Error($L({exitCode:j,stderr:K})))}}),(async()=>{try{if(await b("initialize",CL()),R("initialized",{}),e.threadId)try{let j=b("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),U=new Promise((x,O)=>setTimeout(()=>O(new Error("resume timeout")),3e4));await Promise.race([j,U]),h=e.threadId}catch(j){process.stderr.write(`[codex] thread/resume failed, creating new thread
1529
- `),C({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:j instanceof Error?j.message:String(j)});let x=(await b("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;x?.id&&(h=x.id)}else{let U=(await b("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;U?.id&&(h=U.id)}await b("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(j){et(u).catch(()=>{}),r(j instanceof Error?j:new Error(String(j)))}})()})}var LL,rg=E(()=>{"use strict";ae();ae();Rr();js();Qn();Kc();ae();At();td();td();LL=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(RL(OL(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as og,mkdirSync as ML,readFileSync as ag,writeFileSync as sg}from"node:fs";import{join as Ps,resolve as DL}from"node:path";function lg(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 nd(t,e,n={existsSync:og,readFileSync:ag}){let r=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=DL(e,s.sessiondir??e);for(let o of jL(i)){let a=PL(o,n);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(lg(a.permission)||r.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return r}function jL(t){return[Ps(t,".opencode","opencode.jsonc"),Ps(t,"opencode.jsonc"),Ps(t,"opencode.json")]}function PL(t,e){try{if(!e.existsSync(t))return;let n=e.readFileSync(t,"utf-8"),r=JSON.parse(FL(n));return r===null||typeof r!="object"||Array.isArray(r)?void 0:r}catch{return}}function FL(t){let e="",n=!1,r="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(n){e+=o,s?s=!1:o==="\\"?s=!0:o===r&&(n=!1,r="");continue}if(o==='"'||o==="'"){n=!0,r=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
1529
+ `),C({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:j instanceof Error?j.message:String(j)});let x=(await b("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;x?.id&&(h=x.id)}else{let U=(await b("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;U?.id&&(h=U.id)}await b("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(j){Qe(u).catch(()=>{}),r(j instanceof Error?j:new Error(String(j)))}})()})}var LL,rg=E(()=>{"use strict";ae();ae();Rr();js();Qn();Kc();ae();At();td();td();LL=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(RL(OL(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as og,mkdirSync as ML,readFileSync as ag,writeFileSync as sg}from"node:fs";import{join as Ps,resolve as DL}from"node:path";function lg(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 nd(t,e,n={existsSync:og,readFileSync:ag}){let r=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=DL(e,s.sessiondir??e);for(let o of jL(i)){let a=PL(o,n);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(lg(a.permission)||r.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return r}function jL(t){return[Ps(t,".opencode","opencode.jsonc"),Ps(t,"opencode.jsonc"),Ps(t,"opencode.json")]}function PL(t,e){try{if(!e.existsSync(t))return;let n=e.readFileSync(t,"utf-8"),r=JSON.parse(FL(n));return r===null||typeof r!="object"||Array.isArray(r)?void 0:r}catch{return}}function FL(t){let e="",n=!1,r="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(n){e+=o,s?s=!1:o==="\\"?s=!0:o===r&&(n=!1,r="");continue}if(o==='"'||o==="'"){n=!0,r=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
1530
1530
  `;)i+=1;i<t.length&&(e+=t[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<t.length&&!(t[i]==="*"&&t[i+1]==="/");)i+=1;i+=1;continue}e+=o}return e.replace(/,\s*([}\]])/g,"$1")}function To(t,e={}){let n=Ps(t,".opencode"),r=Ps(n,"opencode.json");if(!og(r)){ML(n,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return sg(r,o+`
1531
1531
  `,"utf-8"),!0}let s;try{s=JSON.parse(ag(r,"utf-8"))}catch{return console.log(ig.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(ig.yellow(` .opencode/opencode.json at ${r} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),lg(s.permission)||C({event:"opencode_yolo_override",provider:"opencode",config_path:r,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&sg(r,JSON.stringify(s,null,2)+`
1532
1532
  `,"utf-8"),i}var ig,vo=E(()=>{"use strict";ae();ig={yellow:t=>t}});function ug(t){let e=[...t.matchAll(UL)];if(e.length>0){let n=e[e.length-1],r=(n.index??0)+n[0].length;return cg(t.slice(r).trimStart())}return cg(XL(t.replace(WL,"")))}function XL(t){let e=qL.exec(t);if(e===null)return t;let n=t.slice(e[0].length),r=[...n.matchAll(HL)];if(r.length<2)return t;let s=r[0],i=(s.index??0)+s[0].length;return n.slice(i).trimStart()}function cg(t){let e=[...t.matchAll(BL)];if(e.length===0)return t;let n=e[e.length-1],r=(n.index??0)+n[0].length;return t.slice(r).trimStart()}function Or(t,e=""){let n=t.result;return typeof n?.sessionId=="string"&&n.sessionId.length>0?n.sessionId:e}function fg(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function rd(t={}){let e="",n="",r="",s=!1,i=!1,o=()=>({result:t.tool==="gemini"?ug(n):n,sessionId:e,stopReason:r});return{setSessionId(a){e=a},beginTurn(){n="",r="",s=!1,i=!0},completeTurn(a){return r=fg(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let u=c.content,d=typeof u?.text=="string"?u.text:"";return d&&i&&(n+=d,t.onDelta?.(d)),!0},finalize(){return s?o():null}}}var dg,UL,WL,qL,HL,BL,sd=E(()=>{"use strict";dg="(?:png|jpe?g|webp|heic|pdf)",UL=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${dg}\\s*`,"gi"),WL=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${dg}\\s*`,"i"),qL=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,HL=/^STANCE:\s+\S+\s*$/gim,BL=/\[Thought:\s*true\]\s*/gi});import{spawn as pg}from"node:child_process";import{existsSync as JL}from"node:fs";import{createInterface as GL}from"node:readline";function VL(t){let e=KL.exec(t);return e?e[0]:null}function mg(t,e){let n=YL[t];if(!n)throw new we(`ACP mode "${e}" requested for provider "${t}", which declares no ACP mode vocabulary. Add the provider's mode ids to ACP_MODE_VOCABULARY before setting a mode.`);if(!n.known.includes(e))throw new we(`provider "${t}" has no ACP mode "${e}" (known: ${n.known.join(", ")}).`);if(!n.selectable.includes(e))throw new we(`provider "${t}" ACP mode "${e}" is not selectable by lmctl (selectable: ${n.selectable.join(", ")}).`)}function zL(t){let e=t.stderr.trim().slice(0,500),n=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
@@ -1535,35 +1535,35 @@ ${e}
1535
1535
 
1536
1536
  ${n}`:n}function ZL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized"))return e;let n=e.split(/\r?\n/),r=[];for(let s=0;s<n.length;s++){let i=n[s];if(i.includes("Error handling notification")&&i.includes("notifications/initialized")){let o=[i],a=s;for(;a+1<n.length&&o.length<8&&(a++,o.push(n[a]),n[a].trim()!=="}"););let l=o.join(`
1537
1537
  `);if(/\bcode:\s*-32601\b/.test(l)&&/Method not found[^]*notifications\/initialized/.test(l)){s=a;continue}}r.push(i)}return r.join(`
1538
- `)}function _g(t,e){let n=GL({input:t.stdout}),r=new Map,s=(o,a={})=>new Promise((l,c)=>{let u=QL++;r.set(u,{resolve:l,reject:c});let d=JSON.stringify({jsonrpc:"2.0",id:u,method:o,params:a});je({event:"acp_send",direction:"SEND",provider:e.provider,method:o,id:u,params:a}),t.stdin?.write(`${d}
1538
+ `)}function _g(t,e){let n=GL({input:t.stdout}),r=new Map,s=(o,a={})=>new Promise((l,c)=>{let u=QL++;r.set(u,{resolve:l,reject:c});let d=JSON.stringify({jsonrpc:"2.0",id:u,method:o,params:a});Pe({event:"acp_send",direction:"SEND",provider:e.provider,method:o,id:u,params:a}),t.stdin?.write(`${d}
1539
1539
  `)}),i=(o,a={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:o,params:a})}
1540
- `)};return n.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(je({event:"acp_recv",direction:"RECV",provider:e.provider,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"&&r.has(a.id)){let c=r.get(a.id);if(r.delete(a.id),a.error){let u=a.error,d=typeof u?.message=="string"&&u.message.length>0?u.message:JSON.stringify(a.error);c.reject(go(`ACP RPC error: ${d}`,u))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){C({event:"acp_unhandled_request",provider:e.provider,method:l,id:a.id,params:a.params});let c=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});je({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${c}
1541
- `);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new we("ACP RPC channel closed")){n.close();for(let a of r.values())a.reject(o);r.clear()}}}function od(t){let e;try{e=pg(t.binaryPath??id.opencode.binary,id.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ve(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=_g(e,{provider:"opencode"}),r=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(u,d=!0)=>{if(!i){if(i=!0,clearTimeout(c),e.removeListener("error",a),e.removeListener("exit",l),n.close(),!d){s(u);return}et(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(u))}},a=u=>{o({status:"unavailable",reason:"spawn",error:u.message},!1)},l=(u,d)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(u)}, signal=${String(d)})`},!1)};e.once("error",a),e.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let u=await n.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),d=Or(u);try{await n.sendRpc("session/set_config_option",{sessionId:d,configId:"model",value:t.model})}catch(f){o({status:"rejected",option:"model",value:t.model,error:f instanceof Error?f.message:String(f)});return}if(t.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:d,configId:"effort",value:t.effort})}catch(f){o({status:"rejected",option:"effort",value:t.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(u){o({status:"unavailable",reason:"handshake",error:u instanceof Error?u.message:String(u)})}})()})}function eC(t){if(t.method!=="session/update")return!1;let n=t.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}function hg(t,e){let n=id[e.tool];if(!n)return Promise.reject(new Error(`No ACP config for tool "${e.tool}"`));if(e.acpMode!==void 0)try{mg(e.tool,e.acpMode)}catch(r){return Promise.reject(r)}return new Promise((r,s)=>{let i=e.binaryPath||n.binary;if(e.tool==="opencode")try{To(e.cwd)}catch(R){C({event:"opencode_config_install_failed",cwd:e.cwd,error_message:R instanceof Error?R.message:String(R)})}let o=e.permissionMode??"yolo";if(e.tool==="hermes"&&o==="plan")return s(new Error('provider "hermes" does not support --permission-mode plan'));let a=[...n.args];if(o==="plan")if(e.tool==="gemini"){let R=In("gemini","plan"),K=In("gemini","yolo");a=a.filter(j=>!(K??[]).includes(j)),R&&a.push(...R)}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.
1542
- `),C({event:"acp_plan_mode_unsupported",provider:e.tool,requested_mode:"plan",effective_mode:"yolo"}));e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":o;try{tt(e.tool,a,l)}catch(R){return s(R)}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.
1543
- `),C({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!JL(e.cwd))return C({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=Ve(e.env,e.cwd,e.sessionId);e.tool==="hermes"&&o==="yolo"&&(c.HERMES_YOLO_MODE="1");let u=pg(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:c}),d=Date.now(),f=!1,m=!1,p=0,h=!1,_=!1;if(e.signal){if(e.signal.aborted)return f=!0,C({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),et(u).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{f=!0,C({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-d}),et(u).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let y=e.sessionId||"",g=rd({tool:e.tool,onDelta:e.onDelta});g.setSessionId(y);let w=_g(u,{provider:e.tool,onEvent:R=>{p=Date.now(),eC(R)&&(_=!0),e.onEvent?.(R)},onNotification:R=>{p=Date.now(),g.processMessage(R)}}),{sendRpc:T,sendNotification:N}=w,b="";u.stderr?.on("data",R=>{b+=R.toString()}),u.on("error",R=>{w.close(R),C({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:R.message,elapsed_ms:Date.now()-d}),s(new we(`Failed to spawn ${n.binary} ${n.args.join(" ")}: ${R.message}`,{cause:R}))}),u.on("exit",R=>{if(m=!0,w.close(new we(`ACP process exited with code ${String(R)}`)),f)return;let K=g.finalize();if(K!==null){if(e.tool==="kimi"){let j=VL(K.result);j!==null&&C({event:"kimi_runtime_dead",provider:"kimi",session_id:K.sessionId,matched_text:j})}r({result:K.result,sessionId:K.sessionId,durationMs:Date.now()-d,stopReason:K.stopReason,exitCode:R})}else{let j=ZL(e.tool,b);C({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:R,stderr_tail:j.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(zL({tool:e.tool,exitCode:R,stderr:j})))}}),(async()=>{try{await T("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),N("notifications/initialized");let R;if(e.sessionId)try{let x=await T("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});y=Or(x,e.sessionId),R=x,g.setSessionId(y)}catch(x){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${x instanceof Error?x.message:String(x)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1544
- `),C({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:x instanceof Error?x.message:String(x)});let O=await T("session/new",{cwd:e.cwd,mcpServers:[]});y=Or(O),R=O,g.setSessionId(y)}else{let x=await T("session/new",{cwd:e.cwd,mcpServers:[]});y=Or(x),R=x,g.setSessionId(y)}if(e.tool==="kimi"){let x=o==="plan"?"plan":"auto";try{await T("session/set_config_option",{sessionId:y,configId:"mode",value:x}),Pe(`acp: set_config_option(mode=${x}) ok`)}catch(O){let W=O instanceof Error?O.message:String(O);throw C({event:"acp_permission_mode_failed",provider:e.tool,config_id:"mode",value:x,error_message:W}),new Error(`Cannot set Kimi ACP permission mode to ${x}: ${W}`)}}if(e.acpMode!==void 0){mg(e.tool,e.acpMode);try{await T("session/set_mode",{sessionId:y,modeId:e.acpMode}),Pe(`acp: set_mode(modeId=${e.acpMode}) ok`)}catch(x){let O=x instanceof Error?x.message:String(x);throw C({event:"acp_session_mode_failed",provider:e.tool,mode_id:e.acpMode,error_message:O}),new Error(`Cannot set ${e.tool} ACP session mode to ${e.acpMode}: ${O}`)}}if(e.model&&(e.tool==="opencode"||e.tool==="kimi"))try{await T("session/set_config_option",{sessionId:y,configId:"model",value:e.model}),Pe(`acp: set_config_option(model=${e.model}) ok`)}catch(x){let O=x instanceof Error?x.message:String(x);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${O}
1545
- `),C({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:O})}let K=R.result?.models?.currentModelId;if(e.model&&e.tool==="hermes"&&e.model!==K)try{await T("session/set_model",{sessionId:y,modelId:e.model}),Pe(`acp: set_model(modelId=${e.model}) ok`)}catch(x){let O=x instanceof Error?x.message:String(x);throw process.stderr.write(`[acp] set_model(modelId=${e.model}) failed: ${O}
1546
- `),C({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:O}),new Error(`Cannot set Hermes ACP model to ${e.model}: ${O}`)}if(e.effort&&e.tool==="opencode"){let x="effort";try{await T("session/set_config_option",{sessionId:y,configId:x,value:e.effort}),Pe(`acp: set_config_option(${x}=${e.effort}) ok`)}catch(O){let W=O instanceof Error?O.message:String(O);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${W}
1547
- `),C({event:"acp_config_option_failed",provider:e.tool,config_id:x,value:e.effort,error_message:W})}}g.beginTurn(),h=!0,Pe(`acp: prompt sent (${t.length} chars)`);let j=await T("session/prompt",{sessionId:y,prompt:[{type:"text",text:t}]}),U=g.completeTurn(j);h=!1,Pe(`acp: result received (${U.result.length} chars, stopReason=${U.stopReason})`),yo(e.holdOpen,{isAborted:()=>f,hasChildExited:()=>m,isTurnInFlight:()=>h,lastEventAtMs:()=>p,closeStdin:()=>{u.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>_})}catch(R){et(u).catch(()=>{}),s(R instanceof Error?R:new Error(String(R)))}})()})}var KL,YL,id,QL,ad=E(()=>{"use strict";ae();Rr();js();Xc();Qn();vo();ae();At();sd();sd();KL=/runtime\s+\S+\s+does not exist in workspace\s+\S+/;YL={hermes:{known:["default","accept_edits","dont_ask"],selectable:["accept_edits","dont_ask"]}};id={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]},kimi:{binary:"kimi",args:["acp"]},hermes:{binary:"hermes",args:["acp"]}},QL=1});function Se(t,e=120){let n=t.replace(/\s+/g," ").trim();return n.length>e?n.slice(0,e-1)+"\u2026":n}function gg(t,e){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(t.size>=tC){let r=t.keys().next().value;r!==void 0&&t.delete(r)}t.set(n.id,Date.now()),e(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=t.get(n.id);if(r!==void 0){e({...n,elapsedMs:Date.now()-r}),t.delete(n.id);return}}e(n)}}function nC(){let t=new Map;return(e,n)=>{rC(e,gg(t,n))}}function rC(t,e){let n=t.type;if(n==="system"){let r=t.subtype;if(r==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=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(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(Se(a,60));let u=c.length>0?c.join(", "):r;e({kind:"api_retry",summary:u});return}if(r==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(Se(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:r||"system",raw:t});return}if(n==="assistant"||n==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:Se(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,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=Se(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:Se(u),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:Se(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,u,d=i.content;if(typeof d=="string")u=`${d.split(`
1540
+ `)};return n.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Pe({event:"acp_recv",direction:"RECV",provider:e.provider,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"&&r.has(a.id)){let c=r.get(a.id);if(r.delete(a.id),a.error){let u=a.error,d=typeof u?.message=="string"&&u.message.length>0?u.message:JSON.stringify(a.error);c.reject(go(`ACP RPC error: ${d}`,u))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){C({event:"acp_unhandled_request",provider:e.provider,method:l,id:a.id,params:a.params});let c=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});Pe({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${c}
1541
+ `);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new we("ACP RPC channel closed")){n.close();for(let a of r.values())a.reject(o);r.clear()}}}function od(t){let e;try{e=pg(t.binaryPath??id.opencode.binary,id.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ke(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=_g(e,{provider:"opencode"}),r=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(u,d=!0)=>{if(!i){if(i=!0,clearTimeout(c),e.removeListener("error",a),e.removeListener("exit",l),n.close(),!d){s(u);return}Qe(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(u))}},a=u=>{o({status:"unavailable",reason:"spawn",error:u.message},!1)},l=(u,d)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(u)}, signal=${String(d)})`},!1)};e.once("error",a),e.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let u=await n.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),d=Or(u);try{await n.sendRpc("session/set_config_option",{sessionId:d,configId:"model",value:t.model})}catch(f){o({status:"rejected",option:"model",value:t.model,error:f instanceof Error?f.message:String(f)});return}if(t.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:d,configId:"effort",value:t.effort})}catch(f){o({status:"rejected",option:"effort",value:t.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(u){o({status:"unavailable",reason:"handshake",error:u instanceof Error?u.message:String(u)})}})()})}function eC(t){if(t.method!=="session/update")return!1;let n=t.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}function hg(t,e){let n=id[e.tool];if(!n)return Promise.reject(new Error(`No ACP config for tool "${e.tool}"`));if(e.acpMode!==void 0)try{mg(e.tool,e.acpMode)}catch(r){return Promise.reject(r)}return new Promise((r,s)=>{let i=e.binaryPath||n.binary;if(e.tool==="opencode")try{To(e.cwd)}catch(R){C({event:"opencode_config_install_failed",cwd:e.cwd,error_message:R instanceof Error?R.message:String(R)})}let o=e.permissionMode??"yolo";if(e.tool==="hermes"&&o==="plan")return s(new Error('provider "hermes" does not support --permission-mode plan'));let a=[...n.args];if(o==="plan")if(e.tool==="gemini"){let R=In("gemini","plan"),K=In("gemini","yolo");a=a.filter(j=>!(K??[]).includes(j)),R&&a.push(...R)}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.
1542
+ `),C({event:"acp_plan_mode_unsupported",provider:e.tool,requested_mode:"plan",effective_mode:"yolo"}));e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":o;try{et(e.tool,a,l)}catch(R){return s(R)}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.
1543
+ `),C({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!JL(e.cwd))return C({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=Ke(e.env,e.cwd,e.sessionId);e.tool==="hermes"&&o==="yolo"&&(c.HERMES_YOLO_MODE="1");let u=pg(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:c}),d=Date.now(),f=!1,m=!1,p=0,h=!1,_=!1;if(e.signal){if(e.signal.aborted)return f=!0,C({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),Qe(u).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{f=!0,C({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-d}),Qe(u).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let y=e.sessionId||"",g=rd({tool:e.tool,onDelta:e.onDelta});g.setSessionId(y);let w=_g(u,{provider:e.tool,onEvent:R=>{p=Date.now(),eC(R)&&(_=!0),e.onEvent?.(R)},onNotification:R=>{p=Date.now(),g.processMessage(R)}}),{sendRpc:T,sendNotification:N}=w,b="";u.stderr?.on("data",R=>{b+=R.toString()}),u.on("error",R=>{w.close(R),C({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:R.message,elapsed_ms:Date.now()-d}),s(new we(`Failed to spawn ${n.binary} ${n.args.join(" ")}: ${R.message}`,{cause:R}))}),u.on("exit",R=>{if(m=!0,w.close(new we(`ACP process exited with code ${String(R)}`)),f)return;let K=g.finalize();if(K!==null){if(e.tool==="kimi"){let j=VL(K.result);j!==null&&C({event:"kimi_runtime_dead",provider:"kimi",session_id:K.sessionId,matched_text:j})}r({result:K.result,sessionId:K.sessionId,durationMs:Date.now()-d,stopReason:K.stopReason,exitCode:R})}else{let j=ZL(e.tool,b);C({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:R,stderr_tail:j.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(zL({tool:e.tool,exitCode:R,stderr:j})))}}),(async()=>{try{await T("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),N("notifications/initialized");let R;if(e.sessionId)try{let x=await T("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});y=Or(x,e.sessionId),R=x,g.setSessionId(y)}catch(x){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${x instanceof Error?x.message:String(x)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1544
+ `),C({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:x instanceof Error?x.message:String(x)});let O=await T("session/new",{cwd:e.cwd,mcpServers:[]});y=Or(O),R=O,g.setSessionId(y)}else{let x=await T("session/new",{cwd:e.cwd,mcpServers:[]});y=Or(x),R=x,g.setSessionId(y)}if(e.tool==="kimi"){let x=o==="plan"?"plan":"auto";try{await T("session/set_config_option",{sessionId:y,configId:"mode",value:x}),Fe(`acp: set_config_option(mode=${x}) ok`)}catch(O){let W=O instanceof Error?O.message:String(O);throw C({event:"acp_permission_mode_failed",provider:e.tool,config_id:"mode",value:x,error_message:W}),new Error(`Cannot set Kimi ACP permission mode to ${x}: ${W}`)}}if(e.acpMode!==void 0){mg(e.tool,e.acpMode);try{await T("session/set_mode",{sessionId:y,modeId:e.acpMode}),Fe(`acp: set_mode(modeId=${e.acpMode}) ok`)}catch(x){let O=x instanceof Error?x.message:String(x);throw C({event:"acp_session_mode_failed",provider:e.tool,mode_id:e.acpMode,error_message:O}),new Error(`Cannot set ${e.tool} ACP session mode to ${e.acpMode}: ${O}`)}}if(e.model&&(e.tool==="opencode"||e.tool==="kimi"))try{await T("session/set_config_option",{sessionId:y,configId:"model",value:e.model}),Fe(`acp: set_config_option(model=${e.model}) ok`)}catch(x){let O=x instanceof Error?x.message:String(x);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${O}
1545
+ `),C({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:O})}let K=R.result?.models?.currentModelId;if(e.model&&e.tool==="hermes"&&e.model!==K)try{await T("session/set_model",{sessionId:y,modelId:e.model}),Fe(`acp: set_model(modelId=${e.model}) ok`)}catch(x){let O=x instanceof Error?x.message:String(x);throw process.stderr.write(`[acp] set_model(modelId=${e.model}) failed: ${O}
1546
+ `),C({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:O}),new Error(`Cannot set Hermes ACP model to ${e.model}: ${O}`)}if(e.effort&&e.tool==="opencode"){let x="effort";try{await T("session/set_config_option",{sessionId:y,configId:x,value:e.effort}),Fe(`acp: set_config_option(${x}=${e.effort}) ok`)}catch(O){let W=O instanceof Error?O.message:String(O);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${W}
1547
+ `),C({event:"acp_config_option_failed",provider:e.tool,config_id:x,value:e.effort,error_message:W})}}g.beginTurn(),h=!0,Fe(`acp: prompt sent (${t.length} chars)`);let j=await T("session/prompt",{sessionId:y,prompt:[{type:"text",text:t}]}),U=g.completeTurn(j);h=!1,Fe(`acp: result received (${U.result.length} chars, stopReason=${U.stopReason})`),yo(e.holdOpen,{isAborted:()=>f,hasChildExited:()=>m,isTurnInFlight:()=>h,lastEventAtMs:()=>p,closeStdin:()=>{u.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>_})}catch(R){Qe(u).catch(()=>{}),s(R instanceof Error?R:new Error(String(R)))}})()})}var KL,YL,id,QL,ad=E(()=>{"use strict";ae();Rr();js();Xc();Qn();vo();ae();At();sd();sd();KL=/runtime\s+\S+\s+does not exist in workspace\s+\S+/;YL={hermes:{known:["default","accept_edits","dont_ask"],selectable:["accept_edits","dont_ask"]}};id={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]},kimi:{binary:"kimi",args:["acp"]},hermes:{binary:"hermes",args:["acp"]}},QL=1});function Se(t,e=120){let n=t.replace(/\s+/g," ").trim();return n.length>e?n.slice(0,e-1)+"\u2026":n}function gg(t,e){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(t.size>=tC){let r=t.keys().next().value;r!==void 0&&t.delete(r)}t.set(n.id,Date.now()),e(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=t.get(n.id);if(r!==void 0){e({...n,elapsedMs:Date.now()-r}),t.delete(n.id);return}}e(n)}}function nC(){let t=new Map;return(e,n)=>{rC(e,gg(t,n))}}function rC(t,e){let n=t.type;if(n==="system"){let r=t.subtype;if(r==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=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(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(Se(a,60));let u=c.length>0?c.join(", "):r;e({kind:"api_retry",summary:u});return}if(r==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(Se(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:r||"system",raw:t});return}if(n==="assistant"||n==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:Se(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,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=Se(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:Se(u),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:Se(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,u,d=i.content;if(typeof d=="string")u=`${d.split(`
1548
1548
  `).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(`
1549
- `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(n==="result"){e({kind:"system",summary:"result",raw:t});return}}async function So(t,e){let n=e.binary==="qwen"?"qwen":"claude",r=e.onProgress?nC():void 0,s=await Zh(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:n,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:r?i=>r(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function sC(){let t=new Map;return(e,n)=>{iC(e,gg(t,n))}}function iC(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:Se(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:Se(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=Se(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:Se(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")e({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${Se(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:i})}}async function Gt(t,e){let n=e.acpTool||e.binary;e.model&&n==="copilot"&&je({event:"model_ignored",provider:n,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let r=e.onProgress?sC():void 0,s=await hg(t,{tool:n,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,acpMode:e.acpMode,requireResume:e.requireResume,onDelta:e.onDelta,onEvent:r?i=>r(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function oC(t,e){let n=t.method;if(!n)return;let r=t.params;if(n==="turn/started"){e({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(n==="error"){let s=r?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=r?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${Se(o,120)}`}:{kind:"other",summary:`codex error: ${Se(o,120)}`});return}if(n==="item/started"||n==="item/completed"){let s=r?.item;if(!s)return;let i=s.type,o=n==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:Se(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(o){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:Se(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(o)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(o?{kind:"tool_use",tool:"WebSearch",summary:Se(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(n==="item/agentMessage/delta"){let s=r?.delta||"";if(s){let i=typeof r?._lmctlItemPhase=="string"?r._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:Se(s)}:{kind:"text",summary:Se(s)})}return}if(n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=r?.delta||"";s&&e({kind:"thinking",summary:Se(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let i=s.split(`
1549
+ `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(n==="result"){e({kind:"system",summary:"result",raw:t});return}}async function So(t,e){let n=e.binary==="qwen"?"qwen":"claude",r=e.onProgress?nC():void 0,s=await Zh(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:n,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:r?i=>r(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function sC(){let t=new Map;return(e,n)=>{iC(e,gg(t,n))}}function iC(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:Se(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:Se(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=Se(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:Se(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")e({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${Se(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:i})}}async function Gt(t,e){let n=e.acpTool||e.binary;e.model&&n==="copilot"&&Pe({event:"model_ignored",provider:n,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let r=e.onProgress?sC():void 0,s=await hg(t,{tool:n,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,acpMode:e.acpMode,requireResume:e.requireResume,onDelta:e.onDelta,onEvent:r?i=>r(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function oC(t,e){let n=t.method;if(!n)return;let r=t.params;if(n==="turn/started"){e({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(n==="error"){let s=r?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=r?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${Se(o,120)}`}:{kind:"other",summary:`codex error: ${Se(o,120)}`});return}if(n==="item/started"||n==="item/completed"){let s=r?.item;if(!s)return;let i=s.type,o=n==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:Se(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(o){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:Se(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(o)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(o?{kind:"tool_use",tool:"WebSearch",summary:Se(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(n==="item/agentMessage/delta"){let s=r?.delta||"";if(s){let i=typeof r?._lmctlItemPhase=="string"?r._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:Se(s)}:{kind:"text",summary:Se(s)})}return}if(n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=r?.delta||"";s&&e({kind:"thinking",summary:Se(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let i=s.split(`
1550
1550
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${Se(o,60)}`:Se(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n==="item/commandExecution/terminalInteraction"||n==="item/commandExecution/outputChunk"||n==="item/commandExecution/output"){let s=(typeof r?.stdin=="string"?r.stdin:"")||(typeof r?.delta=="string"?r.delta:"")||(typeof r?.output=="string"?r.output:"")||(typeof r?.text=="string"?r.text:"")||(typeof r?.content=="string"?r.content:"")||(typeof r?.chunk=="string"?r.chunk:"")||"";if(s){let i=s.split(`
1551
- `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${Se(o,60)}`:Se(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){e({kind:"other",summary:n.slice(5)});return}}async function yg(t,e){let n=await ng(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?r=>oC(r,e.onProgress):void 0,signal:e.signal});return{text:n.result,sessionId:n.threadId,durationMs:n.durationMs}}var tC,cn=E(()=>{"use strict";Qh();rg();ad();ae();tC=256});function cd(t){return new ld(t)}var ld,dd=E(()=>{"use strict";Ph();_t();cn();it();ld=class extends Te{constructor(e){super({provider:new fo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ce,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:So})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as aC,stat as wg,unlink as lC}from"node:fs/promises";import{join as Fs,basename as cC}from"node:path";function dC(t,e,n){return`${t}|${e.toISOString()}|${n}`}function Us(t,e,n){let r=dC(n.role,n.timestamp,n.content);e.has(r)||(e.add(r),t.push(n))}function Eg(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function uC(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 Lr(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(n=>{if(typeof n=="string")return n;if(n&&typeof n=="object"){let r=n;if(typeof r.text=="string")return r.text;if(typeof r.image_url=="string")return"[input_image]";if(typeof r.type=="string")return`[${r.type}]`}return Lr(n)}).filter(n=>n.length>0).join(`
1552
- `);try{return JSON.stringify(t)}catch{return String(t)}}function fC(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function mC(t,e){if(e===void 0)return;let n={input:e};if(t!=="apply_patch"||typeof e!="string")return n;let r=[...e.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return r.length>0&&(n.path=r[0].path,n.paths=r.map(s=>s.path),n.kinds=r.map(s=>s.kind)),n}async function Tg(t){let e=0,n=0,r=0,s=0,i=0,o,a;for await(let l of Xe(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;n=c.input_tokens??n,r=c.cached_input_tokens??c.cache_read_input_tokens??r,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let u=uC(l.payload.info.last_token_usage);u&&(o=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var bo,vg=E(()=>{"use strict";Nt();bo=class{name="codex";codexDirs;constructor(e={}){let n=[Fs(ge,".codex"),Fs(ge,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let r=[e.codexDir||n[0],e.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Fs(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let n of this.codexDirs){let r=Fs(n,"sessions");try{await wg(r),e.push(r)}catch{}}return e}async discoverSessions(){let e=[],n=await this.getSessionsDirs();for(let r of n){let s=await this.findSessionFiles(r);for(let i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let n=[],r;try{r=await aC(e)}catch{return n}for(let s of r){let i=Fs(e,s),o=await wg(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);n.push(...a)}else s.endsWith(".jsonl")&&n.push(i)}return n}extractSessionIdFromFilename(e){let n=cC(e,".jsonl"),r=n.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async extractSummary(e){let n=await Ke(e,30),r=await Le(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,u,d,f;for(let p of n){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(_=>_.type==="input_text"&&typeof _.text=="string"&&_.text);typeof h?.text=="string"&&(c||(c=G(h.text.trim(),80)),u=G(h.text.trim(),80))}}if(!i)return null;let m=await Tg(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:Eg(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 n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d=e,f,m,p=new Set;for await(let _ of Xe(n)){let y=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(d=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=Eg(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let g=_.payload;if(g.type==="message"){if(g.role==="user"&&g.content){for(let w of g.content)if(w.type==="input_text"&&typeof w.text=="string"&&w.text){let T=w.text.trim();c||(c=G(T,80)),u=G(T,80),Us(s,p,{role:"user",timestamp:y,content:_e(T)})}continue}if(g.role==="assistant"&&g.content){for(let w of g.content)w.type==="output_text"&&typeof w.text=="string"&&w.text&&Us(s,p,{role:"assistant",timestamp:y,content:_e(w.text),model:a});continue}if(g.role!=="user"&&g.role!=="assistant"&&g.content){for(let w of g.content)(w.type==="input_text"||w.type==="output_text")&&typeof w.text=="string"&&w.text&&Us(s,p,{role:"system",timestamp:y,content:_e(w.text.trim())});continue}}if(g.type==="function_call"){s.push({role:"tool_use",timestamp:y,content:g.name||"unknown tool",toolName:g.name,toolInput:g.arguments!==void 0?_e(Lr(g.arguments)):void 0,toolInputData:fC(g.arguments),toolCallId:g.call_id});continue}if(g.type==="function_call_output"){s.push({role:"tool_result",timestamp:y,content:_e(Lr(g.output)),toolCallId:g.call_id});continue}if(g.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:y,content:g.name||"unknown tool",toolName:g.name,toolInput:g.input!==void 0?_e(Lr(g.input)):void 0,toolInputData:mC(g.name,g.input),toolCallId:g.call_id});continue}if(g.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:y,content:_e(Lr(g.output)),toolCallId:g.call_id});continue}if(g.type==="reasoning"&&g.summary){let w=g.summary.map(T=>Lr(T.text)).join(`
1553
- `);w.trim()&&Us(s,p,{role:"thinking",timestamp:y,content:_e(w)});continue}}if(_.type==="event_msg"&&_.payload&&(_.payload.type==="task_started"?m="in_progress":_.payload.type==="task_complete"?m="complete":_.payload.type==="turn_aborted"&&(m="aborted"),_.payload.type==="agent_reasoning")){let g=_.payload.message||_.payload.text;g&&Us(s,p,{role:"thinking",timestamp:y,content:_e(g)})}}if(!i)return null;let h=await Tg(n);return{provider:"codex",sessionId:d,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:c,lastUserMessage:u,messageCount:h.messageCount,filePath:n,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:h.lastTokenUsage,modelContextWindow:h.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await lC(n),!0):!1}async resolveSessionFile(e){let n=await this.getSessionsDirs(),r=[];for(let i of n){let o=await this.findSessionFiles(i);r.push(...o)}for(let i of r)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await Ke(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function fd(t){return new ud(t)}var Sg,ud,md=E(()=>{"use strict";vg();_t();cn();it();Sg="gpt-5.6-sol",ud=class extends Te{constructor(e){super({provider:new bo(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:`${ce}
1551
+ `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${Se(o,60)}`:Se(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){e({kind:"other",summary:n.slice(5)});return}}async function yg(t,e){let n=await ng(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?r=>oC(r,e.onProgress):void 0,signal:e.signal});return{text:n.result,sessionId:n.threadId,durationMs:n.durationMs}}var tC,cn=E(()=>{"use strict";Qh();rg();ad();ae();tC=256});function cd(t){return new ld(t)}var ld,dd=E(()=>{"use strict";Ph();pt();cn();st();ld=class extends Te{constructor(e){super({provider:new fo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ce,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:So})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as aC,stat as wg,unlink as lC}from"node:fs/promises";import{join as Fs,basename as cC}from"node:path";function dC(t,e,n){return`${t}|${e.toISOString()}|${n}`}function Us(t,e,n){let r=dC(n.role,n.timestamp,n.content);e.has(r)||(e.add(r),t.push(n))}function Eg(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function uC(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 Lr(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(n=>{if(typeof n=="string")return n;if(n&&typeof n=="object"){let r=n;if(typeof r.text=="string")return r.text;if(typeof r.image_url=="string")return"[input_image]";if(typeof r.type=="string")return`[${r.type}]`}return Lr(n)}).filter(n=>n.length>0).join(`
1552
+ `);try{return JSON.stringify(t)}catch{return String(t)}}function fC(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function mC(t,e){if(e===void 0)return;let n={input:e};if(t!=="apply_patch"||typeof e!="string")return n;let r=[...e.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return r.length>0&&(n.path=r[0].path,n.paths=r.map(s=>s.path),n.kinds=r.map(s=>s.kind)),n}async function Tg(t){let e=0,n=0,r=0,s=0,i=0,o,a,l;for await(let c of De(t)){if(c.type==="event_msg"&&c.payload?.type==="user_message"){let u=c.payload.message||c.payload.text;u&&(l=H(u.trim(),80))}if(c.type==="response_item"&&c.payload){let u=c.payload;if(u.type==="message"&&u.role==="user"&&u.content)for(let d of u.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&(e++,l=H(d.text.trim(),80));else if(u.type==="message"&&u.role==="assistant"&&u.content)for(let d of u.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&e++}if(c.payload&&typeof c.payload.model_context_window=="number"&&(a=c.payload.model_context_window),c.type==="event_msg"&&c.payload?.type==="token_count"&&c.payload.info?.total_token_usage){let u=c.payload.info.total_token_usage;n=u.input_tokens??n,r=u.cached_input_tokens??u.cache_read_input_tokens??r,s=u.output_tokens??s,i=u.reasoning_output_tokens??i;let d=uC(c.payload.info.last_token_usage);d&&(o=d),typeof c.payload.info.model_context_window=="number"&&(a=c.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a,lastUserMessage:l}}var bo,vg=E(()=>{"use strict";Nt();bo=class{name="codex";codexDirs;constructor(e={}){let n=[Fs(ge,".codex"),Fs(ge,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let r=[e.codexDir||n[0],e.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Fs(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let n of this.codexDirs){let r=Fs(n,"sessions");try{await wg(r),e.push(r)}catch{}}return e}async discoverSessions(){let e=[],n=await this.getSessionsDirs();for(let r of n){let s=await this.findSessionFiles(r);for(let i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let n=[],r;try{r=await aC(e)}catch{return n}for(let s of r){let i=Fs(e,s),o=await wg(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);n.push(...a)}else s.endsWith(".jsonl")&&n.push(i)}return n}extractSessionIdFromFilename(e){let n=cC(e,".jsonl"),r=n.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async extractSummary(e){let n=await It(e,30),r=await Le(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,u,d,f;for(let p of n){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=H(h.trim(),80)),u=H(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(_=>_.type==="input_text"&&typeof _.text=="string"&&_.text);typeof h?.text=="string"&&(c||(c=H(h.text.trim(),80)),u=H(h.text.trim(),80))}}if(!i)return null;let m=await Tg(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:Eg(d,f),firstUserMessage:c,lastUserMessage:m.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 n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d=e,f,m,p=new Set;for await(let _ of De(n)){let y=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(d=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=Eg(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let g=_.payload;if(g.type==="message"){if(g.role==="user"&&g.content){for(let w of g.content)if(w.type==="input_text"&&typeof w.text=="string"&&w.text){let T=w.text.trim();c||(c=H(T,80)),u=H(T,80),Us(s,p,{role:"user",timestamp:y,content:_e(T)})}continue}if(g.role==="assistant"&&g.content){for(let w of g.content)w.type==="output_text"&&typeof w.text=="string"&&w.text&&Us(s,p,{role:"assistant",timestamp:y,content:_e(w.text),model:a});continue}if(g.role!=="user"&&g.role!=="assistant"&&g.content){for(let w of g.content)(w.type==="input_text"||w.type==="output_text")&&typeof w.text=="string"&&w.text&&Us(s,p,{role:"system",timestamp:y,content:_e(w.text.trim())});continue}}if(g.type==="function_call"){s.push({role:"tool_use",timestamp:y,content:g.name||"unknown tool",toolName:g.name,toolInput:g.arguments!==void 0?_e(Lr(g.arguments)):void 0,toolInputData:fC(g.arguments),toolCallId:g.call_id});continue}if(g.type==="function_call_output"){s.push({role:"tool_result",timestamp:y,content:_e(Lr(g.output)),toolCallId:g.call_id});continue}if(g.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:y,content:g.name||"unknown tool",toolName:g.name,toolInput:g.input!==void 0?_e(Lr(g.input)):void 0,toolInputData:mC(g.name,g.input),toolCallId:g.call_id});continue}if(g.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:y,content:_e(Lr(g.output)),toolCallId:g.call_id});continue}if(g.type==="reasoning"&&g.summary){let w=g.summary.map(T=>Lr(T.text)).join(`
1553
+ `);w.trim()&&Us(s,p,{role:"thinking",timestamp:y,content:_e(w)});continue}}if(_.type==="event_msg"&&_.payload&&(_.payload.type==="task_started"?m="in_progress":_.payload.type==="task_complete"?m="complete":_.payload.type==="turn_aborted"&&(m="aborted"),_.payload.type==="agent_reasoning")){let g=_.payload.message||_.payload.text;g&&Us(s,p,{role:"thinking",timestamp:y,content:_e(g)})}}if(!i)return null;let h=await Tg(n);return{provider:"codex",sessionId:d,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:c,lastUserMessage:u,messageCount:h.messageCount,filePath:n,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:h.lastTokenUsage,modelContextWindow:h.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await lC(n),!0):!1}async resolveSessionFile(e){let n=await this.getSessionsDirs(),r=[];for(let i of n){let o=await this.findSessionFiles(i);r.push(...o)}for(let i of r)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await It(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function fd(t){return new ud(t)}var Sg,ud,md=E(()=>{"use strict";vg();pt();cn();st();Sg="gpt-5.6-sol",ud=class extends Te{constructor(e){super({provider:new bo(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:`${ce}
1554
1554
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:yg})}seedArgsFor(e){let n=super.seedArgsFor(e),r=e?.model??Sg;return[...n.slice(0,-1),"--model",r,n[n.length-1]]}turnOptsFor(e){return e.model?e:{...e,model:Sg}}}});function Ws(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);if(e.length>1)try{let r=JSON.parse(e[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(t)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function ko(t){let e=Ws(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 n=t.split(`
1555
1555
  `).map(a=>a).filter(a=>a.trim().length>0);if(n.length===0)throw new Error("gemini session file is empty");let r=n[0],s;try{s=JSON.parse(r)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<n.length;a++){let l;try{l=JSON.parse(n[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=o.get(u.id);d?pC(d,u):(i.push(u),o.set(u.id,u))}else i.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:i}}function pC(t,e){for(let[n,r]of Object.entries(e))if(r!==void 0){if(n==="tokens"&&bg(t.tokens)&&bg(r)){t.tokens={...t.tokens,...r};continue}t[n]=r}}function bg(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function kg(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:n,...r}=t,s=[JSON.stringify(r)];for(let i of n)s.push(JSON.stringify(i));return s.join(`
1556
1556
  `)+`
1557
- `}var pd=E(()=>{"use strict"});import{createHash as _C}from"node:crypto";import{readdir as qs,readFile as Ig,stat as Io,unlink as hC}from"node:fs/promises";import{join as ot,basename as gC,dirname as yC}from"node:path";import{cwd as wC}from"node:process";function Ng(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ag(t){return t==="user"}function _d(t){return t==="gemini"||t==="assistant"}function er(t,e=new Date(0)){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function EC(t){return`${t.sessionId}\0${t.cwd}`}function TC(t,e){let n=t.filePaths??[t.filePath],r=e.filePaths??[e.filePath],s=[...new Set([...n,...r])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function No(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function xg(t){let e=0,n=0,r=0,s=0,i=0,o;for(let a of t){if(!_d(a.type)||!a.tokens)continue;let l=No(a.tokens.input),c=No(a.tokens.cached),u=Math.max(l-c,0),d=No(a.tokens.output),f=No(a.tokens.thoughts);e+=l,n+=c,r+=d,s+=f,i=l,o={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function vC(t){return _C("sha256").update(t).digest("hex")}function Hs(t,e){let n=e;for(;n&&!t.has(n);){t.add(n);let r=yC(n);if(r===n)break;n=r}}var Ao,Rg=E(()=>{"use strict";Nt();pd();ae();Ao=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let n=e.geminiDir||ot(ge,".gemini");this.geminiProjectsFile=ot(n,"projects.json"),this.geminiTmpDir=ot(n,"tmp");let r=e.claudeDir||ot(ge,".claude");this.claudeProjectsDir=ot(r,"projects");let s=[ot(ge,".codex"),ot(ge,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>ot(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),n=new Map;for(let r of e)try{let s=await this.extractSummary(r);if(!s)continue;let i=EC(s),o=n.get(i);n.set(i,o?TC(o,s):s)}catch{}return[...n.values()]}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await Le(n),i=[],o=r.messages||[],a=r.sessionId||this.extractSessionIdFromFilename(n),l=r.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let _ of o){let y=er(_.timestamp),g=_.type,w=_e(Ng(_.content));if(Ag(g)){let N=w.trim();N&&(u||(u=G(N,80)),d=G(N,80)),i.push({role:"user",timestamp:y,content:N||w});continue}if(_d(g)){_.model&&(f=_.model);for(let N of _.thoughts||[]){let b=[N.subject,N.description].filter(Boolean).join(`
1558
- `).trim();b&&i.push({role:"thinking",timestamp:er(N.timestamp,y),content:_e(b)})}i.push({role:"assistant",timestamp:y,content:w,model:_.model});continue}let T=g?`[${g}] `:"";i.push({role:"system",timestamp:y,content:`${T}${w}`.trim()})}let m=er(r.startTime,s.createdAt),p=er(r.lastUpdated,s.modifiedAt),h=xg(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:i.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:n,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:i}}async extractSummary(e){let n=await this.readSessionFile(e);if(!n)return null;let r=await Le(e),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(e),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,u,d=0;for(let m of s)if(Ag(m.type)){d++;let p=Ng(m.content).trim();p&&(l||(l=G(_e(p),80)),c=G(_e(p),80))}else _d(m.type)&&(d++,m.model&&(u=m.model));let f=xg(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:er(n.startTime,r.createdAt),modifiedAt:er(n.lastUpdated,r.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 n=await Ig(e,"utf-8");if(Ws(n)==="unknown")return C({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:n.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 ko(n)}catch{return null}}extractSessionIdFromFilename(e){let n=gC(e).replace(/\.jsonl?$/,""),r=n.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async findSessionFiles(){let e=[],n;try{n=await qs(this.geminiTmpDir)}catch{return e}for(let r of n){let s=ot(this.geminiTmpDir,r,"chats");if(!(await Io(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await qs(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(ot(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await hC(n),!0):!1}async resolveSessionFile(e){let n=await this.findSessionFiles(),r=[];for(let s of n){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),c=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!c)continue;let u=await Le(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:er(i?.lastUpdated,u.modifiedAt)})}return r.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),r[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;Hs(e,wC());for(let r of this.extraWorkspacePaths)Hs(e,r);for(let r of await this.collectGeminiProjectPaths())Hs(e,r);for(let r of await this.collectCodexCwds())Hs(e,r);for(let r of await this.collectClaudeCwds())Hs(e,r);let n=new Map;for(let r of e)n.set(vC(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let e;try{e=await Ig(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(e).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await Ke(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,n;try{n=await qs(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=ot(this.claudeProjectsDir,r);if(!(await Io(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await qs(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=ot(s,a),u=(await Ke(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let n=[];if(!(await Io(e).catch(()=>null))?.isDirectory())return n;let s;try{s=await qs(e)}catch{return n}for(let i of s){let o=ot(e,i),a=await Io(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);n.push(...l)}else i.endsWith(".jsonl")&&n.push(o)}return n}}});import{readFileSync as SC,writeFileSync as bC,mkdirSync as kC}from"node:fs";import{join as IC,dirname as NC}from"node:path";import{randomUUID as AC}from"node:crypto";function gd(t){return new hd(t)}var hd,yd=E(()=>{"use strict";Rg();_t();cn();it();pd();hd=class extends Te{constructor(e){super({provider:new Ao(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",ce,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(n,r)=>Gt(n,{...r,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(`
1557
+ `}var pd=E(()=>{"use strict"});import{createHash as _C}from"node:crypto";import{readdir as qs,readFile as Ig,stat as Io,unlink as hC}from"node:fs/promises";import{join as it,basename as gC,dirname as yC}from"node:path";import{cwd as wC}from"node:process";function Ng(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ag(t){return t==="user"}function _d(t){return t==="gemini"||t==="assistant"}function er(t,e=new Date(0)){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function EC(t){return`${t.sessionId}\0${t.cwd}`}function TC(t,e){let n=t.filePaths??[t.filePath],r=e.filePaths??[e.filePath],s=[...new Set([...n,...r])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function No(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function xg(t){let e=0,n=0,r=0,s=0,i=0,o;for(let a of t){if(!_d(a.type)||!a.tokens)continue;let l=No(a.tokens.input),c=No(a.tokens.cached),u=Math.max(l-c,0),d=No(a.tokens.output),f=No(a.tokens.thoughts);e+=l,n+=c,r+=d,s+=f,i=l,o={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function vC(t){return _C("sha256").update(t).digest("hex")}function Hs(t,e){let n=e;for(;n&&!t.has(n);){t.add(n);let r=yC(n);if(r===n)break;n=r}}var Ao,Rg=E(()=>{"use strict";Nt();pd();ae();Ao=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let n=e.geminiDir||it(ge,".gemini");this.geminiProjectsFile=it(n,"projects.json"),this.geminiTmpDir=it(n,"tmp");let r=e.claudeDir||it(ge,".claude");this.claudeProjectsDir=it(r,"projects");let s=[it(ge,".codex"),it(ge,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>it(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),n=new Map;for(let r of e)try{let s=await this.extractSummary(r);if(!s)continue;let i=EC(s),o=n.get(i);n.set(i,o?TC(o,s):s)}catch{}return[...n.values()]}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await Le(n),i=[],o=r.messages||[],a=r.sessionId||this.extractSessionIdFromFilename(n),l=r.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let _ of o){let y=er(_.timestamp),g=_.type,w=_e(Ng(_.content));if(Ag(g)){let N=w.trim();N&&(u||(u=H(N,80)),d=H(N,80)),i.push({role:"user",timestamp:y,content:N||w});continue}if(_d(g)){_.model&&(f=_.model);for(let N of _.thoughts||[]){let b=[N.subject,N.description].filter(Boolean).join(`
1558
+ `).trim();b&&i.push({role:"thinking",timestamp:er(N.timestamp,y),content:_e(b)})}i.push({role:"assistant",timestamp:y,content:w,model:_.model});continue}let T=g?`[${g}] `:"";i.push({role:"system",timestamp:y,content:`${T}${w}`.trim()})}let m=er(r.startTime,s.createdAt),p=er(r.lastUpdated,s.modifiedAt),h=xg(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:i.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:n,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:i}}async extractSummary(e){let n=await this.readSessionFile(e);if(!n)return null;let r=await Le(e),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(e),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,u,d=0;for(let m of s)if(Ag(m.type)){d++;let p=Ng(m.content).trim();p&&(l||(l=H(_e(p),80)),c=H(_e(p),80))}else _d(m.type)&&(d++,m.model&&(u=m.model));let f=xg(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:er(n.startTime,r.createdAt),modifiedAt:er(n.lastUpdated,r.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 n=await Ig(e,"utf-8");if(Ws(n)==="unknown")return C({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:n.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 ko(n)}catch{return null}}extractSessionIdFromFilename(e){let n=gC(e).replace(/\.jsonl?$/,""),r=n.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async findSessionFiles(){let e=[],n;try{n=await qs(this.geminiTmpDir)}catch{return e}for(let r of n){let s=it(this.geminiTmpDir,r,"chats");if(!(await Io(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await qs(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(it(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await hC(n),!0):!1}async resolveSessionFile(e){let n=await this.findSessionFiles(),r=[];for(let s of n){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),c=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!c)continue;let u=await Le(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:er(i?.lastUpdated,u.modifiedAt)})}return r.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),r[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;Hs(e,wC());for(let r of this.extraWorkspacePaths)Hs(e,r);for(let r of await this.collectGeminiProjectPaths())Hs(e,r);for(let r of await this.collectCodexCwds())Hs(e,r);for(let r of await this.collectClaudeCwds())Hs(e,r);let n=new Map;for(let r of e)n.set(vC(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let e;try{e=await Ig(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(e).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await It(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,n;try{n=await qs(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=it(this.claudeProjectsDir,r);if(!(await Io(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await qs(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=it(s,a),u=(await It(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let n=[];if(!(await Io(e).catch(()=>null))?.isDirectory())return n;let s;try{s=await qs(e)}catch{return n}for(let i of s){let o=it(e,i),a=await Io(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);n.push(...l)}else i.endsWith(".jsonl")&&n.push(o)}return n}}});import{readFileSync as SC,writeFileSync as bC,mkdirSync as kC}from"node:fs";import{join as IC,dirname as NC}from"node:path";import{randomUUID as AC}from"node:crypto";function gd(t){return new hd(t)}var hd,yd=E(()=>{"use strict";Rg();pt();cn();st();pd();hd=class extends Te{constructor(e){super({provider:new Ao(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",ce,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(n,r)=>Gt(n,{...r,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(`
1559
1559
  `)}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:po,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,n){let r=await this.resolvePath(e);if(!r)return{success:!1,error:`Session file not found for ${e}`};try{let s=SC(r,"utf-8"),i=Ws(s),o=ko(s),a=AC();o.sessionId=a,o.kind="main";let l=NC(r),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=i==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=IC(l,d);return kC(l,{recursive:!0}),bC(f,kg(o,i),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Og,readFile as xC,rm as RC,stat as Cr}from"node:fs/promises";import{basename as OC,join as xt}from"node:path";function LC(t){if(!t)return null;let e={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},n=!1;for(let r of Object.values(t))r?.usage&&(n=!0,e.inputTokens+=r.usage.inputTokens??0,e.outputTokens+=r.usage.outputTokens??0,e.cacheReadTokens+=r.usage.cacheReadTokens??0,e.cacheWriteTokens+=r.usage.cacheWriteTokens??0,e.reasoningTokens+=r.usage.reasoningTokens??0);return n?e:null}function wd(){return{shutdownTotals:null,assistantOutputSum:0}}function Cg(t,e){if(e.type==="assistant.message"){let n=e.data?.outputTokens;typeof n=="number"&&(t.assistantOutputSum+=n,t.lastAssistantOutputTokens=n)}else if(e.type==="session.shutdown"){let n=LC(e.data?.modelMetrics);n&&(t.shutdownTotals=n)}}function Lg(t){let e=t.shutdownTotals,n=t.lastAssistantOutputTokens!==void 0?{outputTokens:t.lastAssistantOutputTokens}:void 0;return{totalInputTokens:e?.inputTokens,totalCachedInputTokens:e?.cacheReadTokens,totalCacheWriteInputTokens:e?.cacheWriteTokens,totalOutputTokens:e?.outputTokens??(t.lastAssistantOutputTokens===void 0?void 0:t.assistantOutputSum),totalReasoningOutputTokens:e?.reasoningTokens,lastTokenUsage:n}}function CC(t){let e={};for(let n of t.split(`
1560
- `)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(e[r[1]]=r[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 tr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function $C(t){let e=0,n=wd();for await(let r of Xe(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++,Cg(n,r);return{messageCount:e,tokens:n}}function MC(t){let e=DC(t),n=new Map;for(let r of t){if(r.role!=="tool_use"||r.toolCallId===void 0)continue;if(r.toolName==="bash"){let l=e.get(r.toolCallId),u=[l?.content,l?.toolDetailedContent].filter(f=>typeof f=="string").join(`
1561
- `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(u===void 0)continue;let d=`copilot-shell:${u}:${r.toolCallId}`;n.set(u,d),r.backgroundTaskId=d,l!==void 0&&(l.backgroundTaskId=d);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=n.get(i);if(o===void 0)continue;r.backgroundTaskId=o;let a=e.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function DC(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var xo,$g=E(()=>{"use strict";Nt();xo=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||xt(ge,".copilot");this.sessionStateDir=xt(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await Og(this.sessionStateDir)}catch{return e}for(let r of n){let s=xt(this.sessionStateDir,r);if((await Cr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.resolveSessionDir(e);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=xt(n,"events.jsonl"),i=await Cr(s).catch(()=>null),o=i?s:xt(n,"workspace.yaml"),a=await Le(i?s:n),l=[],c=r?.cwd||"(unknown workspace)",u,d,f,m,p,h,_=r?.id||OC(n)||e,y=wd();if(i)for await(let g of Xe(s)){let w=tr(g.timestamp)||a.modifiedAt;if(Cg(y,g),g.type==="session.start"&&g.data){g.data.sessionId&&(_=g.data.sessionId),g.data.copilotVersion&&(d=g.data.copilotVersion),g.data.startTime&&(h=tr(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context&&(g.data.context.cwd&&(c=g.data.context.cwd),g.data.context.branch&&(f=g.data.context.branch));continue}if(g.type==="session.model_change"&&g.data?.newModel){u=g.data.newModel;continue}if(g.type==="user.message"&&g.data){let T=g.data.content||"",N=T.trim();N&&(m||(m=G(N,80)),p=G(N,80)),l.push({role:"user",timestamp:w,content:_e(N||T)});continue}if(g.type==="assistant.message"&&g.data){let T=(g.data.content||"").trim();if(T&&l.push({role:"assistant",timestamp:w,content:_e(T),model:u}),g.data.toolRequests)for(let N of g.data.toolRequests)l.push({role:"tool_use",timestamp:w,content:N.name||"unknown tool",toolName:N.name,toolInput:N.arguments?JSON.stringify(N.arguments,null,2):void 0,toolInputData:pt(N.arguments),toolCallId:N.toolCallId});continue}if(g.type==="tool.execution_complete"&&g.data){let T=g.data.result?.content||"",N=g.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:w,content:_e(T),toolDetailedContent:N?_e(N):void 0,toolCallId:g.data.toolCallId});continue}if(g.type==="assistant.reasoning"&&g.data?.content){l.push({role:"thinking",timestamp:w,content:_e(g.data.content)});continue}if(g.type==="session.error"||g.type==="session.warning"||g.type==="session.info"||g.type==="system.message"){let T=g.data?.message||"";T.trim()&&l.push({role:"system",timestamp:w,content:_e(T)});continue}}if(!m){let g=(r?.summary||"").trim();g&&(m=G(g,80))}return MC(l),{provider:"copilot",sessionId:_,cwd:c,createdAt:h??tr(r?.created_at)??a.createdAt,modifiedAt:tr(r?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:o,...Lg(y),messages:l}}async extractSummary(e,n){let r=await this.readWorkspaceYaml(e),s=xt(e,"events.jsonl"),i=await Cr(s).catch(()=>null),o=i?s:xt(e,"workspace.yaml"),a=await Le(i?s:e),l=i?await Ke(s,20):[],c=r?.id||n,u=r?.cwd||"(unknown workspace)",d,f,m,p,h;for(let y of l)if(y.type==="session.start"&&y.data&&(y.data.sessionId&&(c=y.data.sessionId),y.data.copilotVersion&&(f=y.data.copilotVersion),y.data.startTime&&(m=tr(y.data.startTime)),y.data.selectedModel&&(d=y.data.selectedModel),y.data.context?.cwd&&(u=y.data.context.cwd)),y.type==="session.model_change"&&y.data?.newModel&&(d||(d=y.data.newModel)),y.type==="user.message"&&y.data){let g=(y.data.content||"").trim();g&&(p||(p=G(g,80)),h=G(g,80))}if(!p){let y=(r?.summary||"").trim();y&&(p=G(y,80))}let _=i?await $C(s):{messageCount:0,tokens:wd()};return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??tr(r?.created_at)??a.createdAt,modifiedAt:tr(r?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:_.messageCount,filePath:o,...Lg(_.tokens)}}async readWorkspaceYaml(e){let n=xt(e,"workspace.yaml");try{let r=await xC(n,"utf-8");return CC(r)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let n=await this.resolveSessionDir(e);return n?(await RC(n,{recursive:!0}),!0):!1}async resolveSessionDir(e){let n;try{n=await Og(this.sessionStateDir)}catch{return null}if(n.includes(e)){let s=xt(this.sessionStateDir,e);if((await Cr(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(e)){let i=xt(this.sessionStateDir,s);(await Cr(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=xt(this.sessionStateDir,s);if(!(await Cr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function Td(t){return new Ed(t)}var Ed,vd=E(()=>{"use strict";$g();_t();cn();ae();it();Ed=class extends Te{constructor(e){super({provider:new xo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ce,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>Gt(n,{...r,acpTool:"copilot"})})}async seed(e,n){let r=await super.seed(e,n);if(n?.model===void 0||n.model.trim().length===0)return r;let s="copilot seed does not implement per-session model selection";return je({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}}});import{existsSync as Mg,readdirSync as jC,statSync as Dg}from"node:fs";import{join as An}from"node:path";import{createRequire as PC}from"node:module";function jg(){return Sd===null&&(Sd=PC(import.meta.url)("node:sqlite").DatabaseSync),Sd}function Pg(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Fg(t,e){if(!e)return;t.observed=!0;let n=e.input??0,r=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=n,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=r,t.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function Ug(t){return t.observed?{totalInputTokens:t.totalInputTokens,totalCachedInputTokens:t.totalCachedInputTokens,totalCacheWriteInputTokens:t.totalCacheWriteInputTokens,totalOutputTokens:t.totalOutputTokens,totalReasoningOutputTokens:t.totalReasoningOutputTokens,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}:{}}function FC(){let t=process.env.XDG_DATA_HOME||An(ge,".local","share"),e=process.env.XDG_CONFIG_HOME||An(ge,".config");return[An(t,"opencode","opencode.db"),An(e,"opencode","opencode.db")]}function UC(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||An(ge,".local","share"),e=An(t,"lmplayer"),n=An(e,"opencode-local.db"),r=[n];try{let s=jC(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>An(e,i)).filter(i=>i!==n).sort((i,o)=>{try{return Dg(o).mtimeMs-Dg(i).mtimeMs}catch{return 0}});r.push(...s)}catch{}return r}function WC(t){return t==="lmplayer"?UC():FC()}var Sd,$r,bd=E(()=>{"use strict";Nt();ae();Sd=null;$r=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,this.busyTimeoutMs=e?.busyTimeoutMs??5e3,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=WC(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Mg(e))}openDb(e){if(!Mg(e))return null;let n=new(jg())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let e=[];for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=new Map,i=r.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=r.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1560
+ `)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(e[r[1]]=r[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 tr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function $C(t){let e=0,n=wd(),r;for await(let s of De(t)){if(s.type==="user.message"){e++;let i=(s.data?.content||"").trim();i&&(r=H(i,80))}else s.type==="assistant.message"&&(s.data?.content||"").trim()&&e++;Cg(n,s)}return{messageCount:e,tokens:n,lastUserMessage:r}}function MC(t){let e=DC(t),n=new Map;for(let r of t){if(r.role!=="tool_use"||r.toolCallId===void 0)continue;if(r.toolName==="bash"){let l=e.get(r.toolCallId),u=[l?.content,l?.toolDetailedContent].filter(f=>typeof f=="string").join(`
1561
+ `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(u===void 0)continue;let d=`copilot-shell:${u}:${r.toolCallId}`;n.set(u,d),r.backgroundTaskId=d,l!==void 0&&(l.backgroundTaskId=d);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=n.get(i);if(o===void 0)continue;r.backgroundTaskId=o;let a=e.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function DC(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var xo,$g=E(()=>{"use strict";Nt();xo=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||xt(ge,".copilot");this.sessionStateDir=xt(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await Og(this.sessionStateDir)}catch{return e}for(let r of n){let s=xt(this.sessionStateDir,r);if((await Cr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.resolveSessionDir(e);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=xt(n,"events.jsonl"),i=await Cr(s).catch(()=>null),o=i?s:xt(n,"workspace.yaml"),a=await Le(i?s:n),l=[],c=r?.cwd||"(unknown workspace)",u,d,f,m,p,h,_=r?.id||OC(n)||e,y=wd();if(i)for await(let g of De(s)){let w=tr(g.timestamp)||a.modifiedAt;if(Cg(y,g),g.type==="session.start"&&g.data){g.data.sessionId&&(_=g.data.sessionId),g.data.copilotVersion&&(d=g.data.copilotVersion),g.data.startTime&&(h=tr(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context&&(g.data.context.cwd&&(c=g.data.context.cwd),g.data.context.branch&&(f=g.data.context.branch));continue}if(g.type==="session.model_change"&&g.data?.newModel){u=g.data.newModel;continue}if(g.type==="user.message"&&g.data){let T=g.data.content||"",N=T.trim();N&&(m||(m=H(N,80)),p=H(N,80)),l.push({role:"user",timestamp:w,content:_e(N||T)});continue}if(g.type==="assistant.message"&&g.data){let T=(g.data.content||"").trim();if(T&&l.push({role:"assistant",timestamp:w,content:_e(T),model:u}),g.data.toolRequests)for(let N of g.data.toolRequests)l.push({role:"tool_use",timestamp:w,content:N.name||"unknown tool",toolName:N.name,toolInput:N.arguments?JSON.stringify(N.arguments,null,2):void 0,toolInputData:mt(N.arguments),toolCallId:N.toolCallId});continue}if(g.type==="tool.execution_complete"&&g.data){let T=g.data.result?.content||"",N=g.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:w,content:_e(T),toolDetailedContent:N?_e(N):void 0,toolCallId:g.data.toolCallId});continue}if(g.type==="assistant.reasoning"&&g.data?.content){l.push({role:"thinking",timestamp:w,content:_e(g.data.content)});continue}if(g.type==="session.error"||g.type==="session.warning"||g.type==="session.info"||g.type==="system.message"){let T=g.data?.message||"";T.trim()&&l.push({role:"system",timestamp:w,content:_e(T)});continue}}if(!m){let g=(r?.summary||"").trim();g&&(m=H(g,80))}return MC(l),{provider:"copilot",sessionId:_,cwd:c,createdAt:h??tr(r?.created_at)??a.createdAt,modifiedAt:tr(r?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:o,...Lg(y),messages:l}}async extractSummary(e,n){let r=await this.readWorkspaceYaml(e),s=xt(e,"events.jsonl"),i=await Cr(s).catch(()=>null),o=i?s:xt(e,"workspace.yaml"),a=await Le(i?s:e),l=i?await It(s,20):[],c=r?.id||n,u=r?.cwd||"(unknown workspace)",d,f,m,p,h;for(let y of l)if(y.type==="session.start"&&y.data&&(y.data.sessionId&&(c=y.data.sessionId),y.data.copilotVersion&&(f=y.data.copilotVersion),y.data.startTime&&(m=tr(y.data.startTime)),y.data.selectedModel&&(d=y.data.selectedModel),y.data.context?.cwd&&(u=y.data.context.cwd)),y.type==="session.model_change"&&y.data?.newModel&&(d||(d=y.data.newModel)),y.type==="user.message"&&y.data){let g=(y.data.content||"").trim();g&&(p||(p=H(g,80)),h=H(g,80))}if(!p){let y=(r?.summary||"").trim();y&&(p=H(y,80))}let _=i?await $C(s):{messageCount:0,tokens:wd()};return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??tr(r?.created_at)??a.createdAt,modifiedAt:tr(r?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_.lastUserMessage??h,messageCount:_.messageCount,filePath:o,...Lg(_.tokens)}}async readWorkspaceYaml(e){let n=xt(e,"workspace.yaml");try{let r=await xC(n,"utf-8");return CC(r)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let n=await this.resolveSessionDir(e);return n?(await RC(n,{recursive:!0}),!0):!1}async resolveSessionDir(e){let n;try{n=await Og(this.sessionStateDir)}catch{return null}if(n.includes(e)){let s=xt(this.sessionStateDir,e);if((await Cr(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(e)){let i=xt(this.sessionStateDir,s);(await Cr(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=xt(this.sessionStateDir,s);if(!(await Cr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function Td(t){return new Ed(t)}var Ed,vd=E(()=>{"use strict";$g();pt();cn();ae();st();Ed=class extends Te{constructor(e){super({provider:new xo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ce,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>Gt(n,{...r,acpTool:"copilot"})})}async seed(e,n){let r=await super.seed(e,n);if(n?.model===void 0||n.model.trim().length===0)return r;let s="copilot seed does not implement per-session model selection";return Pe({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}}});import{existsSync as Mg,readdirSync as jC,statSync as Dg}from"node:fs";import{join as An}from"node:path";import{createRequire as PC}from"node:module";function jg(){return Sd===null&&(Sd=PC(import.meta.url)("node:sqlite").DatabaseSync),Sd}function Pg(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Fg(t,e){if(!e)return;t.observed=!0;let n=e.input??0,r=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=n,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=r,t.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function Ug(t){return t.observed?{totalInputTokens:t.totalInputTokens,totalCachedInputTokens:t.totalCachedInputTokens,totalCacheWriteInputTokens:t.totalCacheWriteInputTokens,totalOutputTokens:t.totalOutputTokens,totalReasoningOutputTokens:t.totalReasoningOutputTokens,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}:{}}function FC(){let t=process.env.XDG_DATA_HOME||An(ge,".local","share"),e=process.env.XDG_CONFIG_HOME||An(ge,".config");return[An(t,"opencode","opencode.db"),An(e,"opencode","opencode.db")]}function UC(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||An(ge,".local","share"),e=An(t,"lmplayer"),n=An(e,"opencode-local.db"),r=[n];try{let s=jC(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>An(e,i)).filter(i=>i!==n).sort((i,o)=>{try{return Dg(o).mtimeMs-Dg(i).mtimeMs}catch{return 0}});r.push(...s)}catch{}return r}function WC(t){return t==="lmplayer"?UC():FC()}var Sd,$r,bd=E(()=>{"use strict";Nt();ae();Sd=null;$r=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,this.busyTimeoutMs=e?.busyTimeoutMs??5e3,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=WC(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Mg(e))}openDb(e){if(!Mg(e))return null;let n=new(jg())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let e=[];for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=new Map,i=r.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=r.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1562
1562
  s.time_created, s.time_updated
1563
1563
  FROM session s
1564
1564
  ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",u=r.prepare(`SELECT m.id, m.data, m.time_created FROM message m
1565
- WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),d=0,f,m,p,h=Pg(),_=[];for(let g of u){let w;try{w=JSON.parse(g.data)}catch{continue}p||(p=w.model?.modelID||w.modelID),(w.role==="user"||w.role==="assistant")&&d++,w.role==="user"&&_.push(g.id),w.role==="assistant"&&Fg(h,w.tokens)}let y=[..._.length>0?[_[0]]:[],..._.length>1?[_[_.length-1]]:[]];for(let g of y){let w=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g),T=this.extractText(w);T&&(f||(f=G(T,80)),m=G(T,80))}e.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:d,filePath:n,...Ug(h)})}}catch(s){C({event:"opencode_discover_sessions_failed",provider:this.name,db_path:n,error_message:s instanceof Error?s.message:String(s)})}finally{r.close()}}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,e);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(e,n,r){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1566
- FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=0,c,u,d,f=Pg();for(let m of o){let p;try{p=JSON.parse(m.data)}catch{continue}c||(c=p.model?.modelID||p.modelID);let h=p.model?.modelID||p.modelID,_=new Date(p.time?.created||m.time_created),y=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(m.id);if(p.role==="user"){let g=this.extractText(y);g&&(u||(u=G(g,80)),d=G(g,80)),a.push({role:"user",timestamp:_,content:g||"(empty)"}),l++}else if(p.role==="assistant"){Fg(f,p.tokens);for(let g of y){let w;try{w=JSON.parse(g.data)}catch{continue}w.type==="text"&&w.text?a.push({role:"assistant",timestamp:_,content:w.text,model:h}):w.type==="reasoning"&&w.text?a.push({role:"thinking",timestamp:_,content:w.text}):w.type==="tool"&&w.tool&&(a.push({role:"tool_use",timestamp:_,content:`${w.tool}`,toolName:w.tool,toolCallId:w.callID,toolInput:w.state?.input?JSON.stringify(w.state.input):void 0,toolInputData:pt(w.state?.input)}),w.state&&(w.state.status==="completed"||w.state.status==="error"||w.state.output!==void 0||w.state.error!==void 0)&&a.push({role:"tool_result",timestamp:_,content:w.state.error??w.state.output??"",toolCallId:w.callID}))}l++}}return{provider:this.name,sessionId:n.id,slug:n.slug,cwd:i,createdAt:new Date(n.time_created),modifiedAt:new Date(n.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:u,lastUserMessage:d,messageCount:l,filePath:r,...Ug(f),messages:a}}extractText(e){let n=[];for(let r of e){let s;try{s=JSON.parse(r.data)}catch{continue}s.type==="text"&&s.text&&n.push(s.text)}return n.join(`
1565
+ WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),d=0,f,m,p,h=Pg(),_=[];for(let g of u){let w;try{w=JSON.parse(g.data)}catch{continue}p||(p=w.model?.modelID||w.modelID),(w.role==="user"||w.role==="assistant")&&d++,w.role==="user"&&_.push(g.id),w.role==="assistant"&&Fg(h,w.tokens)}let y=[..._.length>0?[_[0]]:[],..._.length>1?[_[_.length-1]]:[]];for(let g of y){let w=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g),T=this.extractText(w);T&&(f||(f=H(T,80)),m=H(T,80))}e.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:d,filePath:n,...Ug(h)})}}catch(s){C({event:"opencode_discover_sessions_failed",provider:this.name,db_path:n,error_message:s instanceof Error?s.message:String(s)})}finally{r.close()}}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,e);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(e,n,r){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1566
+ FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=0,c,u,d,f=Pg();for(let m of o){let p;try{p=JSON.parse(m.data)}catch{continue}c||(c=p.model?.modelID||p.modelID);let h=p.model?.modelID||p.modelID,_=new Date(p.time?.created||m.time_created),y=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(m.id);if(p.role==="user"){let g=this.extractText(y);g&&(u||(u=H(g,80)),d=H(g,80)),a.push({role:"user",timestamp:_,content:g||"(empty)"}),l++}else if(p.role==="assistant"){Fg(f,p.tokens);for(let g of y){let w;try{w=JSON.parse(g.data)}catch{continue}w.type==="text"&&w.text?a.push({role:"assistant",timestamp:_,content:w.text,model:h}):w.type==="reasoning"&&w.text?a.push({role:"thinking",timestamp:_,content:w.text}):w.type==="tool"&&w.tool&&(a.push({role:"tool_use",timestamp:_,content:`${w.tool}`,toolName:w.tool,toolCallId:w.callID,toolInput:w.state?.input?JSON.stringify(w.state.input):void 0,toolInputData:mt(w.state?.input)}),w.state&&(w.state.status==="completed"||w.state.status==="error"||w.state.output!==void 0||w.state.error!==void 0)&&a.push({role:"tool_result",timestamp:_,content:w.state.error??w.state.output??"",toolCallId:w.callID}))}l++}}return{provider:this.name,sessionId:n.id,slug:n.slug,cwd:i,createdAt:new Date(n.time_created),modifiedAt:new Date(n.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:u,lastUserMessage:d,messageCount:l,filePath:r,...Ug(f),messages:a}}extractText(e){let n=[];for(let r of e){let s;try{s=JSON.parse(r.data)}catch{continue}s.type==="text"&&s.text&&n.push(s.text)}return n.join(`
1567
1567
  `).trim()}async resolveSessionPath(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{if(this.findSessionRow(r,e))return n}catch{}finally{r.close()}}return null}async deleteSession(e){for(let n of this.existingDbPaths()){let r=new(jg())(n,{open:!0});try{let s=this.findSessionRow(r,e);if(!s)continue;return r.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{r.close()}}return!1}findSessionRow(e,n){let r=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1568
1568
  s.time_created, s.time_updated
1569
1569
  FROM session s WHERE s.id = ?`).get(n);if(r)return r;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
@@ -1571,23 +1571,23 @@ ${n}`:n}function ZL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1571
1571
  FROM session s
1572
1572
  WHERE s.id LIKE ?
1573
1573
  ORDER BY s.time_updated DESC
1574
- LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}}});function Id(){return new kd}var kd,Nd=E(()=>{"use strict";bd();_t();cn();it();kd=class extends Te{constructor(){super({provider:new $r,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",ce],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,n)=>Gt(e,{...n,acpTool:"opencode"})})}seedArgsFor(e){let n=["run"];return e?.model&&n.push("--model",e.model),e?.effort&&n.push("--variant",e.effort),n.push(e?.prompt??ce),n}}});import{appendFile as qC,mkdir as HC,readFile as Wg,readdir as qg,rm as BC,stat as Hg}from"node:fs/promises";import{basename as XC,dirname as JC,isAbsolute as Bg,join as nr,relative as GC,resolve as Ad}from"node:path";function xd(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function zC(t){return typeof t=="number"?new Date(t):xd(t)??new Date(0)}function Xg(t){return typeof t=="string"?t.trim():Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e&&typeof e.text=="string"?e.text:"").filter(Boolean).join(`
1574
+ LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}}});function Id(){return new kd}var kd,Nd=E(()=>{"use strict";bd();pt();cn();st();kd=class extends Te{constructor(){super({provider:new $r,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",ce],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,n)=>Gt(e,{...n,acpTool:"opencode"})})}seedArgsFor(e){let n=["run"];return e?.model&&n.push("--model",e.model),e?.effort&&n.push("--variant",e.effort),n.push(e?.prompt??ce),n}}});import{appendFile as qC,mkdir as HC,readFile as Wg,readdir as qg,rm as BC,stat as Hg}from"node:fs/promises";import{basename as XC,dirname as JC,isAbsolute as Bg,join as nr,relative as GC,resolve as Ad}from"node:path";function xd(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function zC(t){return typeof t=="number"?new Date(t):xd(t)??new Date(0)}function Xg(t){return typeof t=="string"?t.trim():Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e&&typeof e.text=="string"?e.text:"").filter(Boolean).join(`
1575
1575
  `).trim():""}function Jg(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function ZC(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:Jg(t)??""}function QC(t){let e=e$(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function e$(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var KC,VC,YC,Ro,Gg=E(()=>{"use strict";Nt();KC="1.4",VC="1.5",YC=new Set([KC,VC]),Ro=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=Ad(e?.kimiHome??process.env.KIMI_CODE_HOME??nr(ge,".kimi-code")),this.sessionsDir=nr(this.homeDir,"sessions")}async discoverSessions(){let e=[];for(let n of await this.sessionFiles())try{let r=await this.summary(n);r&&e.push(r)}catch{}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){let n=await this.findSession(e);if(!n)return null;let r=await this.summary(n);if(!r)return null;let s=await this.parseWire(n.wirePath);return{...r,messages:s.messages}}async resolveSessionPath(e){return(await this.findSession(e))?.wirePath??null}async deleteSession(e){let n=await this.findSession(e);return n?(await BC(n.sessionDir,{recursive:!0,force:!0}),await HC(JC(this.indexPath()),{recursive:!0,mode:448}),await qC(this.indexPath(),`${JSON.stringify({sessionId:n.sessionId,deleted:!0})}
1576
- `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return nr(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await qg(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=nr(this.sessionsDir,s.name),o;try{o=await qg(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=nr(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await Wg(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:Ad(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:nr(n,"state.json"),wirePath:nr(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!Bg(e)||XC(e)!==n)return!1;let r=GC(this.sessionsDir,Ad(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Bg(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await Wg(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await Hg(e.wirePath)}catch{return null}let s=await Hg(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=xd(n.createdAt)??s.birthtime,a=xd(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?G(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let n=[],r=!0,s,i,o,a=0,l=0,c=0,u=0,d=!1,f=0,m,p;for await(let h of Xe(e)){let _=zC(h.time??h.created_at);if(r&&(r=!1,h.type==="metadata"&&!YC.has(h.protocol_version))){let g=`Kimi transcript wire protocol version ${JSON.stringify(h.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:_,content:g}],messageCount:1,firstUserMessage:g,lastUserMessage:g}}if((h.type==="config.update"||h.type==="profile.bind")&&h.modelAlias&&(s=h.modelAlias),h.type==="usage.record"){h.model&&(s=h.model),d||=h.usage!==void 0;let g=h.usage?.inputOther??0,w=h.usage?.inputCacheRead??0,T=h.usage?.inputCacheCreation??0,N=h.usage?.output??0;a+=g,l+=w,c+=T,u+=N,h.usageScope==="turn"&&(m=g+w+T,p={inputTokens:g,cachedInputTokens:w,cacheWriteInputTokens:T,outputTokens:N,totalTokens:m+N});continue}if(h.type==="turn.prompt"&&h.origin?.kind==="user"){let g=Xg(h.input);g&&(i??=G(g,80),o=G(g,80),n.push({role:"user",timestamp:_,content:g}),f++);continue}if(h.type==="turn.steer"){let g=Xg(h.input);g&&(n.push({role:"system",timestamp:_,content:g}),f++);continue}if(h.type!=="context.append_loop_event"||!h.event)continue;let y=h.event;y.type==="content.part"&&y.part?.type==="text"&&y.part.text?(n.push({role:"assistant",timestamp:_,content:y.part.text,model:s}),f++):y.type==="content.part"&&y.part?.type==="think"&&y.part.think?n.push({role:"thinking",timestamp:_,content:y.part.think,model:s}):y.type==="tool.call"?n.push({role:"tool_use",timestamp:_,content:y.name??"tool",toolName:y.name,toolInput:Jg(y.args),toolInputData:pt(y.args),toolCallId:y.toolCallId,model:s}):y.type==="tool.result"&&n.push({role:"tool_result",timestamp:_,content:ZC(y.result),toolCallId:y.toolCallId,model:s})}return QC(n),{messages:n,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:d?a:void 0,totalCachedInputTokens:d?l:void 0,totalCacheWriteInputTokens:d?c:void 0,totalOutputTokens:d?u:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function Od(t){return new Rd(t)}var Rd,Ld=E(()=>{"use strict";Gg();_t();cn();it();Rd=class extends Te{constructor(e){super({provider:new Ro(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",ce,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>Gt(n,{...r,acpTool:"kimi"})})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??ce,"--output-format","stream-json"),n}}});import{spawn as t$}from"node:child_process";import{mkdirSync as n$}from"node:fs";function $d(t){return new Cd(t)}async function r$(t,e){let n=Date.now(),r=Kg({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});tt("lmplayer",r,e.permissionMode??"yolo");let s=await Yg(e.binary,r,{cwd:e.cwd,env:Ve(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(Vg(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function Kg(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...In("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function Vg(t){if(t.error)return t.error;let e=_o(t.stderr).trim();return e?e.slice(0,500):`exit code ${t.code}`}function Yg(t,e,n){return new Promise((r,s)=>{let i;try{i=t$(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(y){s(y);return}let o="",a="",l="",c,u,d,f=[],m=!1,p=n.timeoutMs===void 0?void 0:setTimeout(()=>{m||(m=!0,i.kill(),h(),s(new Error(`lmplayer seed timed out after ${n.timeoutMs}ms`)))},n.timeoutMs),h=()=>{p!==void 0&&clearTimeout(p)},_=y=>{let g=y.trim();if(!g)return;let w;try{w=JSON.parse(g)}catch{f.push(y),n.onText?.(y);return}if(!Mr(w))return;let T=Oo(w,!1);c===void 0&&T!==void 0&&(c=T),u=Oo(w,!0)??u,d===void 0&&(d=s$(w));let N=zg(w);N&&(f.push(N),n.onText?.(N))};i.stdout?.on("data",y=>{let g=y.toString("utf8");o+=g,l+=g;let w=l.indexOf(`
1576
+ `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return nr(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await qg(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=nr(this.sessionsDir,s.name),o;try{o=await qg(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=nr(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await Wg(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:Ad(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:nr(n,"state.json"),wirePath:nr(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!Bg(e)||XC(e)!==n)return!1;let r=GC(this.sessionsDir,Ad(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Bg(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await Wg(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await Hg(e.wirePath)}catch{return null}let s=await Hg(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=xd(n.createdAt)??s.birthtime,a=xd(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?H(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let n=[],r=!0,s,i,o,a=0,l=0,c=0,u=0,d=!1,f=0,m,p;for await(let h of De(e)){let _=zC(h.time??h.created_at);if(r&&(r=!1,h.type==="metadata"&&!YC.has(h.protocol_version))){let g=`Kimi transcript wire protocol version ${JSON.stringify(h.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:_,content:g}],messageCount:1,firstUserMessage:g,lastUserMessage:g}}if((h.type==="config.update"||h.type==="profile.bind")&&h.modelAlias&&(s=h.modelAlias),h.type==="usage.record"){h.model&&(s=h.model),d||=h.usage!==void 0;let g=h.usage?.inputOther??0,w=h.usage?.inputCacheRead??0,T=h.usage?.inputCacheCreation??0,N=h.usage?.output??0;a+=g,l+=w,c+=T,u+=N,h.usageScope==="turn"&&(m=g+w+T,p={inputTokens:g,cachedInputTokens:w,cacheWriteInputTokens:T,outputTokens:N,totalTokens:m+N});continue}if(h.type==="turn.prompt"&&h.origin?.kind==="user"){let g=Xg(h.input);g&&(i??=H(g,80),o=H(g,80),n.push({role:"user",timestamp:_,content:g}),f++);continue}if(h.type==="turn.steer"){let g=Xg(h.input);g&&(n.push({role:"system",timestamp:_,content:g}),f++);continue}if(h.type!=="context.append_loop_event"||!h.event)continue;let y=h.event;y.type==="content.part"&&y.part?.type==="text"&&y.part.text?(n.push({role:"assistant",timestamp:_,content:y.part.text,model:s}),f++):y.type==="content.part"&&y.part?.type==="think"&&y.part.think?n.push({role:"thinking",timestamp:_,content:y.part.think,model:s}):y.type==="tool.call"?n.push({role:"tool_use",timestamp:_,content:y.name??"tool",toolName:y.name,toolInput:Jg(y.args),toolInputData:mt(y.args),toolCallId:y.toolCallId,model:s}):y.type==="tool.result"&&n.push({role:"tool_result",timestamp:_,content:ZC(y.result),toolCallId:y.toolCallId,model:s})}return QC(n),{messages:n,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:d?a:void 0,totalCachedInputTokens:d?l:void 0,totalCacheWriteInputTokens:d?c:void 0,totalOutputTokens:d?u:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function Od(t){return new Rd(t)}var Rd,Ld=E(()=>{"use strict";Gg();pt();cn();st();Rd=class extends Te{constructor(e){super({provider:new Ro(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",ce,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>Gt(n,{...r,acpTool:"kimi"})})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??ce,"--output-format","stream-json"),n}}});import{spawn as t$}from"node:child_process";import{mkdirSync as n$}from"node:fs";function $d(t){return new Cd(t)}async function r$(t,e){let n=Date.now(),r=Kg({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});et("lmplayer",r,e.permissionMode??"yolo");let s=await Yg(e.binary,r,{cwd:e.cwd,env:Ke(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(Vg(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function Kg(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...In("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function Vg(t){if(t.error)return t.error;let e=_o(t.stderr).trim();return e?e.slice(0,500):`exit code ${t.code}`}function Yg(t,e,n){return new Promise((r,s)=>{let i;try{i=t$(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(y){s(y);return}let o="",a="",l="",c,u,d,f=[],m=!1,p=n.timeoutMs===void 0?void 0:setTimeout(()=>{m||(m=!0,i.kill(),h(),s(new Error(`lmplayer seed timed out after ${n.timeoutMs}ms`)))},n.timeoutMs),h=()=>{p!==void 0&&clearTimeout(p)},_=y=>{let g=y.trim();if(!g)return;let w;try{w=JSON.parse(g)}catch{f.push(y),n.onText?.(y);return}if(!Mr(w))return;let T=Oo(w,!1);c===void 0&&T!==void 0&&(c=T),u=Oo(w,!0)??u,d===void 0&&(d=s$(w));let N=zg(w);N&&(f.push(N),n.onText?.(N))};i.stdout?.on("data",y=>{let g=y.toString("utf8");o+=g,l+=g;let w=l.indexOf(`
1577
1577
  `);for(;w>=0;){let T=l.slice(0,w);l=l.slice(w+1),_(T),w=l.indexOf(`
1578
- `)}}),i.stderr?.on("data",y=>{a+=y.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",y=>{m||(m=!0,h(),l.length>0&&_(l),r({code:y,stdout:o,stderr:a,sessionId:c??u,text:f.join(""),error:d}))}),i.on("error",y=>{m||(m=!0,h(),s(y))})})}function s$(t){let e=t.error;if(typeof e=="string"&&e.length>0)return e;if(Mr(e)){let n=e.data;if(Mr(n)&&typeof n.message=="string"&&n.message.length>0)return typeof e.name=="string"?`${e.name}: ${n.message}`:n.message;if(typeof e.message=="string"&&e.message.length>0)return e.message}}function zg(t){for(let e of["text","content","delta","output","message"]){let n=t[e];if(typeof n=="string")return n}for(let e of["data","event","payload","part"]){let n=t[e];if(Mr(n)){let r=zg(n);if(r)return r}}}function Oo(t,e){for(let r of["sessionID","sessionId","session_id"]){let s=t[r];if(typeof s=="string"&&s.length>0)return s}let n=t.session;if(typeof n=="string"&&n.length>0)return n;if(Mr(n)){let r=Oo(n,e);if(r!==void 0)return r}if(e){let r=t.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=t[r];if(Mr(s)){let i=Oo(s,e);if(i!==void 0)return i}}}function Mr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Cd,Md=E(()=>{"use strict";bd();_t();it();Qn();At();Uc();Cd=class extends Te{constructor(e){super({provider:new $r({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ce],resumeTemplate:"lmplayer tui --session {{session_id}}",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:r$})}seedArgsFor(e){return Kg({prompt:e?.prompt??ce,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,n){n$(e,{recursive:!0});let r=this.seedArgsFor(n);tt("lmplayer",r);try{let s=await Yg(this.binary,r,{cwd:e,env:kn(void 0,e),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:Vg(s)}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${ce}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as Lo,readFile as i$,rm as o$}from"node:fs/promises";import{basename as Zg,join as xn}from"node:path";function a$(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Bs(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function l$(t,e){if(!e)return;t.observed=!0;let n=Bs(e.promptTokenCount),r=Bs(e.cachedContentTokenCount),s=Bs(e.candidatesTokenCount),i=Bs(e.thoughtsTokenCount);t.totalInputTokens+=n,t.totalCachedInputTokens+=r,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=n,t.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:i,totalTokens:Bs(e.totalTokenCount)||n+s}}function c$(t){return{totalInputTokens:t.observed?t.totalInputTokens:void 0,totalCachedInputTokens:t.observed?t.totalCachedInputTokens:void 0,totalOutputTokens:t.observed?t.totalOutputTokens:void 0,totalReasoningOutputTokens:t.observed?t.totalReasoningOutputTokens:void 0,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}}function Qg(t){return t.type==="user"||t.message?.role==="user"}function ey(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function ty(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
1578
+ `)}}),i.stderr?.on("data",y=>{a+=y.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",y=>{m||(m=!0,h(),l.length>0&&_(l),r({code:y,stdout:o,stderr:a,sessionId:c??u,text:f.join(""),error:d}))}),i.on("error",y=>{m||(m=!0,h(),s(y))})})}function s$(t){let e=t.error;if(typeof e=="string"&&e.length>0)return e;if(Mr(e)){let n=e.data;if(Mr(n)&&typeof n.message=="string"&&n.message.length>0)return typeof e.name=="string"?`${e.name}: ${n.message}`:n.message;if(typeof e.message=="string"&&e.message.length>0)return e.message}}function zg(t){for(let e of["text","content","delta","output","message"]){let n=t[e];if(typeof n=="string")return n}for(let e of["data","event","payload","part"]){let n=t[e];if(Mr(n)){let r=zg(n);if(r)return r}}}function Oo(t,e){for(let r of["sessionID","sessionId","session_id"]){let s=t[r];if(typeof s=="string"&&s.length>0)return s}let n=t.session;if(typeof n=="string"&&n.length>0)return n;if(Mr(n)){let r=Oo(n,e);if(r!==void 0)return r}if(e){let r=t.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=t[r];if(Mr(s)){let i=Oo(s,e);if(i!==void 0)return i}}}function Mr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Cd,Md=E(()=>{"use strict";bd();pt();st();Qn();At();Uc();Cd=class extends Te{constructor(e){super({provider:new $r({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ce],resumeTemplate:"lmplayer tui --session {{session_id}}",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:r$})}seedArgsFor(e){return Kg({prompt:e?.prompt??ce,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,n){n$(e,{recursive:!0});let r=this.seedArgsFor(n);et("lmplayer",r);try{let s=await Yg(this.binary,r,{cwd:e,env:kn(void 0,e),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:Vg(s)}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${ce}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as Lo,readFile as i$,rm as o$}from"node:fs/promises";import{basename as Zg,join as xn}from"node:path";function a$(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Bs(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function l$(t,e){if(!e)return;t.observed=!0;let n=Bs(e.promptTokenCount),r=Bs(e.cachedContentTokenCount),s=Bs(e.candidatesTokenCount),i=Bs(e.thoughtsTokenCount);t.totalInputTokens+=n,t.totalCachedInputTokens+=r,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=n,t.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:i,totalTokens:Bs(e.totalTokenCount)||n+s}}function c$(t){return{totalInputTokens:t.observed?t.totalInputTokens:void 0,totalCachedInputTokens:t.observed?t.totalCachedInputTokens:void 0,totalOutputTokens:t.observed?t.totalOutputTokens:void 0,totalReasoningOutputTokens:t.observed?t.totalReasoningOutputTokens:void 0,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}}function Qg(t){return t.type==="user"||t.message?.role==="user"}function ey(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function ty(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
1579
1579
  `):Array.isArray(e.parts)?e.parts.filter(n=>!n.thought&&n.type!=="thinking").map(n=>n.text||"").join(`
1580
- `):"":""}function ny(t){return t.model||t.message?.model}function d$(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:sy(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Xs(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function u$(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Xs(e.output??e.error??t)}return Xs(t)}function sy(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function ry(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:Xs(t.args,!0),toolInputData:pt(t.args),toolCallId:t.id,model:n}}var Co,iy=E(()=>{"use strict";Nt();Co=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||xn(ge,".qwen")}async discoverSessions(){let e=xn(this.baseDir,"projects"),n;try{n=await Lo(e)}catch{return[]}let r=[];for(let s of n){let i=xn(e,s,"chats"),o;try{o=await Lo(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=xn(i,a);try{let u=await this.extractSummary(c,l);u&&r.push(u)}catch{}}}return r}async extractSummary(e,n){let r=await Ke(e,30);if(r.length===0)return null;let s=await Le(e),i="(unknown)",o,a,l,c,u=0;for(let d of r){if(d.cwd&&(i=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(i=d.cwd,d.version&&(a=d.version),d.model&&(o=d.model)),Qg(d)){let f=ty(d).trim();f&&(l||(l=G(f,80)),c=G(f,80),u++)}if(ey(d)){let f=ny(d);f&&(o=f),u+=d$(d)}}return{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Zg(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await Le(e),s="(unknown)",i,o,a,l,c,u,d=[],f=a$();for await(let m of Xe(e)){if(l$(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,h=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let _=sy(m).filter(y=>y.functionResponse!==void 0);_.length===0&&m.toolCallResult?.callId&&d.push({role:"tool_result",timestamp:h,content:Xs(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let y of _){let g=y.functionResponse,w=u$(g.response),T=Xs(m.toolCallResult?.resultDisplay);d.push({role:"tool_result",timestamp:h,content:T??w??m.toolCallResult?.status??"tool result",toolName:g.name,toolCallId:m.toolCallResult?.callId??g.id,...w!==void 0?{toolDetailedContent:w}:{}})}}else if(Qg(m)){let _=ty(m);_.trim()&&(c||(c=G(_.trim(),80)),u=G(_.trim(),80)),d.push({role:"user",timestamp:h,content:_})}else if(ey(m)){let _=ny(m);if(_&&(i=_),Array.isArray(p.content))for(let y of p.content)y.type==="text"&&y.text?d.push({role:"assistant",timestamp:h,content:y.text,model:_}):y.type==="thinking"&&y.thinking?d.push({role:"thinking",timestamp:h,content:y.thinking}):y.functionCall&&d.push(ry(y.functionCall,h,_));else if(typeof p.content=="string")d.push({role:"assistant",timestamp:h,content:p.content,model:_});else if(Array.isArray(p.parts))for(let y of p.parts)if(y.thought||y.type==="thinking"){let g=y.thinking||y.text;g&&d.push({role:"thinking",timestamp:h,content:g})}else y.functionCall?d.push(ry(y.functionCall,h,_)):y.text&&d.push({role:"assistant",timestamp:h,content:y.text,model:_})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...c$(f),messages:d}}async resolveSessionPath(e){let n=xn(this.baseDir,"projects");try{let r=await Lo(n),s=[];for(let i of r){let o=xn(n,i,"chats",`${e}.jsonl`);try{return await i$(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=xn(n,i,"chats"),a;try{a=await Lo(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Zg(l,".jsonl").startsWith(e)&&s.push(xn(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await o$(n),!0}catch{return!1}}}});function jd(){return new Dd}var Dd,Pd=E(()=>{"use strict";iy();_t();cn();it();Dd=class extends Te{constructor(){super({provider:new Co,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ce,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:So})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as oy,readFile as ay,rm as ly,stat as cy}from"node:fs/promises";import{basename as Fd,join as Kt}from"node:path";import{fileURLToPath as f$}from"node:url";async function m$(t){let e=await Promise.all(t.map(n=>Le(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function p$(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function dy(t){return t.type==="USER_INPUT"}function uy(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function _$(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function fy(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function my(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 h$(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function g$(t){for await(let e of Xe(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=y$(s);if(i)return i}let r=w$(e.content);if(r)return r}return null}function y$(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function w$(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function E$(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function T$(t,e){let n=new Set;for(let r of e){let s=v$(t,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function v$(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:I$(n.event.content);if(r!==void 0)return py(t.filter(i=>!e.has(i)&&N$(i)===r),n.event.step_index);let s=k$(n.event);if(s!==void 0)return py(t.filter(i=>!e.has(i)&&S$(i.name,n.event.type)&&hy(b$(i))===s),n.event.step_index)}function py(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function S$(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function b$(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function k$(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),hy(e)}function hy(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return f$(e)}catch{return}}function I$(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function N$(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function _y(t){if(t.endsWith(".db"))return Fd(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}var $o,gy=E(()=>{"use strict";Nt();$o=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Kt(ge,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Kt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Kt(this.baseDir,"conversations"),n;try{n=await oy(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Fd(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return Kt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return Kt(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await cy(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await m$([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,c,u=0;if(r){let d=await Ke(r,80);for(let f of d){let m=my(f.content);if(m&&(a=m),dy(f)){let p=fy(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else uy(f)&&f.content&&u++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=_y(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,u=[],d=[];if(i)for await(let f of Xe(i)){let m=p$(f.created_at,s.modifiedAt),p=my(f.content);if(p&&(a=p),dy(f)){let h=fy(f.content),_=h.trim();_&&(l||(l=G(_,80)),c=G(_,80)),o.push({role:"user",timestamp:m,content:h});continue}if(Array.isArray(f.tool_calls))for(let h of f.tool_calls){let _=h.name||"tool",y=h$(h.args),g=pt(h.args),w={role:"tool_use",timestamp:m,content:y,toolName:_,toolInput:y,toolInputData:g};o.push(w),u.push({name:_,stepIndex:f.step_index,input:g,message:w})}if(uy(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(_$(f)&&f.content){let h=E$(f,r),_=h===void 0?null:await this.readTaskLog(r,h),y={role:"tool_result",timestamp:_?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:h,..._===null?{}:{toolDetailedContent:_.content}};o.push(y),d.push({event:f,message:y})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return T$(u,d),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await cy(n),n}catch{}let r=Kt(this.baseDir,"conversations");try{let s=[];for(let i of await oy(r)){if(!i.endsWith(".db"))continue;Fd(i,".db").startsWith(e)&&s.push(Kt(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=_y(n);return r?(await ly(this.conversationPath(r),{force:!0}),await ly(Kt(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await g$(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=Kt(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await ay(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=Kt(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([ay(r,"utf8"),Le(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as A$}from"node:child_process";function Wd(t){return new Ud(t)}async function x$(t,e){let n=Date.now(),r=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",O$(e.timeoutMs)];e.model&&r.push("--model",e.model),tt("agy",r,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await R$(e.binary,r,{cwd:e.cwd,env:Ve(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-n}}function R$(t,e,n){return new Promise((r,s)=>{let i;try{i=A$(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(n.signal){if(n.signal.aborted){l();return}n.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{n.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,u)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function O$(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Ud,qd=E(()=>{"use strict";gy();_t();it();At();Qn();Ud=class extends Te{constructor(e){super({provider:new $o(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",ce,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:x$})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}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 L$ from"node:zlib";function W$(t,e){return t[e]===$$&&t[e+1]===M$&&t[e+2]===D$&&t[e+3]===j$}function yy(t,e){return(t[e]&240)===80&&t[e+1]===P$&&t[e+2]===F$&&t[e+3]===U$}function q$(t,e){if(yy(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!W$(t,e))return;let n=e+4;if(n+1>t.length)return;let r=t[n];n+=1;let s=r>>6,i=(r&32)!==0,o=(r&4)!==0,a=r&3;i||(n+=1),n+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(n+=l,!(n>t.length)){for(;;){if(n+3>t.length)return;let c=t[n]|t[n+1]<<8|t[n+2]<<16,u=(c&1)!==0,d=c>>1&3,f=c>>3;if(n+=3,d===3||(n+=d===1?1:f,n>t.length))return;if(u)break}if(o&&(n+=4),!(n>t.length))return n-e}}function H$(t){let e=[],n=0;for(;n+4<=t.length;){let r=q$(t,n);if(r===void 0||r<=0)break;e.push(t.subarray(n,n+r)),n+=r}return e}function Mo(t){let e=[];for(let n of H$(t))yy(n,0)||e.push(C$(n).toString("utf8"));return e.join("")}var C$,$$,M$,D$,j$,P$,F$,U$,Hd=E(()=>{"use strict";C$=L$.zstdDecompressSync,$$=40,M$=181,D$=47,j$=253,P$=42,F$=77,U$=24});import{readdir as Bd,rm as B$,stat as X$}from"node:fs/promises";import{join as Rn}from"node:path";function J$(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Xd(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join("")}function G$(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&e.push(n.text);return e}function wy(t){let e=[];for(let n of t){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let i=r;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:Xd(i.content)})}else if(n.type==="assistant/message"){let i=r.message;for(let o of G$(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:Xd(i?.content),model:i?.source?.model})}else if(n.type==="tool/call"){let i=r,o;if(typeof i.arguments=="string")try{o=JSON.parse(i.arguments)}catch{}else i.arguments&&typeof i.arguments=="object"&&(o=i.arguments);e.push({role:"tool_use",timestamp:s,content:typeof i.arguments=="string"?i.arguments:JSON.stringify(i.arguments??{}),toolName:i.name,toolCallId:i.callId,toolInputData:o})}else if(n.type==="tool/result"){let i=r,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:Xd(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function K$(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function Ey(t,e,n){let r=t.find(m=>m.type==="session");if(!r)return null;let s=r,i=r.data,o=s.id??i?.id;if(!o)return null;let a;for(let m of t)if(m.type==="request/header"){let p=m.data?.header;p?.config?.model&&(a=p.config.model)}let l=t.map(m=>m.time).filter(m=>typeof m=="number"),c=s.createdAt??i?.createdAt,u=c?new Date(c):new Date(0),d=l.length>0?new Date(Math.max(...l)):u,f=n.filter(m=>m.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:u,modifiedAt:d,model:a,firstUserMessage:f[0]?.content,lastUserMessage:f.at(-1)?.content,messageCount:n.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...V$(t)}}function V$(t){let e=!1,n=0,r=0,s=0,i=0,o,a;for(let l of t){if(l.type!=="assistant/message")continue;let c=l.data?.usage;if(!c)continue;e=!0;let u=Do(c.inputTokens),d=Do(c.cacheReadTokens),f=Do(c.outputTokens),m=Do(c.reasoningTokens);n+=u,r+=d,s+=f,i+=m,o=u+d,a={inputTokens:u,cachedInputTokens:d,outputTokens:f,reasoningOutputTokens:m,totalTokens:u+d+f}}return{totalInputTokens:e?n:void 0,totalCachedInputTokens:e?r:void 0,totalOutputTokens:e?s:void 0,totalReasoningOutputTokens:e?i:void 0,lastInputTokens:o,lastTokenUsage:a}}function Do(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}var jo,Ty=E(()=>{"use strict";Nt();Hd();jo=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||Rn(ge,".dsh");this.sessionsDir=Rn(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await Bd(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await Bd(Rn(this.sessionsDir,r))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(r,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.findSessionDir(e);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=wy(r),i=Ey(r,n.filePath,s);return i?{...i,turnStatus:K$(r),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let n=await this.findSessionDir(e);return n?(await B$(Rn(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,n){return Rn(this.sessionsDir,J$(e),n,"session.jsonl.zstd")}async findSessionDir(e){let n;try{n=await Bd(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=Rn(this.sessionsDir,r,s,"session.jsonl.zstd");try{return await X$(i),{cwdDir:r,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=Rn(this.sessionsDir,e,n,"session.jsonl.zstd"),i=await r(s),o=Mo(i),a=[];for(let l of o.split(`
1580
+ `):"":""}function ny(t){return t.model||t.message?.model}function d$(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:sy(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Xs(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function u$(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Xs(e.output??e.error??t)}return Xs(t)}function sy(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function ry(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:Xs(t.args,!0),toolInputData:mt(t.args),toolCallId:t.id,model:n}}var Co,iy=E(()=>{"use strict";Nt();Co=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||xn(ge,".qwen")}async discoverSessions(){let e=xn(this.baseDir,"projects"),n;try{n=await Lo(e)}catch{return[]}let r=[];for(let s of n){let i=xn(e,s,"chats"),o;try{o=await Lo(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=xn(i,a);try{let u=await this.extractSummary(c,l);u&&r.push(u)}catch{}}}return r}async extractSummary(e,n){let r=!1,s=await Le(e),i="(unknown)",o,a,l,c,u=0;for await(let d of De(e)){if(r=!0,d.cwd&&(i=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(i=d.cwd,d.version&&(a=d.version),d.model&&(o=d.model)),Qg(d)){let f=ty(d).trim();f&&(l||(l=H(f,80)),c=H(f,80),u++)}if(ey(d)){let f=ny(d);f&&(o=f),u+=d$(d)}}return r?{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}:null}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Zg(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await Le(e),s="(unknown)",i,o,a,l,c,u,d=[],f=a$();for await(let m of De(e)){if(l$(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,h=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let _=sy(m).filter(y=>y.functionResponse!==void 0);_.length===0&&m.toolCallResult?.callId&&d.push({role:"tool_result",timestamp:h,content:Xs(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let y of _){let g=y.functionResponse,w=u$(g.response),T=Xs(m.toolCallResult?.resultDisplay);d.push({role:"tool_result",timestamp:h,content:T??w??m.toolCallResult?.status??"tool result",toolName:g.name,toolCallId:m.toolCallResult?.callId??g.id,...w!==void 0?{toolDetailedContent:w}:{}})}}else if(Qg(m)){let _=ty(m);_.trim()&&(c||(c=H(_.trim(),80)),u=H(_.trim(),80)),d.push({role:"user",timestamp:h,content:_})}else if(ey(m)){let _=ny(m);if(_&&(i=_),Array.isArray(p.content))for(let y of p.content)y.type==="text"&&y.text?d.push({role:"assistant",timestamp:h,content:y.text,model:_}):y.type==="thinking"&&y.thinking?d.push({role:"thinking",timestamp:h,content:y.thinking}):y.functionCall&&d.push(ry(y.functionCall,h,_));else if(typeof p.content=="string")d.push({role:"assistant",timestamp:h,content:p.content,model:_});else if(Array.isArray(p.parts))for(let y of p.parts)if(y.thought||y.type==="thinking"){let g=y.thinking||y.text;g&&d.push({role:"thinking",timestamp:h,content:g})}else y.functionCall?d.push(ry(y.functionCall,h,_)):y.text&&d.push({role:"assistant",timestamp:h,content:y.text,model:_})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...c$(f),messages:d}}async resolveSessionPath(e){let n=xn(this.baseDir,"projects");try{let r=await Lo(n),s=[];for(let i of r){let o=xn(n,i,"chats",`${e}.jsonl`);try{return await i$(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=xn(n,i,"chats"),a;try{a=await Lo(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Zg(l,".jsonl").startsWith(e)&&s.push(xn(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await o$(n),!0}catch{return!1}}}});function jd(){return new Dd}var Dd,Pd=E(()=>{"use strict";iy();pt();cn();st();Dd=class extends Te{constructor(){super({provider:new Co,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ce,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:So})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as oy,readFile as ay,rm as ly,stat as cy}from"node:fs/promises";import{basename as Fd,join as Kt}from"node:path";import{fileURLToPath as f$}from"node:url";async function m$(t){let e=await Promise.all(t.map(n=>Le(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function p$(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function dy(t){return t.type==="USER_INPUT"}function uy(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function _$(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function fy(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function my(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 h$(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function g$(t){for await(let e of De(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=y$(s);if(i)return i}let r=w$(e.content);if(r)return r}return null}function y$(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function w$(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function E$(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function T$(t,e){let n=new Set;for(let r of e){let s=v$(t,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function v$(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:I$(n.event.content);if(r!==void 0)return py(t.filter(i=>!e.has(i)&&N$(i)===r),n.event.step_index);let s=k$(n.event);if(s!==void 0)return py(t.filter(i=>!e.has(i)&&S$(i.name,n.event.type)&&hy(b$(i))===s),n.event.step_index)}function py(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function S$(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function b$(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function k$(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),hy(e)}function hy(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return f$(e)}catch{return}}function I$(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function N$(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function _y(t){if(t.endsWith(".db"))return Fd(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}var $o,gy=E(()=>{"use strict";Nt();$o=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Kt(ge,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Kt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Kt(this.baseDir,"conversations"),n;try{n=await oy(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Fd(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return Kt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return Kt(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await cy(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await m$([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,c,u=0;if(r)for await(let d of De(r)){let f=my(d.content);if(f&&(a=f),dy(d)){let m=fy(d.content).trim();m&&(l||(l=H(m,80)),c=H(m,80)),u++}else uy(d)&&d.content&&u++}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=_y(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,u=[],d=[];if(i)for await(let f of De(i)){let m=p$(f.created_at,s.modifiedAt),p=my(f.content);if(p&&(a=p),dy(f)){let h=fy(f.content),_=h.trim();_&&(l||(l=H(_,80)),c=H(_,80)),o.push({role:"user",timestamp:m,content:h});continue}if(Array.isArray(f.tool_calls))for(let h of f.tool_calls){let _=h.name||"tool",y=h$(h.args),g=mt(h.args),w={role:"tool_use",timestamp:m,content:y,toolName:_,toolInput:y,toolInputData:g};o.push(w),u.push({name:_,stepIndex:f.step_index,input:g,message:w})}if(uy(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(_$(f)&&f.content){let h=E$(f,r),_=h===void 0?null:await this.readTaskLog(r,h),y={role:"tool_result",timestamp:_?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:h,..._===null?{}:{toolDetailedContent:_.content}};o.push(y),d.push({event:f,message:y})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return T$(u,d),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await cy(n),n}catch{}let r=Kt(this.baseDir,"conversations");try{let s=[];for(let i of await oy(r)){if(!i.endsWith(".db"))continue;Fd(i,".db").startsWith(e)&&s.push(Kt(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=_y(n);return r?(await ly(this.conversationPath(r),{force:!0}),await ly(Kt(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await g$(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=Kt(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await ay(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=Kt(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([ay(r,"utf8"),Le(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as A$}from"node:child_process";function Wd(t){return new Ud(t)}async function x$(t,e){let n=Date.now(),r=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",O$(e.timeoutMs)];e.model&&r.push("--model",e.model),et("agy",r,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await R$(e.binary,r,{cwd:e.cwd,env:Ke(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-n}}function R$(t,e,n){return new Promise((r,s)=>{let i;try{i=A$(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(n.signal){if(n.signal.aborted){l();return}n.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{n.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,u)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function O$(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Ud,qd=E(()=>{"use strict";gy();pt();st();At();Qn();Ud=class extends Te{constructor(e){super({provider:new $o(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",ce,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:x$})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}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 L$ from"node:zlib";function W$(t,e){return t[e]===$$&&t[e+1]===M$&&t[e+2]===D$&&t[e+3]===j$}function yy(t,e){return(t[e]&240)===80&&t[e+1]===P$&&t[e+2]===F$&&t[e+3]===U$}function q$(t,e){if(yy(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!W$(t,e))return;let n=e+4;if(n+1>t.length)return;let r=t[n];n+=1;let s=r>>6,i=(r&32)!==0,o=(r&4)!==0,a=r&3;i||(n+=1),n+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(n+=l,!(n>t.length)){for(;;){if(n+3>t.length)return;let c=t[n]|t[n+1]<<8|t[n+2]<<16,u=(c&1)!==0,d=c>>1&3,f=c>>3;if(n+=3,d===3||(n+=d===1?1:f,n>t.length))return;if(u)break}if(o&&(n+=4),!(n>t.length))return n-e}}function H$(t){let e=[],n=0;for(;n+4<=t.length;){let r=q$(t,n);if(r===void 0||r<=0)break;e.push(t.subarray(n,n+r)),n+=r}return e}function Mo(t){let e=[];for(let n of H$(t))yy(n,0)||e.push(C$(n).toString("utf8"));return e.join("")}var C$,$$,M$,D$,j$,P$,F$,U$,Hd=E(()=>{"use strict";C$=L$.zstdDecompressSync,$$=40,M$=181,D$=47,j$=253,P$=42,F$=77,U$=24});import{readdir as Bd,rm as B$,stat as X$}from"node:fs/promises";import{join as Rn}from"node:path";function J$(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Xd(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join("")}function G$(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&e.push(n.text);return e}function wy(t){let e=[];for(let n of t){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let i=r;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:Xd(i.content)})}else if(n.type==="assistant/message"){let i=r.message;for(let o of G$(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:Xd(i?.content),model:i?.source?.model})}else if(n.type==="tool/call"){let i=r,o;if(typeof i.arguments=="string")try{o=JSON.parse(i.arguments)}catch{}else i.arguments&&typeof i.arguments=="object"&&(o=i.arguments);e.push({role:"tool_use",timestamp:s,content:typeof i.arguments=="string"?i.arguments:JSON.stringify(i.arguments??{}),toolName:i.name,toolCallId:i.callId,toolInputData:o})}else if(n.type==="tool/result"){let i=r,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:Xd(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function K$(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function Ey(t,e,n){let r=t.find(m=>m.type==="session");if(!r)return null;let s=r,i=r.data,o=s.id??i?.id;if(!o)return null;let a;for(let m of t)if(m.type==="request/header"){let p=m.data?.header;p?.config?.model&&(a=p.config.model)}let l=t.map(m=>m.time).filter(m=>typeof m=="number"),c=s.createdAt??i?.createdAt,u=c?new Date(c):new Date(0),d=l.length>0?new Date(Math.max(...l)):u,f=n.filter(m=>m.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:u,modifiedAt:d,model:a,firstUserMessage:f[0]?.content,lastUserMessage:f.at(-1)?.content,messageCount:n.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...V$(t)}}function V$(t){let e=!1,n=0,r=0,s=0,i=0,o,a;for(let l of t){if(l.type!=="assistant/message")continue;let c=l.data?.usage;if(!c)continue;e=!0;let u=Do(c.inputTokens),d=Do(c.cacheReadTokens),f=Do(c.outputTokens),m=Do(c.reasoningTokens);n+=u,r+=d,s+=f,i+=m,o=u+d,a={inputTokens:u,cachedInputTokens:d,outputTokens:f,reasoningOutputTokens:m,totalTokens:u+d+f}}return{totalInputTokens:e?n:void 0,totalCachedInputTokens:e?r:void 0,totalOutputTokens:e?s:void 0,totalReasoningOutputTokens:e?i:void 0,lastInputTokens:o,lastTokenUsage:a}}function Do(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}var jo,Ty=E(()=>{"use strict";Nt();Hd();jo=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||Rn(ge,".dsh");this.sessionsDir=Rn(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await Bd(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await Bd(Rn(this.sessionsDir,r))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(r,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.findSessionDir(e);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=wy(r),i=Ey(r,n.filePath,s);return i?{...i,turnStatus:K$(r),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let n=await this.findSessionDir(e);return n?(await B$(Rn(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,n){return Rn(this.sessionsDir,J$(e),n,"session.jsonl.zstd")}async findSessionDir(e){let n;try{n=await Bd(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=Rn(this.sessionsDir,r,s,"session.jsonl.zstd");try{return await X$(i),{cwdDir:r,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=Rn(this.sessionsDir,e,n,"session.jsonl.zstd"),i=await r(s),o=Mo(i),a=[];for(let l of o.split(`
1581
1581
  `))if(l.trim())try{let c=JSON.parse(l);if(c.type?.endsWith("-chunks")||c.type==="assistant/chunk")continue;a.push(c)}catch{}return a}async readSummary(e,n){let r=await this.readRecords(e,n);if(r.length===0)return null;let s=Rn(this.sessionsDir,e,n,"session.jsonl.zstd");return Ey(r,s,wy(r))}}});import{spawn as Y$}from"node:child_process";async function Gd(t,e=n=>Jd.spawn(n)){if(On){let n=await On.catch(()=>{});if(n?.alive)return n;On=void 0}return On=e(t),On}async function Kd(){if(!On)return;(await On.catch(()=>{}))?.shutdown(),On=void 0}var z$,vy,Dr,Jd,On,Sy=E(()=>{"use strict";z$=/dsh web:\s*(https?:\/\/\S+)/,vy=2e4,Dr=class t extends Error{method;detail;constructor(e,n){super(`dsh RPC ${e} failed: ${JSON.stringify(n)}`),this.name="DshRpcCallError",this.method=e,this.detail=n,Object.setPrototypeOf(this,t.prototype)}},Jd=class t{baseUrl;child;constructor(e,n){this.baseUrl=e,this.child=n}static forTesting(e){return new t(e,void 0)}async rpc(e,n){let r=`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s;try{s=await fetch(`${this.baseUrl}/api/${e}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({type:"client-request",rpcId:r,method:e,payload:n})})}catch(a){throw new Dr(e,`transport error: ${a instanceof Error?a.message:String(a)}`)}let i;try{i=await s.json()}catch{i=void 0}if(!s.ok)throw new Dr(e,i??s.statusText);let o=i&&typeof i=="object"?i.result:void 0;if(!o||typeof o!="object"||typeof o.ok!="boolean")throw new Dr(e,"malformed response: HTTP 200 but body is not a well-formed {result:{ok,\u2026}} envelope");if(o.ok===!1)throw new Dr(e,o.error??o);return"value"in o?o.value:void 0}get alive(){return this.child!==void 0&&this.child.exitCode===null&&this.child.signalCode===null}shutdown(){this.child!==void 0&&this.alive&&this.child.kill("SIGTERM")}static spawn(e){return new Promise((n,r)=>{let s=Y$("dsh",["web","--no-open","--port","0"],{env:e,stdio:["ignore","pipe","pipe"]}),i=!1,o="",a="",l=setTimeout(()=>{i||(i=!0,s.kill("SIGTERM"),r(new Error(`dsh web sidecar did not report a boot URL within ${vy}ms (stdout: ${o.slice(0,500)}; stderr: ${a.slice(0,500)})`)))},vy);s.stdout?.on("data",c=>{if(o+=c.toString(),i)return;let u=z$.exec(o);u&&(i=!0,clearTimeout(l),n(new t(u[1],s)))}),s.stderr?.on("data",c=>{a+=c.toString()}),s.on("error",c=>{i||(i=!0,clearTimeout(l),r(c))}),s.on("exit",(c,u)=>{if(i)return;i=!0,clearTimeout(l);let d=u?`signal ${u}`:`exit code ${c}`;r(new Error(`dsh web exited before reporting a boot URL (${d}): ${a.slice(0,500)}`))})})}}});import{randomUUID as Z$}from"node:crypto";import{readFile as Q$,mkdir as eM}from"node:fs/promises";function Yd(t){return new Vd(t)}function ky(t){return{...t,DSH_PERMISSION_MODE:t.DSH_PERMISSION_MODE??"danger-full-access"}}function nM(t){let e=t?.kind??"unknown",n=t?.error?.message;return n?`dsh turn ended with reason=${e}: ${n}`:`dsh turn ended with reason=${e} and no assistant text`}function Po(t){return t instanceof Error?t.message:String(t)}async function rM(t){let e=await Iy(t),n=-1;for(let r of e)r.type==="turn/end"&&typeof r.seq=="number"&&r.seq>n&&(n=r.seq);return n}async function Iy(t){let e;try{e=await Q$(t)}catch{return[]}let n=Mo(e),r=[];for(let s of n.split(`
1582
- `))if(s.trim())try{let i=JSON.parse(s);i!==null&&typeof i=="object"&&!Array.isArray(i)&&r.push(i)}catch{}return r}function sM(t){let n=t.data?.message?.content;if(typeof n=="string")return n;if(!Array.isArray(n))return"";let r=[];for(let s of n)s&&typeof s=="object"&&s.type==="text"&&typeof s.text=="string"&&r.push(s.text);return r.join("")}var tM,by,Vd,zd=E(()=>{"use strict";_t();Ty();Hd();Sy();it();Qn();tM=500,by=8*60*60*1e3;Vd=class extends Te{dshProvider;constructor(e){let n=new jo(e);super({provider:n,capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"dsh has no in-session leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"dsh",seedArgs:[],resumeTemplate:"dsh web --no-open --port 0 # continuity is via the RPC sidecar, not a resume flag",startTemplate:"dsh web --no-open --port 0",transport:(r,s)=>this.dshPromptTurn(r,s)}),this.dshProvider=n}manualSeedHint(e){return{launchCommand:`cd ${e} && dsh web`,postLaunchNote:"dsh has no interactive terminal session to seed into \u2014 continuity lives in the web profile's session store, not a TTY. Boot the sidecar with the command above, open the printed http:// URL, and start a session rooted at this directory in the web UI; lmctl's managed sidecar can then cold-resume it by id (cross-profile session sharing is verified). Send lmctl's seed instruction there, wait for the reply, then find the new session id with the ls command below and register it manually.",lsCommand:`lmctl ls --provider dsh --sessiondir ${e}`}}async seed(e,n){await eM(e,{recursive:!0});let r=`session-${Z$()}`,s=ky(process.env);tt("dsh",[],"yolo");try{let i;try{i=await Gd(s)}catch(a){return{success:!1,error:`dsh sidecar failed to start: ${Po(a)}`}}try{await i.rpc("session.create",{sessionId:r,cwd:e})}catch(a){return{success:!1,error:`session.create failed: ${Po(a)}`}}if(n?.model)try{await i.rpc("session.selectModel",{sessionId:r,provider:"deepseek-official",model:n.model})}catch(a){return{success:!1,error:`session.selectModel("${n.model}") failed: ${Po(a)}`}}let o=n?.prompt??ce;try{await this.promptAndWait(i,e,r,o,by)}catch(a){return{success:!1,error:`seed turn failed: ${Po(a)}`}}return{success:!0,sessionId:r}}finally{await Kd()}}async dshPromptTurn(e,n){let r=Date.now(),s=ky(n.env??process.env);tt("dsh",[],n.permissionMode??"yolo");let i;try{let o=await Gd(s);n.model&&(await o.rpc("session.selectModel",{sessionId:n.sessionId,provider:"deepseek-official",model:n.model}),n.onProgress?.({kind:"system",summary:`dsh model set to ${n.model}`})),n.onProgress?.({kind:"system",summary:"dsh session.prompt sent"}),i=await this.promptAndWait(o,n.cwd,n.sessionId,e,n.timeoutMs&&n.timeoutMs>0?n.timeoutMs:by)}finally{await Kd()}return n.onProgress?.({kind:"system",summary:"dsh turn completed"}),{text:i,sessionId:n.sessionId,durationMs:Date.now()-r}}async promptAndWait(e,n,r,s,i){let o=this.dshProvider.sessionFilePath(n,r),a=await rM(o);await e.rpc("session.prompt",{sessionId:r,mode:"queue",content:[{type:"text",text:s}]});let l=Date.now()+i;for(;;){let c=await Iy(o),u=c.find(d=>d.type==="turn/end"&&(d.seq??-1)>a);if(u){let d=u.data?.reason,f=[...c].reverse().find(p=>p.type==="assistant/message"),m=f?sM(f):"";if(d?.kind!=="completed"&&!m)throw new Error(nM(d));return m}if(Date.now()>l)throw new Error(`dsh turn timed out after ${i}ms waiting for turn/end`);await new Promise(d=>setTimeout(d,tM))}}}});import{existsSync as iM}from"node:fs";import{join as Oy,resolve as oM}from"node:path";import{createRequire as aM}from"node:module";function lM(){return Zd===null&&(Zd=aM(import.meta.url)("node:sqlite").DatabaseSync),Zd}function Qd(t={}){return oM(t.hermesHome?.trim()||process.env.HERMES_HOME?.trim()||Oy(ge,".hermes"))}function cM(t={}){return Oy(Qd(t),"state.db")}function Js(t){let e=typeof t=="number"&&Number.isFinite(t)?t:0;return new Date(e*1e3)}function nt(t){return typeof t=="string"&&t.length>0?t:void 0}function dM(t){if(!t)return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function xy(t){return nt(t.cwd)??nt(dM(t.model_config).cwd)??"(unknown)"}function uM(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function fM(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t;if(typeof t!="string")return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function Ry(t){let e=t.input_tokens??0,n=t.output_tokens??0,r=t.cache_read_tokens??0,s=t.cache_write_tokens??0,i=t.reasoning_tokens??0;return(t.message_count??0)>0&&e+n+r+s+i>0?{totalInputTokens:e,totalCachedInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:n,totalReasoningOutputTokens:i}:{}}var Zd,Ny,Ay,Fo,Ly=E(()=>{"use strict";Nt();ae();Zd=null;Ny="acp";Ay=`id, source, model, model_config, started_at,
1582
+ `))if(s.trim())try{let i=JSON.parse(s);i!==null&&typeof i=="object"&&!Array.isArray(i)&&r.push(i)}catch{}return r}function sM(t){let n=t.data?.message?.content;if(typeof n=="string")return n;if(!Array.isArray(n))return"";let r=[];for(let s of n)s&&typeof s=="object"&&s.type==="text"&&typeof s.text=="string"&&r.push(s.text);return r.join("")}var tM,by,Vd,zd=E(()=>{"use strict";pt();Ty();Hd();Sy();st();Qn();tM=500,by=8*60*60*1e3;Vd=class extends Te{dshProvider;constructor(e){let n=new jo(e);super({provider:n,capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"dsh has no in-session leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"dsh",seedArgs:[],resumeTemplate:"dsh web --no-open --port 0 # continuity is via the RPC sidecar, not a resume flag",startTemplate:"dsh web --no-open --port 0",transport:(r,s)=>this.dshPromptTurn(r,s)}),this.dshProvider=n}manualSeedHint(e){return{launchCommand:`cd ${e} && dsh web`,postLaunchNote:"dsh has no interactive terminal session to seed into \u2014 continuity lives in the web profile's session store, not a TTY. Boot the sidecar with the command above, open the printed http:// URL, and start a session rooted at this directory in the web UI; lmctl's managed sidecar can then cold-resume it by id (cross-profile session sharing is verified). Send lmctl's seed instruction there, wait for the reply, then find the new session id with the ls command below and register it manually.",lsCommand:`lmctl ls --provider dsh --sessiondir ${e}`}}async seed(e,n){await eM(e,{recursive:!0});let r=`session-${Z$()}`,s=ky(process.env);et("dsh",[],"yolo");try{let i;try{i=await Gd(s)}catch(a){return{success:!1,error:`dsh sidecar failed to start: ${Po(a)}`}}try{await i.rpc("session.create",{sessionId:r,cwd:e})}catch(a){return{success:!1,error:`session.create failed: ${Po(a)}`}}if(n?.model)try{await i.rpc("session.selectModel",{sessionId:r,provider:"deepseek-official",model:n.model})}catch(a){return{success:!1,error:`session.selectModel("${n.model}") failed: ${Po(a)}`}}let o=n?.prompt??ce;try{await this.promptAndWait(i,e,r,o,by)}catch(a){return{success:!1,error:`seed turn failed: ${Po(a)}`}}return{success:!0,sessionId:r}}finally{await Kd()}}async dshPromptTurn(e,n){let r=Date.now(),s=ky(n.env??process.env);et("dsh",[],n.permissionMode??"yolo");let i;try{let o=await Gd(s);n.model&&(await o.rpc("session.selectModel",{sessionId:n.sessionId,provider:"deepseek-official",model:n.model}),n.onProgress?.({kind:"system",summary:`dsh model set to ${n.model}`})),n.onProgress?.({kind:"system",summary:"dsh session.prompt sent"}),i=await this.promptAndWait(o,n.cwd,n.sessionId,e,n.timeoutMs&&n.timeoutMs>0?n.timeoutMs:by)}finally{await Kd()}return n.onProgress?.({kind:"system",summary:"dsh turn completed"}),{text:i,sessionId:n.sessionId,durationMs:Date.now()-r}}async promptAndWait(e,n,r,s,i){let o=this.dshProvider.sessionFilePath(n,r),a=await rM(o);await e.rpc("session.prompt",{sessionId:r,mode:"queue",content:[{type:"text",text:s}]});let l=Date.now()+i;for(;;){let c=await Iy(o),u=c.find(d=>d.type==="turn/end"&&(d.seq??-1)>a);if(u){let d=u.data?.reason,f=[...c].reverse().find(p=>p.type==="assistant/message"),m=f?sM(f):"";if(d?.kind!=="completed"&&!m)throw new Error(nM(d));return m}if(Date.now()>l)throw new Error(`dsh turn timed out after ${i}ms waiting for turn/end`);await new Promise(d=>setTimeout(d,tM))}}}});import{existsSync as iM}from"node:fs";import{join as Oy,resolve as oM}from"node:path";import{createRequire as aM}from"node:module";function lM(){return Zd===null&&(Zd=aM(import.meta.url)("node:sqlite").DatabaseSync),Zd}function Qd(t={}){return oM(t.hermesHome?.trim()||process.env.HERMES_HOME?.trim()||Oy(ge,".hermes"))}function cM(t={}){return Oy(Qd(t),"state.db")}function Js(t){let e=typeof t=="number"&&Number.isFinite(t)?t:0;return new Date(e*1e3)}function tt(t){return typeof t=="string"&&t.length>0?t:void 0}function dM(t){if(!t)return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function xy(t){return tt(t.cwd)??tt(dM(t.model_config).cwd)??"(unknown)"}function uM(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function fM(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t;if(typeof t!="string")return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function Ry(t){let e=t.input_tokens??0,n=t.output_tokens??0,r=t.cache_read_tokens??0,s=t.cache_write_tokens??0,i=t.reasoning_tokens??0;return(t.message_count??0)>0&&e+n+r+s+i>0?{totalInputTokens:e,totalCachedInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:n,totalReasoningOutputTokens:i}:{}}var Zd,Ny,Ay,Fo,Ly=E(()=>{"use strict";Nt();ae();Zd=null;Ny="acp";Ay=`id, source, model, model_config, started_at,
1583
1583
  last_activity_at, message_count, input_tokens, output_tokens,
1584
1584
  cache_read_tokens, cache_write_tokens, reasoning_tokens, cwd, title`;Fo=class{name="hermes";dbPath;busyTimeoutMs;discoverLimit;constructor(e){this.dbPath=cM(e),this.busyTimeoutMs=e?.busyTimeoutMs??5e3,this.discoverLimit=e?.discoverLimit??200}get stateDbPath(){return this.dbPath}openDb(){if(!iM(this.dbPath))return null;let e=null;try{return e=new(lM())(this.dbPath,{open:!0,readOnly:!0}),e.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),e}catch(n){return e?.close(),C({event:"hermes_store_unavailable",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),null}}selectSessionRow(e,n){return e.prepare(`SELECT ${Ay} FROM sessions WHERE id = ? AND source = ?`).get(n,Ny)??null}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let n=e.prepare(`SELECT ${Ay} FROM sessions
1585
1585
  WHERE source = ?
1586
1586
  ORDER BY COALESCE(last_activity_at, started_at) DESC
1587
- LIMIT ?`).all(Ny,this.discoverLimit),r=[];for(let s of n){let i=this.previewTexts(e,s.id);r.push({provider:this.name,sessionId:s.id,slug:nt(s.title),cwd:xy(s),createdAt:Js(s.started_at),modifiedAt:Js(s.last_activity_at??s.started_at),model:nt(s.model),startCommand:this.name,firstUserMessage:i.first,lastUserMessage:i.last,messageCount:s.message_count??0,filePath:this.dbPath,...Ry(s)})}return r}catch(n){return C({event:"hermes_discover_sessions_failed",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),[]}finally{e.close()}}activeMessageRows(e,n){let r=`id, session_id, role, content, tool_call_id, tool_calls, tool_name,
1587
+ LIMIT ?`).all(Ny,this.discoverLimit),r=[];for(let s of n){let i=this.previewTexts(e,s.id);r.push({provider:this.name,sessionId:s.id,slug:tt(s.title),cwd:xy(s),createdAt:Js(s.started_at),modifiedAt:Js(s.last_activity_at??s.started_at),model:tt(s.model),startCommand:this.name,firstUserMessage:i.first,lastUserMessage:i.last,messageCount:s.message_count??0,filePath:this.dbPath,...Ry(s)})}return r}catch(n){return C({event:"hermes_discover_sessions_failed",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),[]}finally{e.close()}}activeMessageRows(e,n){let r=`id, session_id, role, content, tool_call_id, tool_calls, tool_name,
1588
1588
  timestamp, finish_reason`,s="WHERE session_id = ? AND role IN ('user', 'assistant', 'tool')";try{return e.prepare(`SELECT ${r} FROM messages ${s} AND active = 1 ORDER BY id ASC`).all(n)}catch(i){if(!/no such column/i.test(i instanceof Error?i.message:String(i)))throw i;return e.prepare(`SELECT ${r} FROM messages ${s} ORDER BY id ASC`).all(n)}}previewTexts(e,n){try{let[r,s]=["ASC","DESC"].map(i=>{let o=`SELECT content FROM messages WHERE session_id = ?
1589
- AND role = 'user' AND content != ''`,a;try{a=e.prepare(`${o} AND active = 1 ORDER BY id ${i} LIMIT 1`).get(n)}catch(l){if(!/no such column: active/i.test(String(l)))throw l;a=e.prepare(`${o} ORDER BY id ${i} LIMIT 1`).get(n)}return a?G(a.content,80):void 0});return{first:r,last:s}}catch{return{}}}async loadSession(e){let n=this.openDb();if(!n)return null;try{let r=this.selectSessionRow(n,e);if(!r)return null;let s=this.activeMessageRows(n,e),i=[],o,a;for(let l of s){let c=Js(l.timestamp),u=l.content??"";if(l.role==="user"){u.length>0&&(o||(o=G(u,80)),a=G(u,80)),i.push({role:"user",timestamp:c,content:u||"(empty)"});continue}if(l.role==="tool"){i.push({role:"tool_result",timestamp:c,content:u,toolCallId:nt(l.tool_call_id),toolName:nt(l.tool_name)});continue}u.length>0&&i.push({role:"assistant",timestamp:c,content:u,model:nt(r.model),stopReason:nt(l.finish_reason)});for(let d of uM(l.tool_calls)){let f=fM(d.function?.arguments);i.push({role:"tool_use",timestamp:c,content:nt(d.function?.name)??"tool_call",toolName:nt(d.function?.name),toolCallId:nt(d.call_id)??nt(d.id),toolInput:typeof d.function?.arguments=="string"?d.function.arguments:JSON.stringify(d.function?.arguments??{}),toolInputData:pt(f)})}}return{provider:this.name,sessionId:r.id,slug:nt(r.title),cwd:xy(r),createdAt:Js(r.started_at),modifiedAt:Js(r.last_activity_at??r.started_at),model:nt(r.model),startCommand:this.name,firstUserMessage:o,lastUserMessage:a,messageCount:r.message_count??i.length,filePath:this.dbPath,...Ry(r),messages:i}}catch(r){return C({event:"hermes_load_session_failed",provider:this.name,session_id:e,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),null}finally{n.close()}}async resolveSessionPath(e){let n=this.openDb();if(!n)return null;try{return this.selectSessionRow(n,e)?this.dbPath:null}catch{return null}finally{n.close()}}async deleteSession(e){return!1}}});import{mkdir as mM}from"node:fs/promises";function _M(t){return pM.test(t)}function gM(t){if(t==="plan")throw new Error(`provider "hermes" does not support --permission-mode plan: Hermes's ACP mode ladder (default/accept_edits/dont_ask) governs file edits only and has no plan-equivalent, so lmctl refuses rather than silently running the member with edit auto-approval.`);return hM}function tu(t){return new eu(t)}var pM,hM,eu,nu=E(()=>{"use strict";_t();Ly();cn();it();ae();pM=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;hM="dont_ask";eu=class extends Te{hermesProvider;hermesHome;constructor(e){let n=new Fo(e);super({provider:n,capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Hermes has no provider-side leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"hermes",seedArgs:[],resumeTemplate:"hermes --yolo --resume {{session_id}}",startTemplate:"hermes",transport:async(r,s)=>Gt(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:gM(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=Qd(e)}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(e,n){await mM(e,{recursive:!0}),n?.effort&&C({event:"hermes_effort_ignored",provider:this.name,effort:n.effort,reason:"hermes has no ACP-level effort surface"});let r;try{r=await this.sendTurn(n?.prompt??ce,{sessionId:"",cwd:e,model:n?.model})}catch(s){return{success:!1,error:`hermes ACP seed failed: ${s instanceof Error?s.message:String(s)}`}}return _M(r.sessionId)?{success:!0,sessionId:r.sessionId}:(C({event:"hermes_seed_contract_violation",provider:this.name,session_id:r.sessionId,reason:"session/new did not return a UUID session id"}),{success:!1,error:`hermes ACP session/new did not return a UUID session id (got ${JSON.stringify(r.sessionId)})`})}}});import{createHash as yM}from"node:crypto";import{existsSync as wM,mkdirSync as su,readFileSync as EM,renameSync as TM,rmdirSync as Uy,statSync as vM,writeFileSync as SM}from"node:fs";import{dirname as lu,join as Cy,resolve as ru}from"node:path";function bM(t){return yM("sha256").update(t).digest("hex").slice(0,8)}function kM(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function IM(t,e){let n=e?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function Wy(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Uo(t){return Math.max(1,Math.ceil(t.length/4))}function Pr(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return ru(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?Cy(lu(ru(n)),".lmctl-claude-mock","sessions.json"):Cy(ru(t),".lmctl-claude-mock","sessions.json")}function $y(){return{schemaVersion:1,sessions:{}}}function Gs(t){if(!wM(t))return $y();try{let e=JSON.parse(EM(t,"utf8")),n=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},r=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=iu(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return $y()}}function qy(t,e){su(lu(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;SM(n,`${JSON.stringify(e,null,2)}
1590
- `,"utf8"),TM(n,t)}function xM(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function RM(t){let e=`${t}.lock`;su(lu(t),{recursive:!0});let n=Date.now()+My;for(;;)try{return su(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-vM(e).mtimeMs>NM){try{Uy(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${My}ms: ${e}`);xM(AM)}}function OM(t){try{Uy(t)}catch{}}function Hy(t,e){let n=RM(t);try{return e()}finally{OM(n)}}function LM(t){return{...t,timestamp:t.timestamp.toISOString()}}function CM(t){return{...t,timestamp:new Date(t.timestamp)}}function $M(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(LM)}}function By(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(CM)}}function Wo(t,e=process.cwd()){let n=jr.get(t);if(n!==void 0)return n;let s=Gs(Pr(e)).sessions[t];if(s===void 0)return;let i=By(s);return jr.set(i.sessionId,i),i}function Dy(t){jr.set(t.sessionId,t);let e=Pr(t.cwd);Hy(e,()=>{let n=Gs(e);n.sessions[t.sessionId]=$M({...t,filePath:e}),qy(e,n)})}function MM(t,e=process.cwd()){let n=Pr(e);return Hy(n,()=>{let r=Gs(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],qy(n,r)),s})}function DM(){let t=Gs(Pr()),e=Object.values(t.sessions).map(By);for(let n of e)jr.set(n.sessionId,n);return e}function iu(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function jy(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=iu(t.delayMs);return{kind:"success",text:t.text,...e!==void 0?{delayMs:e}:{}}}if(t!==void 0&&typeof t.error=="string"&&typeof t.text!="string"){let e=iu(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function Py(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function jM(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=jy(n[t]??n[Wy(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let i=jy(r[s]);if(i!==void 0)return i}}}function Fy(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 cu(){return new au}var jr,NM,AM,My,ou,au,du=E(()=>{"use strict";jr=new Map;NM=5e3,AM=15,My=1e4;ou=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of DM())e.set(n.sessionId,n);for(let n of jr.values())e.set(n.sessionId,n);return[...e.values()].map(Fy)}async loadSession(e){let n=Wo(e);return n===void 0?null:{...Fy(n),messages:n.messages.slice()}}async resolveSessionPath(e){return Wo(e)?.filePath??null}async deleteSession(e){let n=jr.delete(e),r=MM(e);return n||r}},au=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new ou;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,n){let r=kM(IM(e,n)),s=`mock-${r}-${bM(`${e}:${r}`)}`,i=new Date,o=Pr(e),a=Wo(s,e),l=n?.prompt??"ClaudeMock seed",c=Uo(l),u={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return u.messages.push({role:"user",timestamp:i,content:l}),u.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),u.totalInputTokens+=c,u.totalOutputTokens+=Uo("ACK: ClaudeMock seeded"),Dy(u),{success:!0,sessionId:s}}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,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,n){let r=Date.now(),s=Wo(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=Gs(Pr(n.cwd)),a=jM(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await Py(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${Wy(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:c,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Uo(e),s.totalOutputTokens+=Uo(c),Dy(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await Py(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Vt(t){let e=[cd({claudeDir:t?.claudeDir}),fd({codexDir:t?.codexDir,codeDir:t?.codeDir}),gd({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Td({copilotDir:t?.copilotDir}),Id(),Od({kimiHome:t?.kimiHome}),$d({lmplayerDbPath:t?.lmplayerDbPath}),jd(),Wd({agyDir:t?.agyDir}),Yd({dshHome:t?.dshHome}),tu({hermesHome:t?.hermesHome})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(cu()),e}var uu=E(()=>{"use strict";dd();md();yd();vd();Nd();Ld();Md();Pd();qd();zd();nu();du();dd();md();yd();vd();Nd();Ld();Md();Pd();qd();zd();nu();du()});var pu={};oe(pu,{ProviderRegistry:()=>Ms,TransportConnectionError:()=>we,TransportError:()=>ht,TransportJsonError:()=>ho,TransportProcessError:()=>an,TransportRpcError:()=>ln,_resetDefaultRegistryForTests:()=>PM,chat:()=>dn,countTokens:()=>mu,createAdapterRegistry:()=>Jt,createAllAdapters:()=>Vt,listSessions:()=>rr,seed:()=>fu});function Ho(){return qo===null&&(qo=Jt(Vt())),qo}function PM(){qo=null}function Jy(t,e){let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function dn(t){let e=t.registry??Ho(),n=Jy(e,t.provider),r={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,holdOpen:t.holdOpen,requireResume:t.requireResume},s=await n.sendTurn(t.prompt,r);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function fu(t){let e=t.registry??Ho(),n=Jy(e,t.provider),r=await Xy(e,t.provider,t.cwd),s=await n.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await Xy(e,t.provider,t.cwd),a=FM(r,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function Xy(t,e,n){let r=await t.listAll({provider:e,workspace:n}),s=new Map;for(let i of r)s.set(i.sessionId,i.modifiedAt);return s}function FM(t,e){let n=[];for(let r of e.keys())t.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function rr(t={}){return(t.registry??Ho()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function mu(t){let n=await(t.registry??Ho()).getSession(t.sessionId,t.provider);if(!n)throw new Error(`session "${t.sessionId}" not found`);let r=n.totalInputTokens??0,s=n.totalCachedInputTokens??0,i=n.totalCacheWriteInputTokens??0,o=n.totalOutputTokens??0,a=n.totalReasoningOutputTokens??0;return{provider:n.provider,sessionId:n.sessionId,input:r,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:r+s+i+o+a,lastTurn:n.lastTokenUsage}}var qo,gt=E(()=>{"use strict";jc();uu();jc();uu();Rr();qo=null});function UM(){return _u===null&&(_u=Jt(Vt())),_u}async function Bo(t){let{dal:e,team_member_id:n}=t,r=e!==void 0&&n!==void 0;r&&e.setMemberState(n,"in_chat");let s=!1,i;try{return await qM(t)}catch(o){throw s=!0,i=o,o}finally{if(r)if(!s)Fr.delete(n),e.setMemberState(n,"idle");else{let o=WM(i,n);e.setMemberState(n,o!==null?"attention_needed":"idle",o)}}}function WM(t,e){if(!(t instanceof Oe))return Fr.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 n=(Fr.get(e)??0)+1;return n>=3?(Fr.delete(e),"consecutive_timeouts"):(Fr.set(e,n),null)}return Fr.delete(e),null}async function qM(t){let e=t.timeoutMs,n=typeof e=="number"&&e>0,r=UM(),s;try{let u=await r.resolveSession(t.sessionid);if(!u)return Promise.reject(new Oe("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,hu(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Oe("other",null,`library: session resolution failed: ${Gy(u)}`,hu(t.sessionid,t.sessiondir,"unresolved")))}let i=hu(t.sessionid,t.sessiondir,s),o=new AbortController,a=n?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await dn({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:r,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Oe("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,i);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(u){throw l?new Oe("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):HM(u,i)}finally{a!==null&&clearTimeout(a)}}function hu(t,e,n){return["<library>","chat",t,e,"--provider",n]}function Gy(t){return t instanceof Error?t.message:String(t)}function HM(t,e){if(t instanceof Oe)return t;if(t instanceof we){let n=t.cause;return n?.code==="ENOENT_CWD"?new Oe("sessiondir_missing",null,t.message,e):n?.code==="ENOENT"?new Oe("enoent",null,t.message,e):new Oe("other",null,t.message,e)}return t instanceof an?new Oe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof ln?new Oe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ht?new Oe("other",null,t.message,e):new Oe("other",null,Gy(t),e)}var Oe,_u,Fr,Xo=E(()=>{"use strict";gt();Oe=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="ChatError"}},_u=null;Fr=new Map});function Ky(){return gu===null&&(gu=Jt(Vt())),gu}function XM(t,e){if(!BM.test(t))return t;let n=e.getConfig(`workspace.${t}`);if(n===null||n.length===0)throw new Ce("other",null,`no provider mapping for ${t} (set lmctl_config workspace.${t})`,["<library>","seed","--provider",t]);return n}async function Jo(t){let e=XM(t.member.provider,t.dal),n=e===t.member.provider?t.member:{...t.member,provider:e},r=await JM({member:n});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:r.sessionid,provider_resolved:e}}async function JM(t){let e=t.member.provider,n=t.member.sessiondir,r=yu("seed",n,e);try{let s=await fu({provider:e,cwd:n,registry:Ky()});if(!s.success)throw KM(s.error,r);if(!s.sessionId)throw new Ce("parse",0,"",r);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ce?s:wu(s,r)}}async function Vy(t){return GM(t)}async function GM(t){let e=Ky(),n=yu("tokens",t.sessionid,"unresolved"),r;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Ce("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,n);r=i.provider.name}catch(i){throw i instanceof Ce?i:wu(i,n)}let s=yu("tokens",t.sessionid,r);try{let i=await mu({sessionId:t.sessionid,provider:r,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Ce?i:wu(i,s)}}function yu(t,e,n){return["<library>",t,e,"--provider",n]}function KM(t,e){let n=t??"";if(/\bENOENT\b/i.test(n))return new Ce("enoent",null,n,e);if(/timed?\s*out/i.test(n))return new Ce("timeout",null,n,e);if(/\bexit code\s+(-?\d+)\b/i.test(n)){let r=/\bexit code\s+(-?\d+)\b/i.exec(n);return new Ce("nonzero_exit",Number(r[1]),n,e)}return new Ce("other",null,n,e)}function wu(t,e){return t instanceof Ce?t:t instanceof we?t.cause?.code==="ENOENT"?new Ce("enoent",null,t.message,e):new Ce("other",null,t.message,e):t instanceof an?new Ce("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof ln?new Ce("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ht?new Ce("other",null,t.message,e):new Ce("other",null,t instanceof Error?t.message:String(t),e)}var Ce,gu,BM,Eu=E(()=>{"use strict";gt();Ce=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="SeedError"}},gu=null;BM=/^provider[123]$/});function Go(t){return Buffer.from(t,"utf8").toString("base64url")}function Vs(t){return Buffer.from(t,"base64url").toString("utf8")}async function Yy(t,e=n=>Vy({sessionid:n})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let n=0,r=0;for(let s of VM(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),n+=1}catch(o){r+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:n,failed:r}}async function zy(t,e,n){let r=Zy(t,e,n);if(r===null||r.member.sessionid===null)throw new Error("session member not found");if(r.member.state!=="idle")throw new Ks(n,r.member.state);t.setMemberState(r.member.id,"in_chat","compacting");try{return await Bo({sessionid:r.member.sessionid,sessiondir:r.member.sessiondir,prompt:"/compact"}),t.setMemberState(r.member.id,"idle",null),{ok:!0,row:Qy(t,e,n)}}catch(s){throw t.setMemberState(r.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function Tu(t,e,n){let r=Zy(t,e,n);if(r===null)throw new Error("session member not found");let s=await Jo({member:r.member,dal:t});return t.updateTeamMemberSession(r.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Qy(t,e,n)}}function VM(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(n=>n.sessionid!==null).map(n=>({team_name:e.name,member:n})))}function Zy(t,e,n){let r=t.findTeamByName(e);if(r===null)return null;let s=t.findTeamMemberByAlias(r.id,n);return s===null?null:{team_name:r.name,member:s}}function Qy(t,e,n){return t.sessionSizeHistory(e,n,1)[0]??null}var Ks,Ko=E(()=>{"use strict";Xo();Eu();Ks=class extends Error{constructor(e,n){super(`member ${e} is currently ${n}; cannot compact while busy`),this.name="MemberBusyError"}}});async function vu(t){let e=t.dal,n=t.nowMs??Date.now(),r=t.thresholdMs??zM(e),s=n-r,i=e.query(`
1589
+ AND role = 'user' AND content != ''`,a;try{a=e.prepare(`${o} AND active = 1 ORDER BY id ${i} LIMIT 1`).get(n)}catch(l){if(!/no such column: active/i.test(String(l)))throw l;a=e.prepare(`${o} ORDER BY id ${i} LIMIT 1`).get(n)}return a?H(a.content,80):void 0});return{first:r,last:s}}catch{return{}}}async loadSession(e){let n=this.openDb();if(!n)return null;try{let r=this.selectSessionRow(n,e);if(!r)return null;let s=this.activeMessageRows(n,e),i=[],o,a;for(let l of s){let c=Js(l.timestamp),u=l.content??"";if(l.role==="user"){u.length>0&&(o||(o=H(u,80)),a=H(u,80)),i.push({role:"user",timestamp:c,content:u||"(empty)"});continue}if(l.role==="tool"){i.push({role:"tool_result",timestamp:c,content:u,toolCallId:tt(l.tool_call_id),toolName:tt(l.tool_name)});continue}u.length>0&&i.push({role:"assistant",timestamp:c,content:u,model:tt(r.model),stopReason:tt(l.finish_reason)});for(let d of uM(l.tool_calls)){let f=fM(d.function?.arguments);i.push({role:"tool_use",timestamp:c,content:tt(d.function?.name)??"tool_call",toolName:tt(d.function?.name),toolCallId:tt(d.call_id)??tt(d.id),toolInput:typeof d.function?.arguments=="string"?d.function.arguments:JSON.stringify(d.function?.arguments??{}),toolInputData:mt(f)})}}return{provider:this.name,sessionId:r.id,slug:tt(r.title),cwd:xy(r),createdAt:Js(r.started_at),modifiedAt:Js(r.last_activity_at??r.started_at),model:tt(r.model),startCommand:this.name,firstUserMessage:o,lastUserMessage:a,messageCount:r.message_count??i.length,filePath:this.dbPath,...Ry(r),messages:i}}catch(r){return C({event:"hermes_load_session_failed",provider:this.name,session_id:e,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),null}finally{n.close()}}async resolveSessionPath(e){let n=this.openDb();if(!n)return null;try{return this.selectSessionRow(n,e)?this.dbPath:null}catch{return null}finally{n.close()}}async deleteSession(e){return!1}}});import{mkdir as mM}from"node:fs/promises";function _M(t){return pM.test(t)}function gM(t){if(t==="plan")throw new Error(`provider "hermes" does not support --permission-mode plan: Hermes's ACP mode ladder (default/accept_edits/dont_ask) governs file edits only and has no plan-equivalent, so lmctl refuses rather than silently running the member with edit auto-approval.`);return hM}function tu(t){return new eu(t)}var pM,hM,eu,nu=E(()=>{"use strict";pt();Ly();cn();st();ae();pM=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;hM="dont_ask";eu=class extends Te{hermesProvider;hermesHome;constructor(e){let n=new Fo(e);super({provider:n,capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Hermes has no provider-side leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"hermes",seedArgs:[],resumeTemplate:"hermes --yolo --resume {{session_id}}",startTemplate:"hermes",transport:async(r,s)=>Gt(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:gM(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=Qd(e)}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(e,n){await mM(e,{recursive:!0}),n?.effort&&C({event:"hermes_effort_ignored",provider:this.name,effort:n.effort,reason:"hermes has no ACP-level effort surface"});let r;try{r=await this.sendTurn(n?.prompt??ce,{sessionId:"",cwd:e,model:n?.model})}catch(s){return{success:!1,error:`hermes ACP seed failed: ${s instanceof Error?s.message:String(s)}`}}return _M(r.sessionId)?{success:!0,sessionId:r.sessionId}:(C({event:"hermes_seed_contract_violation",provider:this.name,session_id:r.sessionId,reason:"session/new did not return a UUID session id"}),{success:!1,error:`hermes ACP session/new did not return a UUID session id (got ${JSON.stringify(r.sessionId)})`})}}});import{createHash as yM}from"node:crypto";import{existsSync as wM,mkdirSync as su,readFileSync as EM,renameSync as TM,rmdirSync as Uy,statSync as vM,writeFileSync as SM}from"node:fs";import{dirname as lu,join as Cy,resolve as ru}from"node:path";function bM(t){return yM("sha256").update(t).digest("hex").slice(0,8)}function kM(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function IM(t,e){let n=e?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function Wy(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Uo(t){return Math.max(1,Math.ceil(t.length/4))}function Pr(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return ru(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?Cy(lu(ru(n)),".lmctl-claude-mock","sessions.json"):Cy(ru(t),".lmctl-claude-mock","sessions.json")}function $y(){return{schemaVersion:1,sessions:{}}}function Gs(t){if(!wM(t))return $y();try{let e=JSON.parse(EM(t,"utf8")),n=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},r=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=iu(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return $y()}}function qy(t,e){su(lu(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;SM(n,`${JSON.stringify(e,null,2)}
1590
+ `,"utf8"),TM(n,t)}function xM(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function RM(t){let e=`${t}.lock`;su(lu(t),{recursive:!0});let n=Date.now()+My;for(;;)try{return su(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-vM(e).mtimeMs>NM){try{Uy(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${My}ms: ${e}`);xM(AM)}}function OM(t){try{Uy(t)}catch{}}function Hy(t,e){let n=RM(t);try{return e()}finally{OM(n)}}function LM(t){return{...t,timestamp:t.timestamp.toISOString()}}function CM(t){return{...t,timestamp:new Date(t.timestamp)}}function $M(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(LM)}}function By(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(CM)}}function Wo(t,e=process.cwd()){let n=jr.get(t);if(n!==void 0)return n;let s=Gs(Pr(e)).sessions[t];if(s===void 0)return;let i=By(s);return jr.set(i.sessionId,i),i}function Dy(t){jr.set(t.sessionId,t);let e=Pr(t.cwd);Hy(e,()=>{let n=Gs(e);n.sessions[t.sessionId]=$M({...t,filePath:e}),qy(e,n)})}function MM(t,e=process.cwd()){let n=Pr(e);return Hy(n,()=>{let r=Gs(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],qy(n,r)),s})}function DM(){let t=Gs(Pr()),e=Object.values(t.sessions).map(By);for(let n of e)jr.set(n.sessionId,n);return e}function iu(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function jy(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=iu(t.delayMs);return{kind:"success",text:t.text,...e!==void 0?{delayMs:e}:{}}}if(t!==void 0&&typeof t.error=="string"&&typeof t.text!="string"){let e=iu(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function Py(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function jM(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=jy(n[t]??n[Wy(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let i=jy(r[s]);if(i!==void 0)return i}}}function Fy(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 cu(){return new au}var jr,NM,AM,My,ou,au,du=E(()=>{"use strict";jr=new Map;NM=5e3,AM=15,My=1e4;ou=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of DM())e.set(n.sessionId,n);for(let n of jr.values())e.set(n.sessionId,n);return[...e.values()].map(Fy)}async loadSession(e){let n=Wo(e);return n===void 0?null:{...Fy(n),messages:n.messages.slice()}}async resolveSessionPath(e){return Wo(e)?.filePath??null}async deleteSession(e){let n=jr.delete(e),r=MM(e);return n||r}},au=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new ou;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,n){let r=kM(IM(e,n)),s=`mock-${r}-${bM(`${e}:${r}`)}`,i=new Date,o=Pr(e),a=Wo(s,e),l=n?.prompt??"ClaudeMock seed",c=Uo(l),u={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return u.messages.push({role:"user",timestamp:i,content:l}),u.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),u.totalInputTokens+=c,u.totalOutputTokens+=Uo("ACK: ClaudeMock seeded"),Dy(u),{success:!0,sessionId:s}}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,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,n){let r=Date.now(),s=Wo(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=Gs(Pr(n.cwd)),a=jM(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await Py(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${Wy(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:c,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Uo(e),s.totalOutputTokens+=Uo(c),Dy(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await Py(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Vt(t){let e=[cd({claudeDir:t?.claudeDir}),fd({codexDir:t?.codexDir,codeDir:t?.codeDir}),gd({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Td({copilotDir:t?.copilotDir}),Id(),Od({kimiHome:t?.kimiHome}),$d({lmplayerDbPath:t?.lmplayerDbPath}),jd(),Wd({agyDir:t?.agyDir}),Yd({dshHome:t?.dshHome}),tu({hermesHome:t?.hermesHome})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(cu()),e}var uu=E(()=>{"use strict";dd();md();yd();vd();Nd();Ld();Md();Pd();qd();zd();nu();du();dd();md();yd();vd();Nd();Ld();Md();Pd();qd();zd();nu();du()});var pu={};oe(pu,{ProviderRegistry:()=>Ms,TransportConnectionError:()=>we,TransportError:()=>_t,TransportJsonError:()=>ho,TransportProcessError:()=>an,TransportRpcError:()=>ln,_resetDefaultRegistryForTests:()=>PM,chat:()=>dn,countTokens:()=>mu,createAdapterRegistry:()=>Jt,createAllAdapters:()=>Vt,listSessions:()=>rr,seed:()=>fu});function Ho(){return qo===null&&(qo=Jt(Vt())),qo}function PM(){qo=null}function Jy(t,e){let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function dn(t){let e=t.registry??Ho(),n=Jy(e,t.provider),r={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,holdOpen:t.holdOpen,requireResume:t.requireResume},s=await n.sendTurn(t.prompt,r);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function fu(t){let e=t.registry??Ho(),n=Jy(e,t.provider),r=await Xy(e,t.provider,t.cwd),s=await n.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await Xy(e,t.provider,t.cwd),a=FM(r,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function Xy(t,e,n){let r=await t.listAll({provider:e,workspace:n}),s=new Map;for(let i of r)s.set(i.sessionId,i.modifiedAt);return s}function FM(t,e){let n=[];for(let r of e.keys())t.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function rr(t={}){return(t.registry??Ho()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function mu(t){let n=await(t.registry??Ho()).getSession(t.sessionId,t.provider);if(!n)throw new Error(`session "${t.sessionId}" not found`);let r=n.totalInputTokens??0,s=n.totalCachedInputTokens??0,i=n.totalCacheWriteInputTokens??0,o=n.totalOutputTokens??0,a=n.totalReasoningOutputTokens??0;return{provider:n.provider,sessionId:n.sessionId,input:r,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:r+s+i+o+a,lastTurn:n.lastTokenUsage}}var qo,ht=E(()=>{"use strict";jc();uu();jc();uu();Rr();qo=null});function UM(){return _u===null&&(_u=Jt(Vt())),_u}async function Bo(t){let{dal:e,team_member_id:n}=t,r=e!==void 0&&n!==void 0;r&&e.setMemberState(n,"in_chat");let s=!1,i;try{return await qM(t)}catch(o){throw s=!0,i=o,o}finally{if(r)if(!s)Fr.delete(n),e.setMemberState(n,"idle");else{let o=WM(i,n);e.setMemberState(n,o!==null?"attention_needed":"idle",o)}}}function WM(t,e){if(!(t instanceof Oe))return Fr.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 n=(Fr.get(e)??0)+1;return n>=3?(Fr.delete(e),"consecutive_timeouts"):(Fr.set(e,n),null)}return Fr.delete(e),null}async function qM(t){let e=t.timeoutMs,n=typeof e=="number"&&e>0,r=UM(),s;try{let u=await r.resolveSession(t.sessionid);if(!u)return Promise.reject(new Oe("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,hu(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Oe("other",null,`library: session resolution failed: ${Gy(u)}`,hu(t.sessionid,t.sessiondir,"unresolved")))}let i=hu(t.sessionid,t.sessiondir,s),o=new AbortController,a=n?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await dn({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:r,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Oe("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,i);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(u){throw l?new Oe("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):HM(u,i)}finally{a!==null&&clearTimeout(a)}}function hu(t,e,n){return["<library>","chat",t,e,"--provider",n]}function Gy(t){return t instanceof Error?t.message:String(t)}function HM(t,e){if(t instanceof Oe)return t;if(t instanceof we){let n=t.cause;return n?.code==="ENOENT_CWD"?new Oe("sessiondir_missing",null,t.message,e):n?.code==="ENOENT"?new Oe("enoent",null,t.message,e):new Oe("other",null,t.message,e)}return t instanceof an?new Oe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof ln?new Oe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof _t?new Oe("other",null,t.message,e):new Oe("other",null,Gy(t),e)}var Oe,_u,Fr,Xo=E(()=>{"use strict";ht();Oe=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="ChatError"}},_u=null;Fr=new Map});function Ky(){return gu===null&&(gu=Jt(Vt())),gu}function XM(t,e){if(!BM.test(t))return t;let n=e.getConfig(`workspace.${t}`);if(n===null||n.length===0)throw new Ce("other",null,`no provider mapping for ${t} (set lmctl_config workspace.${t})`,["<library>","seed","--provider",t]);return n}async function Jo(t){let e=XM(t.member.provider,t.dal),n=e===t.member.provider?t.member:{...t.member,provider:e},r=await JM({member:n});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:r.sessionid,provider_resolved:e}}async function JM(t){let e=t.member.provider,n=t.member.sessiondir,r=yu("seed",n,e);try{let s=await fu({provider:e,cwd:n,registry:Ky()});if(!s.success)throw KM(s.error,r);if(!s.sessionId)throw new Ce("parse",0,"",r);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ce?s:wu(s,r)}}async function Vy(t){return GM(t)}async function GM(t){let e=Ky(),n=yu("tokens",t.sessionid,"unresolved"),r;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Ce("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,n);r=i.provider.name}catch(i){throw i instanceof Ce?i:wu(i,n)}let s=yu("tokens",t.sessionid,r);try{let i=await mu({sessionId:t.sessionid,provider:r,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Ce?i:wu(i,s)}}function yu(t,e,n){return["<library>",t,e,"--provider",n]}function KM(t,e){let n=t??"";if(/\bENOENT\b/i.test(n))return new Ce("enoent",null,n,e);if(/timed?\s*out/i.test(n))return new Ce("timeout",null,n,e);if(/\bexit code\s+(-?\d+)\b/i.test(n)){let r=/\bexit code\s+(-?\d+)\b/i.exec(n);return new Ce("nonzero_exit",Number(r[1]),n,e)}return new Ce("other",null,n,e)}function wu(t,e){return t instanceof Ce?t:t instanceof we?t.cause?.code==="ENOENT"?new Ce("enoent",null,t.message,e):new Ce("other",null,t.message,e):t instanceof an?new Ce("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof ln?new Ce("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof _t?new Ce("other",null,t.message,e):new Ce("other",null,t instanceof Error?t.message:String(t),e)}var Ce,gu,BM,Eu=E(()=>{"use strict";ht();Ce=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="SeedError"}},gu=null;BM=/^provider[123]$/});function Go(t){return Buffer.from(t,"utf8").toString("base64url")}function Vs(t){return Buffer.from(t,"base64url").toString("utf8")}async function Yy(t,e=n=>Vy({sessionid:n})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let n=0,r=0;for(let s of VM(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),n+=1}catch(o){r+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:n,failed:r}}async function zy(t,e,n){let r=Zy(t,e,n);if(r===null||r.member.sessionid===null)throw new Error("session member not found");if(r.member.state!=="idle")throw new Ks(n,r.member.state);t.setMemberState(r.member.id,"in_chat","compacting");try{return await Bo({sessionid:r.member.sessionid,sessiondir:r.member.sessiondir,prompt:"/compact"}),t.setMemberState(r.member.id,"idle",null),{ok:!0,row:Qy(t,e,n)}}catch(s){throw t.setMemberState(r.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function Tu(t,e,n){let r=Zy(t,e,n);if(r===null)throw new Error("session member not found");let s=await Jo({member:r.member,dal:t});return t.updateTeamMemberSession(r.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Qy(t,e,n)}}function VM(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(n=>n.sessionid!==null).map(n=>({team_name:e.name,member:n})))}function Zy(t,e,n){let r=t.findTeamByName(e);if(r===null)return null;let s=t.findTeamMemberByAlias(r.id,n);return s===null?null:{team_name:r.name,member:s}}function Qy(t,e,n){return t.sessionSizeHistory(e,n,1)[0]??null}var Ks,Ko=E(()=>{"use strict";Xo();Eu();Ks=class extends Error{constructor(e,n){super(`member ${e} is currently ${n}; cannot compact while busy`),this.name="MemberBusyError"}}});async function vu(t){let e=t.dal,n=t.nowMs??Date.now(),r=t.thresholdMs??zM(e),s=n-r,i=e.query(`
1591
1591
  SELECT
1592
1592
  isess.id AS interactive_session_id,
1593
1593
  isess.run_id,
@@ -1613,10 +1613,10 @@ ${n}`:n}function ZL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1613
1613
  JOIN step s ON s.id = isess.step_id
1614
1614
  WHERE isess.status = 'waiting_agent'
1615
1615
  AND r.terminal_state IS NULL
1616
- `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=eD(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=ZM(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:Qe(c),last_activity_at:a.last_activity_at,elapsed_ms:n-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,QM(e,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return o}function zM(t){return ew(t.getConfig(Vo),YM)*1e3}function Su(t,e){return ew(t.getConfig(Yo),e)}function ew(t,e){if(t===null||t.trim().length===0)return e;let n=Number(t);return Number.isFinite(n)&&n>0?Math.floor(n):e}function ZM(t,e,n){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,n)[0]??null}function QM(t,e,n,r){return t.query(`SELECT * FROM attention
1616
+ `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=eD(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=ZM(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:Ze(c),last_activity_at:a.last_activity_at,elapsed_ms:n-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,QM(e,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return o}function zM(t){return ew(t.getConfig(Vo),YM)*1e3}function Su(t,e){return ew(t.getConfig(Yo),e)}function ew(t,e){if(t===null||t.trim().length===0)return e;let n=Number(t);return Number.isFinite(n)&&n>0?Math.floor(n):e}function ZM(t,e,n){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,n)[0]??null}function QM(t,e,n,r){return t.query(`SELECT * FROM attention
1617
1617
  WHERE kind = 'session_hung'
1618
1618
  AND run_id = ?
1619
- AND acknowledged_at IS NULL`,e).some(i=>{let o=tw(i.payload);return o!==null&&o.step_id===n&&o.session_id===r})}function eD(t,e,n){let r=tw(t);return r===null?null:tD(r,e,n)??nD(r,e,n)}function tD(t,e,n){if(!Array.isArray(t.steps))return null;let r=t.steps.filter(rD),s=r.find(a=>a.id===e)??r.find(a=>a.name===e)??r.find(a=>a.name===n);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=sr(s.members)?s.members:null,o=i!==null&&sr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function nD(t,e,n){if(!sr(t.states))return null;let r=t.states[e]??t.states[n];if(!sr(r))return null;let s=r;if(!sr(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function rD(t){return sr(t)}function tw(t){if(t===null)return null;try{let e=JSON.parse(t);return sr(e)?e:null}catch{return null}}function sr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Vo,Yo,YM,bu=E(()=>{"use strict";mt();Vo="monitor.session_hung.elapsed_threshold_seconds",Yo="monitor.session_hung.check_interval_ms",YM=600});function Zo(t){let e=t.query(`
1619
+ AND acknowledged_at IS NULL`,e).some(i=>{let o=tw(i.payload);return o!==null&&o.step_id===n&&o.session_id===r})}function eD(t,e,n){let r=tw(t);return r===null?null:tD(r,e,n)??nD(r,e,n)}function tD(t,e,n){if(!Array.isArray(t.steps))return null;let r=t.steps.filter(rD),s=r.find(a=>a.id===e)??r.find(a=>a.name===e)??r.find(a=>a.name===n);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=sr(s.members)?s.members:null,o=i!==null&&sr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function nD(t,e,n){if(!sr(t.states))return null;let r=t.states[e]??t.states[n];if(!sr(r))return null;let s=r;if(!sr(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function rD(t){return sr(t)}function tw(t){if(t===null)return null;try{let e=JSON.parse(t);return sr(e)?e:null}catch{return null}}function sr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Vo,Yo,YM,bu=E(()=>{"use strict";ft();Vo="monitor.session_hung.elapsed_threshold_seconds",Yo="monitor.session_hung.check_interval_ms",YM=600});function Zo(t){let e=t.query(`
1620
1620
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1621
1621
  `),n={queued:zo(e,"queued"),running:zo(e,"running"),done:zo(e,"done"),failed:zo(e,"failed"),total:Iu(e)},r=t.query(`
1622
1622
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
@@ -1719,7 +1719,7 @@ ${n}`:n}function ZL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1719
1719
  AND acknowledged_at IS NULL
1720
1720
  ORDER BY id ASC`,e).map(N=>({kind:N.kind,severity:N.severity,payload:_D(N.payload)})),T=y.map(N=>{let b=f.get(N),R=p.get(N),K=cD(s,N,g,b,R),j=b===void 0?null:Date.parse(b.started_at),U=b?.ended_at===null||b===void 0?null:Date.parse(b.ended_at),x=b===void 0||Number.isNaN(j??NaN)?null:U!==null&&!Number.isNaN(U)?U-j:K==="running"||K==="paused"?r-j:null,O=b===void 0?null:h.get(b.id)??null,W=hD(R?.last_activity_at??null,O,_),I=i===null||R===void 0?void 0:fD(t,s.team_id,i.definition,R.state_name,b?.state_name??N);return{step_id:b?.id??null,state_id:N,status:K,started_at:b?.started_at??null,ended_at:b?.ended_at??null,last_activity_at:W,elapsed_ms:x,...I!==void 0?{member:I}:{},...R!==void 0?{interactive_session:{id:R.id,status:R.status,turn_count:R.turn_count,state_name:R.state_name}}:{}}});return{run_id:e,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:uD(s,a,T),submitted_at:a?.enqueued_at??s.started_at,nodes:T,current_node_index:dD(T,s.terminal_state!==null),related_attentions:w}}function ia(t,e={}){let n=e.nowMs??Date.now(),r=[],s=t.workflow_name??"?",i=t.workflow_version!==null?`v${t.workflow_version}`:"v?";r.push(`run ${t.run_id} - ${s}, ${i} - ${t.status}`);let o=`${t.submitted_at} (${rw(Date.parse(t.submitted_at),n)} ago)`;r.push(`project: ${t.project??"?"} | submitted: ${o}`),r.push(""),r.push("timeline:"),r.push(`${nw(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":nw(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${oa(a.elapsed_ms)}`;if(r.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 ${rw(a.last_activity_at,n)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";r.push(` ${" ".repeat(24)} ${d}`),r.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){r.push(""),r.push("attentions:");for(let a of t.related_attentions)r.push(`- ${a.kind}${gD(a.payload)}`)}return`${r.join(`
1721
1721
  `)}
1722
- `}function aD(t,e,n){let r=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 i=n(s.state_name);r.includes(i)||r.push(i)}return r}function lD(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function cD(t,e,n,r,s){return r===void 0?"pending":r.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&n===e?"paused":"running":r.outcome===null?"failed":"done"}function dD(t,e){if(t.length===0)return null;let n=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(n>=0)return n;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let r=t.findIndex(s=>s.status==="pending");return r>=0?r:t.length-1}function uD(t,e,n){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||n.some(r=>r.status==="failed")?"failed":"running"}function fD(t,e,n,r,s){let i=mD(n,r,s);if(i===null)return;let o=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Qe(o)}}function mD(t,e,n){let r=pD(t);if(r===null)return null;if(Array.isArray(r.steps)){let s=r.steps.find(a=>Ln(a)?a.id===e||a.name===e||a.name===n:!1),i=Ln(s?.members)?s.members:null,o=i!==null&&Ln(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(Ln(r.states)){let s=r.states[e]??r.states[n];if(!Ln(s))return null;let i=Ln(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function pD(t){try{let e=JSON.parse(t);return Ln(e)?e:null}catch{return null}}function _D(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Ln(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function hD(...t){let e=t.filter(n=>n!==null&&Number.isFinite(n));return e.length===0?null:Math.max(...e)}function nw(t,e){let n=Date.parse(t),r=Date.parse(e);return Number.isNaN(n)||Number.isNaN(r)?"[+? ]":`[+${oa(Math.max(0,r-n)).padEnd(6)}]`}function rw(t,e){return Number.isNaN(t)?"?":oa(Math.max(0,e-t))}function oa(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let n=Math.floor(e/60),r=e%60;if(n<60)return r===0?`${n}m`:`${n}m${r}s`;let s=Math.floor(n/60),i=n%60;return i===0?`${s}h`:`${s}h${i}m`}function gD(t){if(!Ln(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",n=typeof t.member_alias=="string"?t.member_alias:null,r=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${oa(t.elapsed_ms)} elapsed`:"",i=n===null?"":` (${n}${r===null?"":` ${r}`}${s})`;return`${e}${i}`}var fw,un=E(()=>{"use strict";mt();fw=`SELECT a.id AS attention_id,
1722
+ `}function aD(t,e,n){let r=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 i=n(s.state_name);r.includes(i)||r.push(i)}return r}function lD(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function cD(t,e,n,r,s){return r===void 0?"pending":r.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&n===e?"paused":"running":r.outcome===null?"failed":"done"}function dD(t,e){if(t.length===0)return null;let n=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(n>=0)return n;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let r=t.findIndex(s=>s.status==="pending");return r>=0?r:t.length-1}function uD(t,e,n){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||n.some(r=>r.status==="failed")?"failed":"running"}function fD(t,e,n,r,s){let i=mD(n,r,s);if(i===null)return;let o=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Ze(o)}}function mD(t,e,n){let r=pD(t);if(r===null)return null;if(Array.isArray(r.steps)){let s=r.steps.find(a=>Ln(a)?a.id===e||a.name===e||a.name===n:!1),i=Ln(s?.members)?s.members:null,o=i!==null&&Ln(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(Ln(r.states)){let s=r.states[e]??r.states[n];if(!Ln(s))return null;let i=Ln(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function pD(t){try{let e=JSON.parse(t);return Ln(e)?e:null}catch{return null}}function _D(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Ln(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function hD(...t){let e=t.filter(n=>n!==null&&Number.isFinite(n));return e.length===0?null:Math.max(...e)}function nw(t,e){let n=Date.parse(t),r=Date.parse(e);return Number.isNaN(n)||Number.isNaN(r)?"[+? ]":`[+${oa(Math.max(0,r-n)).padEnd(6)}]`}function rw(t,e){return Number.isNaN(t)?"?":oa(Math.max(0,e-t))}function oa(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let n=Math.floor(e/60),r=e%60;if(n<60)return r===0?`${n}m`:`${n}m${r}s`;let s=Math.floor(n/60),i=n%60;return i===0?`${s}h`:`${s}h${i}m`}function gD(t){if(!Ln(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",n=typeof t.member_alias=="string"?t.member_alias:null,r=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${oa(t.elapsed_ms)} elapsed`:"",i=n===null?"":` (${n}${r===null?"":` ${r}`}${s})`;return`${e}${i}`}var fw,un=E(()=>{"use strict";ft();fw=`SELECT a.id AS attention_id,
1723
1723
  a.kind AS kind,
1724
1724
  a.severity AS severity,
1725
1725
  a.created_at AS created_at,
@@ -1756,10 +1756,10 @@ ${n}`:n}function ZL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1756
1756
  `):e.stdout.write(`${JSON.stringify(f)}
1757
1757
  `)}else r.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1758
1758
  `):(e.stdout.write(await l.text()),e.stdout.write(`
1759
- `));return 0}function Ew(t){let e=Sw(t);if(typeof e=="string")return e;let n=e.args,r=e.format!=="text",[s,...i]=n;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?la(i,"/api/status",r):s==="projects"?la(i,"/api/projects",r):s==="teams"?la(i,"/api/teams",r):s==="workflows"?i[0]==="verify"?KD(i.slice(1),e.format):la(i,"/api/workflows",r):s==="workflow"?GD(i,r):s==="upload"?XD(i,r):s==="submit-job"?JD(i,r):s==="issues"?BD(i,r):s==="jobs"?Ys(i,"--status","/api/jobs","status",r):s==="job"?HD(i,r):s==="project"?VD(i,r):s==="artifact"?ZD(i,r):s==="runs"?Ys(i,"--limit","/api/runs","limit",r,!0):s==="external-objects"?Ys(i,"--type","/api/external-objects","type",r):s==="external-signals"?gw(i,"--unhandled","/api/external-signals","unhandled",r):s==="attentions"||s==="attention"?i[0]==="ack"?QD(i,r):gw(i,"--unacked","/api/attentions","unacked",r):s==="stats"?ej(i,r):s==="daemon"?tj(i,r):s==="intake"?nj(i,r):s==="session"?rj(i,r):s==="run"?sj(i,e.format):s==="prs"?Ys(i,"--status","/api/submitted-prs","status",r):s==="pr"?WD(i,r):`unknown subcommand: ${s}`}function $n(t,e){let n={Accept:t};return e!==null&&e.length>0&&(n.Authorization=`Bearer ${e}`),n}function ar(t){if(t.dal!==void 0)return zs(t.dal,process.env,t);let e=Be({path:Q()});try{return zs(e,process.env,t)}finally{e.close()}}function zs(t,e,n){let r=[],s=t.getConfig("api.url"),i;s!==null?i=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(i=e.LMCTL_API_URL,r.push("api.url")):i=TD;let o=t.getConfig("api.token"),a;e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,o===null?r.push("api.token"):o!==a&&n.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this API request.
1759
+ `));return 0}function Ew(t){let e=Sw(t);if(typeof e=="string")return e;let n=e.args,r=e.format!=="text",[s,...i]=n;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?la(i,"/api/status",r):s==="projects"?la(i,"/api/projects",r):s==="teams"?la(i,"/api/teams",r):s==="workflows"?i[0]==="verify"?KD(i.slice(1),e.format):la(i,"/api/workflows",r):s==="workflow"?GD(i,r):s==="upload"?XD(i,r):s==="submit-job"?JD(i,r):s==="issues"?BD(i,r):s==="jobs"?Ys(i,"--status","/api/jobs","status",r):s==="job"?HD(i,r):s==="project"?VD(i,r):s==="artifact"?ZD(i,r):s==="runs"?Ys(i,"--limit","/api/runs","limit",r,!0):s==="external-objects"?Ys(i,"--type","/api/external-objects","type",r):s==="external-signals"?gw(i,"--unhandled","/api/external-signals","unhandled",r):s==="attentions"||s==="attention"?i[0]==="ack"?QD(i,r):gw(i,"--unacked","/api/attentions","unacked",r):s==="stats"?ej(i,r):s==="daemon"?tj(i,r):s==="intake"?nj(i,r):s==="session"?rj(i,r):s==="run"?sj(i,e.format):s==="prs"?Ys(i,"--status","/api/submitted-prs","status",r):s==="pr"?WD(i,r):`unknown subcommand: ${s}`}function $n(t,e){let n={Accept:t};return e!==null&&e.length>0&&(n.Authorization=`Bearer ${e}`),n}function ar(t){if(t.dal!==void 0)return zs(t.dal,process.env,t);let e=Xe({path:Q()});try{return zs(e,process.env,t)}finally{e.close()}}function zs(t,e,n){let r=[],s=t.getConfig("api.url"),i;s!==null?i=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(i=e.LMCTL_API_URL,r.push("api.url")):i=TD;let o=t.getConfig("api.token"),a;e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,o===null?r.push("api.token"):o!==a&&n.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this API request.
1760
1760
  `)):o!==null?a=o:a=null;for(let l of r)n.stderr.write(`note: ${bD(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1761
1761
  `);return{baseUrl:i,token:a}}function bD(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 kD(t,e){let[n,...r]=t;if(n===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1762
- `),2;let s=e.dal===void 0,i=e.dal??Be({path:Q()});try{if(n==="get"){if(r.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
1762
+ `),2;let s=e.dal===void 0,i=e.dal??Xe({path:Q()});try{if(n==="get"){if(r.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
1763
1763
  `),2;let o=r[0];if(!aa.has(o))return e.stderr.write(`error: unsupported config key: ${o} (Phase A keys: ${[...aa].join(", ")})
1764
1764
  `),2;let a=i.getConfig(o);return a===null?(e.stderr.write(`error: ${o} is not set
1765
1765
  `),1):(e.stdout.write(`${a}
@@ -1774,7 +1774,7 @@ ${n}`:n}function ZL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1774
1774
  `),2}finally{s&&i.close()}}async function ID(t,e,n){if(ca(t))return e.stdout.write(`${ND}
1775
1775
  `),0;let r=xw(t,"--direct"),s=n||r.present,i=r.rest,[o,...a]=i;return o===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
1776
1776
  `),2):s?OD(o,a,e):o==="list"?CD(a,e):o==="show"?MD(a,e):o==="respond"?DD(a,e):(e.stderr.write(`error: unknown api escalations verb: ${o}
1777
- `),2)}function ca(t){return t.some(e=>e==="--help"||e==="-h")}function OD(t,e,n){let r=n.dal===void 0,s=n.dal??Be({path:Q()});try{return Rw(s,[t,...e],n)}finally{r&&s.close()}}function Tw(t){let e,n=!1,r=!1,s;for(let o=0;o<t.length;o+=1){let a=t[o];if(a==="--json"){n=!0;continue}if(a==="--all"){r=!0;continue}if(a==="--project"){let l=t[++o];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++o];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=LD(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return de(a)}let i={json:n,all:r};return e!==void 0&&(i.project=e),s!==void 0&&(i.since=s),i}function LD(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let r=Number(e[1]),s=e[2],i=s==="s"?r:s==="m"?r*60:s==="h"?r*3600:r*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let n=Date.parse(t);return Number.isNaN(n)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(n).toISOString()}}async function CD(t,e){let n=Tw(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1777
+ `),2)}function ca(t){return t.some(e=>e==="--help"||e==="-h")}function OD(t,e,n){let r=n.dal===void 0,s=n.dal??Xe({path:Q()});try{return Rw(s,[t,...e],n)}finally{r&&s.close()}}function Tw(t){let e,n=!1,r=!1,s;for(let o=0;o<t.length;o+=1){let a=t[o];if(a==="--json"){n=!0;continue}if(a==="--all"){r=!0;continue}if(a==="--project"){let l=t[++o];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++o];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=LD(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return de(a)}let i={json:n,all:r};return e!==void 0&&(i.project=e),s!==void 0&&(i.since=s),i}function LD(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let r=Number(e[1]),s=e[2],i=s==="s"?r:s==="m"?r*60:s==="h"?r*3600:r*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let n=Date.parse(t);return Number.isNaN(n)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(n).toISOString()}}async function CD(t,e){let n=Tw(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1778
1778
  `),2;let r=ar(e),s=$n("application/json",r.token),i=new URLSearchParams;n.project!==void 0&&i.set("project",n.project),n.all&&i.set("all","true"),n.since!==void 0&&i.set("since",n.since);let o=i.toString().length>0?`?${i.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${o}`,r.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1779
1779
  `),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1780
1780
  `),a.status===400?2:1;let l=await a.json();return vw(l,n.json,e)}function vw(t,e,n){if(e)return n.stdout.write(`${JSON.stringify(t,null,2)}
@@ -1802,45 +1802,45 @@ ${n}`:n}function ZL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1802
1802
  `):e.stdout.write(`ok: attention ${i} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
1803
1803
  `),0}function hw(t,e,n){return t!=="api.token"||n?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function jD(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let n=Number(e);if(!Number.isInteger(n)||n<=0||n>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===Vo||t===Yo){let n=Number(e);if(!Number.isInteger(n)||n<=0)return`invalid ${t}: ${e}`}return null}function PD(t,e){let n=yD(t),r=n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength),s=new FormData;return s.append("image",new Blob([r],{type:FD(t)}),wD(t)),e!==void 0&&s.append("project",e),s}function FD(t){switch(ED(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 UD(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 WD(t,e){let[n,...r]=t;if(n===void 0)return"usage: lmctl api pr <id|list|get>";if(n==="list")return Ys(r,"--status","/api/submitted-prs","status",e);if(n==="get"){let[s]=r;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(n)?{method:"GET",path:`/api/submitted-prs/${n}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${n}`}function Sw(t){let e=[],n="json";for(let r of t)r==="--json"?n="json":r==="--text"?n="text":e.push(r);return{args:e,format:n}}function la(t,e,n){return t.length>0?de(t[0]):{method:"GET",path:e,accept:n?"application/json":"text/html",json:n}}function Ys(t,e,n,r,s,i=!1){let o;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return de(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(i&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;o=u}let a=o===void 0?"":`?${r}=${encodeURIComponent(o)}`;return{method:"GET",path:`${n}${a}`,accept:s?"application/json":"text/html",json:s}}function gw(t,e,n,r,s){let i=!1;for(let o of t){if(o!==e)return de(o);i=!0}return{method:"GET",path:`${n}${i?`?${r}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function qD(t,e,n){if(t.length!==1)return`usage: lmctl api ${n} <id>`;let r=fe(t[0],"id");return typeof r=="string"?r:{method:"GET",path:`${e}/${r}`,accept:"application/json",json:!0}}function HD(t,e){let[n,...r]=t;if(n!==void 0&&r.length===0&&n!=="enqueue"&&n!=="run")return qD([n],"/api/jobs","job");if(n==="enqueue"){let s,i,o="manual",a,l,c;for(let d=0;d<r.length;d+=1){let f=r[d],m=r[++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}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return de(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:o};return s!==void 0&&(u.project=s),i!==void 0&&(u.project_id=i),a!==void 0&&(u.payload=Ru(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(n==="run"){if(r.length!==1)return"usage: lmctl api job run <id>";let s=fe(r[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 BD(t,e){let[n,...r]=t;if(n==="list"){let[s,...i]=r;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],u=i[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",u);else if(c==="--severity")o.set("severity",u);else if(c==="--ai-test-path")o.set("ai_test_path",u);else return de(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}if(n==="show"){if(r.length!==1)return"usage: lmctl api issues show <id>";let s=fe(r[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return n==="create"?bw(r,e):n==="claim"?kw(r,e):n==="claim-next"?Iw(r,e):n==="close"?Nw(r,e):n==="reopen"?Aw(r,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function bw(t,e){let[n,...r]=t;if(n===void 0||n.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=Ru(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=fe(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return de(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(n)}/issues`,accept:"application/json",json:e,body:JSON.stringify(i)}}function kw(t,e){let[n,...r]=t;if(n===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=fe(n,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=fe(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return de(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Iw(t,e){let[n,...r]=t;if(n===void 0||n.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<r.length;i+=1){let o=r[i],a=r[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=fe(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return de(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(n)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function Nw(t,e){let[n,...r]=t;if(n===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=fe(n,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=fe(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return de(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Aw(t,e){let[n,...r]=t;if(n===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=fe(n,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=fe(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return de(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(i)}}function XD(t,e){let[n,...r]=t;if(n===void 0||n.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<r.length;i+=1){let o=r[i];if(o!=="--project")return de(o);let a=r[++i];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:n,project:s}}}function JD(t,e){let n,r,s,i;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")n=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;r=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";i=u}catch{return"invalid --inputs JSON"}else return de(l)}if(n===void 0&&r===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return n!==void 0&&(o.workflow=n),r!==void 0&&(o.workflow_id_override=r),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(o),runAfterSubmit:!0}}function Ru(t){try{return JSON.parse(t)}catch{return t}}function GD(t,e){let[n,r]=t;return n!=="show"||r===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(r)}`,accept:"application/json",json:e}}function KD(t,e){for(let n of t)if(!(n==="--json"||n==="--text"))return de(n);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function VD(t,e){let[n,r,...s]=t;return n==="workflow"?YD([r,...s].filter(i=>i!==void 0),e):n!=="show"||r===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(r)}`,accept:"application/json",json:e}}function YD(t,e){let[n,...r]=t;if(n==="list")return r.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(r[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(n==="show"){if(r.length!==1)return"usage: lmctl api project workflow show <id>";let s=fe(r[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(n==="remove"||n==="enable"||n==="disable"){if(r.length!==1)return`usage: lmctl api project workflow ${n} <id>`;let s=fe(r[0],"id");if(typeof s=="string")return s;let i=n==="remove"?"DELETE":"POST",o=n==="remove"?"":`/${n}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:e}}if(n==="add"){let s=zD(r);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 zD(t){let[e,n,...r]=t;if(e===void 0||n===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:n};for(let i=0;i<r.length;i+=1){let o=r[i],a=r[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=Ru(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return de(o)}return{project:e,body:s}}function ZD(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let n,r,s=!1;for(let o=1;o<t.length;o+=1){let a=t[o];if(a==="--raw"){s=!0;continue}let l=t[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=fe(l,"run");if(typeof c=="string")return c;n=c}else if(a==="--kind")r=l;else return de(a)}return n===void 0||r===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${n}/artifacts/${encodeURIComponent(r)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function QD(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let n=fe(t[1],"id");return typeof n=="string"?n:{method:"POST",path:`/api/attentions/${n}/ack`,accept:e?"application/json":"text/html",json:e}}function ej(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 tj(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 nj(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 rj(t,e){let n=t[0];if(n==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(n==="history"||n==="compact"||n==="refresh"){if(t.length!==3)return`usage: lmctl api session ${n} <team_name> <alias>`;let r=Go(t[1]),s=encodeURIComponent(t[2]);return{method:n==="history"?"GET":"POST",path:`/api/sessions/${r}/${s}/${n}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function sj(t,e){let[n,r,s,i]=t;if(n!==void 0&&/^\d+$/.test(n)&&r===void 0){let o=fe(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(n==="resume"){if(r===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=fe(r,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return de(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/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(n==="get"){if(r===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=fe(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(n==="step"||n==="transcript"||n==="messages"){if(r===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${n} <run_id> <step_id>`;let o=fe(r,"run_id");if(typeof o=="string")return o;let a=fe(s,"step_id");if(typeof a=="string")return a;let l=n==="step"?"":`/${n}`,c=n==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(n==="artifacts"){if(r===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=fe(r,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return de(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/${o}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(n==="where"){if(r===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=fe(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(n==="timeline"){if(r===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=fe(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/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 fe(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function de(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function xw(t,e){let n=[],r=!1;for(let s of t){if(s===e){r=!0;continue}n.push(s)}return{rest:n,present:r}}async function ij(t,e){let n=Sw(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1804
1804
  `),2;let r=n.args,s=n.format!=="text",[i,...o]=r;if(i===void 0)return e.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1805
- `),2;let a=e.dal===void 0,l=e.dal??Be({path:Q()});try{if(i==="issues"){let[c,...u]=o;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1805
+ `),2;let a=e.dal===void 0,l=e.dal??Xe({path:Q()});try{if(i==="issues"){let[c,...u]=o;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1806
1806
  `),2):c==="create"?oj(l,u,e,s):c==="claim"?aj(l,u,e,s):c==="claim-next"?lj(l,u,e,s):c==="close"?cj(l,u,e,s):c==="reopen"?dj(l,u,e,s):c==="list"?pj(l,u,e,s):c==="show"?_j(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1807
1807
  `),2)}return i==="status"?hj(l,o,e,s):i==="projects"?gj(l,o,e,s):i==="workflows"?yj(l,o,e,s):i==="runs"?wj(l,o,e,s):i==="attentions"||i==="attention"?kj(l,o,e,s):i==="escalations"?Rw(l,o,e):(e.stderr.write(`error: --direct is not supported for: ${i} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1808
1808
  `),2)}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
1809
- `),1}finally{a&&l.close()}}function at(t,e,n){t.stdout.write(`${n?JSON.stringify(e,null,2):JSON.stringify(e)}
1809
+ `),1}finally{a&&l.close()}}function ot(t,e,n){t.stdout.write(`${n?JSON.stringify(e,null,2):JSON.stringify(e)}
1810
1810
  `)}function oj(t,e,n,r){let s=bw(e,!0);if(typeof s=="string")return n.stderr.write(`error: ${s}
1811
1811
  `),2;let i=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues$/,"")),o=t.findProjectByName(i);if(o===null)return n.stderr.write(`error: project not found: ${i}
1812
1812
  `),1;let a=JSON.parse(s.body),l=uj(a.severity);if(typeof l=="object"&&l!==null&&"error"in l)return n.stderr.write(`error: ${l.error}
1813
1813
  `),2;let c=fj(a.labels);if(typeof c=="string"&&c.startsWith("error:"))return n.stderr.write(`error: ${c.slice(6)}
1814
- `),2;let u=t.createIssue({project_id:o.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 at(n,u,r),0}function aj(t,e,n,r){let s=kw(e,!0);if(typeof s=="string")return n.stderr.write(`error: ${s}
1814
+ `),2;let u=t.createIssue({project_id:o.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 ot(n,u,r),0}function aj(t,e,n,r){let s=kw(e,!0);if(typeof s=="string")return n.stderr.write(`error: ${s}
1815
1815
  `),2;let i=Number(s.path.match(/\/api\/issues\/(\d+)\/claim$/)[1]),o=JSON.parse(s.body),a=t.getIssue(i);if(a===null)return n.stderr.write(`error: issue not found: ${i}
1816
1816
  `),1;let l=t.claimIssue(i,o.assigned_run_id);return l===null?(n.stderr.write(`error: issue ${i} is not in a claimable state (status=${a.status})
1817
- `),1):(at(n,l,r),0)}function lj(t,e,n,r){let s=Iw(e,!0);if(typeof s=="string")return n.stderr.write(`error: ${s}
1817
+ `),1):(ot(n,l,r),0)}function lj(t,e,n,r){let s=Iw(e,!0);if(typeof s=="string")return n.stderr.write(`error: ${s}
1818
1818
  `),2;let i=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues\/claim-next$/,"")),o=t.findProjectByName(i);if(o===null)return n.stderr.write(`error: project not found: ${i}
1819
- `),1;let a=JSON.parse(s.body),l=t.claimNextIssue(o.id,a.assigned_run_id);return l===null?(at(n,{status:"queue_empty"},r),1):(at(n,l,r),0)}function cj(t,e,n,r){let s=Nw(e,!0);if(typeof s=="string")return n.stderr.write(`error: ${s}
1819
+ `),1;let a=JSON.parse(s.body),l=t.claimNextIssue(o.id,a.assigned_run_id);return l===null?(ot(n,{status:"queue_empty"},r),1):(ot(n,l,r),0)}function cj(t,e,n,r){let s=Nw(e,!0);if(typeof s=="string")return n.stderr.write(`error: ${s}
1820
1820
  `),2;let i=Number(s.path.match(/\/api\/issues\/(\d+)\/close$/)[1]),o=JSON.parse(s.body),a=t.getIssue(i);if(a===null)return n.stderr.write(`error: issue not found: ${i}
1821
1821
  `),1;let l=typeof o.closed_run_id=="number"?o.closed_run_id:a.assigned_run_id;if(l===null)return n.stderr.write(`error: missing closed_run_id
1822
- `),2;let c=t.closeIssue(i,l,typeof o.commit_hash=="string"?o.commit_hash:null);return at(n,c,r),0}function dj(t,e,n,r){let s=Aw(e,!0);if(typeof s=="string")return n.stderr.write(`error: ${s}
1822
+ `),2;let c=t.closeIssue(i,l,typeof o.commit_hash=="string"?o.commit_hash:null);return ot(n,c,r),0}function dj(t,e,n,r){let s=Aw(e,!0);if(typeof s=="string")return n.stderr.write(`error: ${s}
1823
1823
  `),2;let i=Number(s.path.match(/\/api\/issues\/(\d+)\/reopen$/)[1]),o=JSON.parse(s.body),a=t.getIssue(i);if(a===null)return n.stderr.write(`error: issue not found: ${i}
1824
1824
  `),1;let l=typeof o.source_run_id=="number"?o.source_run_id:a.closed_run_id??a.source_run_id;if(l===null)return n.stderr.write(`error: missing source_run_id
1825
- `),2;let c=t.reopenIssue(i,l);return at(n,c,r),0}function uj(t){if(t!=null)return typeof t=="string"&&ww.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function fj(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(n=>typeof n=="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 pj(t,e,n,r){let[s,...i]=e;if(s===void 0||s.startsWith("--"))return n.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1825
+ `),2;let c=t.reopenIssue(i,l);return ot(n,c,r),0}function uj(t){if(t!=null)return typeof t=="string"&&ww.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function fj(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(n=>typeof n=="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 pj(t,e,n,r){let[s,...i]=e;if(s===void 0||s.startsWith("--"))return n.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1826
1826
  `),2;let o,a,l;for(let d=0;d<i.length;d+=1){let f=i[d],m=i[++d];if(m===void 0||m.startsWith("--"))return n.stderr.write(`error: missing value for ${f}
1827
1827
  `),2;if(f==="--status"){let p=yw(m,mj);if(typeof p=="string")return n.stderr.write(`error: ${p}
1828
1828
  `),2;o=p}else if(f==="--severity"){let p=yw(m,ww);if(typeof p=="string")return n.stderr.write(`error: ${p}
1829
1829
  `),2;a=p}else if(f==="--ai-test-path")l=m;else return n.stderr.write(`error: ${de(f)}
1830
1830
  `),2}let c=t.findProjectByName(s);if(c===null)return n.stderr.write(`error: project not found: ${s}
1831
- `),1;let u=t.listIssues(c.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return at(n,u,r),0}function _j(t,e,n,r){if(e.length!==1)return n.stderr.write(`error: usage: lmctl api --direct issues show <id>
1831
+ `),1;let u=t.listIssues(c.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return ot(n,u,r),0}function _j(t,e,n,r){if(e.length!==1)return n.stderr.write(`error: usage: lmctl api --direct issues show <id>
1832
1832
  `),2;let s=fe(e[0],"id");if(typeof s=="string")return n.stderr.write(`error: ${s}
1833
1833
  `),2;let i=t.getIssue(s);return i===null?(n.stderr.write(`error: issue not found: ${s}
1834
- `),1):(at(n,i,r),0)}function hj(t,e,n,r){return e.length>0?(n.stderr.write(`error: ${de(e[0])}
1835
- `),2):(at(n,Zo(t),r),0)}function gj(t,e,n,r){return e.length>0?(n.stderr.write(`error: ${de(e[0])}
1836
- `),2):(at(n,Qo(t),r),0)}function yj(t,e,n,r){return e.length>0?(n.stderr.write(`error: ${de(e[0])}
1837
- `),2):(at(n,ea(t),r),0)}function wj(t,e,n,r){let s;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[++i];if(a===void 0||a.startsWith("--"))return n.stderr.write(`error: missing value for ${o}
1834
+ `),1):(ot(n,i,r),0)}function hj(t,e,n,r){return e.length>0?(n.stderr.write(`error: ${de(e[0])}
1835
+ `),2):(ot(n,Zo(t),r),0)}function gj(t,e,n,r){return e.length>0?(n.stderr.write(`error: ${de(e[0])}
1836
+ `),2):(ot(n,Qo(t),r),0)}function yj(t,e,n,r){return e.length>0?(n.stderr.write(`error: ${de(e[0])}
1837
+ `),2):(ot(n,ea(t),r),0)}function wj(t,e,n,r){let s;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[++i];if(a===void 0||a.startsWith("--"))return n.stderr.write(`error: missing value for ${o}
1838
1838
  `),2;if(o==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return n.stderr.write(`error: invalid --limit: ${a}
1839
1839
  `),2;s=Number(a)}else return n.stderr.write(`error: ${de(o)}
1840
- `),2}return at(n,Ur(t,s!==void 0?{limit:s}:{}),r),0}function Ej(t,e){let[n,...r]=t;if(n===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1840
+ `),2}return ot(n,Ur(t,s!==void 0?{limit:s}:{}),r),0}function Ej(t,e){let[n,...r]=t;if(n===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1841
1841
  `),2;if(!/^\d+$/.test(n)||Number(n)<=0)return e.stderr.write(`error: invalid run_id: ${n}
1842
1842
  `),2;let s=!1;for(let a of r){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${de(a)}
1843
- `),2}let i=e.dal===void 0,o=e.dal??Be({path:Q()});try{let a=Wr(o,Number(n));return a===null?(e.stderr.write(`error: run not found: ${n}
1843
+ `),2}let i=e.dal===void 0,o=e.dal??Xe({path:Q()});try{let a=Wr(o,Number(n));return a===null?(e.stderr.write(`error: run not found: ${n}
1844
1844
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1845
1845
  `):e.stdout.write(ra(a)),0)}finally{i&&o.close()}}async function Tj(t,e){let[n,...r]=t;if(n===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1846
1846
  `),2;if(!/^\d+$/.test(n)||Number(n)<=0)return e.stderr.write(`error: invalid run_id: ${n}
@@ -1852,7 +1852,7 @@ ${n}`:n}function ZL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1852
1852
  `),l.status===404?1:l.status===400?2:1)}function vj(t,e){let[n,...r]=t;if(n===void 0)return e.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
1853
1853
  `),2;if(!/^\d+$/.test(n)||Number(n)<=0)return e.stderr.write(`error: invalid run_id: ${n}
1854
1854
  `),2;let s=!1;for(let a of r){if(a==="--json"){s=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${de(a)}
1855
- `),2}let i=e.dal===void 0,o=e.dal??Be({path:Q()});try{let a=sa(o,Number(n));return a===null?(e.stderr.write(`error: run not found: ${n}
1855
+ `),2}let i=e.dal===void 0,o=e.dal??Xe({path:Q()});try{let a=sa(o,Number(n));return a===null?(e.stderr.write(`error: run not found: ${n}
1856
1856
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1857
1857
  `):e.stdout.write(ia(a)),0)}finally{i&&o.close()}}async function Sj(t,e){let[n,...r]=t;if(n===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1858
1858
  `),2;if(!/^\d+$/.test(n)||Number(n)<=0)return e.stderr.write(`error: invalid run_id: ${n}
@@ -1867,7 +1867,7 @@ ${n}`:n}function ZL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1867
1867
  `):(e.stdout.write(await o.text()),o.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1868
1868
  `)),0):(e.stderr.write(`error: HTTP ${o.status}: ${await o.text()}
1869
1869
  `),o.status===400?2:1)}function kj(t,e,n,r){let s=!1;for(let i of e){if(i==="--unacked"){s=!0;continue}return n.stderr.write(`error: ${de(i)}
1870
- `),2}return at(n,Cn(t,{unacked:s}),r),0}function Rw(t,e,n){let[r,...s]=e;if(r===void 0)return n.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1870
+ `),2}return ot(n,Cn(t,{unacked:s}),r),0}function Rw(t,e,n){let[r,...s]=e;if(r===void 0)return n.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1871
1871
  `),2;if(r==="list"){let i=Tw(s);if(typeof i=="string")return n.stderr.write(`error: ${i}
1872
1872
  `),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=na(t,o);return vw(a,i.json,n)}if(r==="show"){let i=s.filter(l=>l!=="--json"&&l!=="--text");if(i.length!==1)return n.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1873
1873
  `),2;let o=fe(i[0],"attention_id");if(typeof o=="string")return n.stderr.write(`error: ${o}
@@ -1887,7 +1887,7 @@ ${n}`:n}function ZL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1887
1887
  `),2;let u=t.resumeInteractive(l.step_id,a,s);if(!u.resumed)return n.stderr.write(`error: interactive respond failed: ${u.reason} (step_id=${l.step_id})
1888
1888
  `),2;let d=t.acknowledgeAttention(o),f={ok:!0,attention_id:o,step_id:l.step_id,session_status:u.session.status,acknowledged_at:d?.acknowledged_at??null};return r?n.stdout.write(`${JSON.stringify(f,null,2)}
1889
1889
  `):n.stdout.write(`ok: attention ${o} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1890
- `),0}function yw(t,e){let n=t.split(",").map(r=>r.trim()).filter(r=>r.length>0);if(n.length===0)return`invalid value: ${t}`;for(let r of n)if(!e.includes(r))return`invalid value: ${r}`;return n}var TD,vD,ww,aa,ND,AD,xD,RD,mj,Ou=E(()=>{"use strict";mt();qe();Ko();bu();un();TD="http://127.0.0.1:8787",vD=`usage: lmctl api [--direct] <subcommand> ...
1890
+ `),0}function yw(t,e){let n=t.split(",").map(r=>r.trim()).filter(r=>r.length>0);if(n.length===0)return`invalid value: ${t}`;for(let r of n)if(!e.includes(r))return`invalid value: ${r}`;return n}var TD,vD,ww,aa,ND,AD,xD,RD,mj,Ou=E(()=>{"use strict";ft();He();Ko();bu();un();TD="http://127.0.0.1:8787",vD=`usage: lmctl api [--direct] <subcommand> ...
1891
1891
 
1892
1892
  Call the lmctl HTTP API using the configured daemon URL/token (see
1893
1893
  \`api config\`). Most subcommands require a running \`lmctl serve\`.
@@ -2028,11 +2028,11 @@ and \`lmctl api escalations\` (no args) print detailed usage.
2028
2028
  and report the first step that would be started. Default output is the TTY
2029
2029
  table; --json emits the structured WorkflowVerifyReport payload.`;mj=["open","assigned","closed","reopened"]});import Lw from"jexl";function qr(t){Lw.compile(Cw(t))}async function lr(t,e){return Lw.eval(Cw(t),e)}function Cw(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Zs=E(()=>{"use strict"});import{z as v}from"zod";function Pu(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var Nj,$w,Lu,Cu,$u,Mu,Du,ju,Mw,Aj,xj,Rj,Qs,Oj,da,ua,fa,ma,pa,Dw,Lj,Cj,$j,Mj,_a,Hr=E(()=>{"use strict";Zs();Nj=v.object({kind:v.enum(["success","neutral","failure"])}),$w=v.enum(["string","number","boolean","object","array"]),Lu=v.object({name:v.string().min(1),type:$w,required:v.boolean().optional(),default:v.unknown().optional(),description:v.string().optional()}),Cu=v.object({name:v.string().min(1),type:$w,source_step_id:v.string().min(1),source_field:v.string().min(1),description:v.string().optional()}),$u=v.object({id:v.string().min(1),type:v.string().min(1),parameters:v.record(v.string(),v.unknown()).default({})}),Mu="__failure__",Du=v.object({tools:v.array(v.string().min(1)).optional(),auth:v.array(v.string().min(1)).optional()}).strict().optional(),ju=v.object({on_unhandled_failure:v.object({attention_kind:v.string().min(1).default("workflow_failed"),severity:v.enum(["warn","error","critical"]).default("warn"),capture_evidence:v.boolean().default(!0),recommend_recovery:v.string().min(1).optional()}).optional(),on_unhandled_failure_state:v.string().min(1).optional()}).optional(),Mw=v.object({type:v.literal("AssertRepoClean"),fail_message:v.string().min(1).optional(),next:v.string().min(1)}),Aj=v.object({name:v.string().min(1),command:v.string().min(1).optional(),args:v.array(v.string()).optional(),env:v.record(v.string(),v.string()).optional(),type:v.enum(["stdio","http","sse"]).optional(),url:v.string().min(1).optional(),headers:v.record(v.string(),v.string()).optional()}).strict(),xj=v.union([v.string().min(1),Aj]),Rj=v.union([v.string().min(1),v.object({name:v.string().min(1),content:v.string().min(1)}).strict()]),Qs=v.object({team:v.string().min(1),alias:v.string().min(1),prompt_template:v.string().optional(),mcp:v.array(xj).optional(),skills:v.array(Rj).optional()}),Oj=v.object({kind:v.literal("shell"),command:v.string().min(1),description:v.string().optional()}),da=v.object({type:v.literal("Review"),state_name:v.string().min(1),coder:Qs,pre_checks:v.array(Oj).optional(),reviewers:v.array(Qs.extend({rubric_artifact:v.string().optional()})).optional(),outcomes:v.object({approve:v.string().min(1),request_changes:v.string().optional(),fail_pre_check:v.string().optional(),max_loops_exceeded:v.string().optional()}),writes_to_project_path:v.boolean().optional(),durable_memory_tags:v.array(v.string().min(1)).optional(),write_back_durable_memory:v.union([v.boolean(),v.string().min(1)]).optional(),max_loops:v.number().int().positive().default(5),loop_feedback_artifact:v.string().optional(),outcomes_from_stance:v.record(v.string(),v.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"})}),ua=v.object({type:v.literal("Consolidate"),state_name:v.string().min(1),researchers:v.array(Qs.extend({topic:v.string().min(1)})).optional(),consolidator:Qs,outcomes:v.object({ok:v.string().min(1),error:v.string().optional()}),research_artifact_prefix:v.string().optional(),durable_memory_tags:v.array(v.string().min(1)).optional(),write_back_durable_memory:v.union([v.boolean(),v.string().min(1)]).optional()}),fa=v.object({type:v.literal("Interactive"),state_name:v.string().min(1),agent:Qs.extend({initial_prompt_template:v.string().min(1)}),termination:v.object({operator_signal:v.boolean().default(!0),agent_signal:v.string().optional(),max_turns:v.number().int().positive().default(20),timeout_seconds:v.number().int().positive().optional()}),outcomes:v.object({done:v.string().min(1),timeout:v.string().optional()}),artifact_name:v.string().optional(),durable_memory_tags:v.array(v.string().min(1)).optional(),write_back_durable_memory:v.union([v.boolean(),v.string().min(1)]).optional()}),ma=v.object({type:v.literal("Loop"),state_name:v.string().min(1),over:v.string().min(1),item_var:v.string().min(1),body:v.string().min(1),outcomes:v.object({ok:v.string().min(1),error:v.string().optional()}),stop_on_error:v.boolean().default(!0),max_items:v.number().int().positive().default(1e3)}),pa=v.object({type:v.literal("ShellStep"),state_name:v.string().min(1),command:v.string().min(1),outcomes_from_exit:v.record(v.string(),v.string().min(1)),timeout_ms:v.number().int().nonnegative().optional(),capture_output_to:v.string().optional(),writes_to_project_path:v.boolean().optional()}),Dw=v.object({type:v.literal("Choice"),state_name:v.string().min(1),branches:v.array(v.object({when:v.string().min(1),next:v.string().min(1)})).default([]),default_next:v.string().min(1).optional()}).superRefine((t,e)=>{for(let[n,r]of t.branches.entries())try{qr(Pu(r.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",n,"when"],message:`invalid jexl expression: ${i}`})}}),Lj=v.discriminatedUnion("type",[Mw,da,ua,fa,ma,pa,Dw]),Cj=v.object({type:v.literal("ForEach"),state_name:v.string().min(1),items_from:v.string().min(1),mode:v.enum(["sequential","parallel"]).default("sequential"),max_concurrency:v.number().int().positive().default(1),on_item_failure:v.enum(["continue","stop"]).default("stop"),body:Lj,outcomes:v.object({all_ok:v.string().min(1),any_failed:v.string().optional()})}).superRefine((t,e)=>{try{qr(Pu(t.items_from))}catch(n){let r=n instanceof Error?n.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${r}`})}}),$j=v.object({type:v.literal("Subflow"),state_name:v.string().min(1),workflow_name:v.string().min(1),inputs:v.record(v.string(),v.string().min(1)).optional(),outcomes:v.record(v.string(),v.string().min(1))}).superRefine((t,e)=>{for(let[n,r]of Object.entries(t.inputs??{}))try{qr(Pu(r))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",n],message:`invalid jexl expression: ${i}`})}}),Mj=v.discriminatedUnion("type",[Mw,da,ua,fa,ma,pa,Dw,Cj,$j]),_a=v.object({name:v.string().min(1),version:v.number().int().positive(),definition_schema_version:v.union([v.literal(1),v.literal(2)]),description:v.string().optional(),estimated_duration_ms:v.number().int().nonnegative().optional(),primitive_version:v.union([v.literal(1),v.literal(2)]).default(1),start_at:v.string().min(1),states:v.record(v.string().min(1),Mj),terminals:v.record(v.string().min(1),Nj),errors:ju,concurrency_key:v.string().min(1).optional(),concurrent_limit:v.number().int().positive().optional(),default_task_timeout_ms:v.number().int().positive().max(216e5).optional(),inputs:v.array(Lu).optional(),outputs:v.array(Cu).optional(),triggers:v.array($u).optional(),read_only:v.boolean().optional(),requires:Du}).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 ee}from"zod";var Dj,ha,jj,Pj,Fj,zt,Br=E(()=>{"use strict";Hr();Dj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ha=ee.string().regex(Dj),jj=ee.object({step_id:ha,type:ee.literal("main"),index:ee.number().int().min(0)}),Pj=ee.record(ha,ee.record(ee.string().min(1),ee.array(ee.array(jj)))),Fj=ee.object({id:ha,name:ee.string().min(1),type:ee.string().min(1),typeVersion:ee.number().int().positive().default(1),parameters:ee.record(ee.string(),ee.unknown()).default({}),members:ee.record(ee.string(),ee.unknown()).optional(),estimated_duration_ms:ee.number().int().nonnegative().optional()}),zt=ee.object({schema_version:ee.literal("lmctl/v3"),definition_schema_version:ee.literal(3),name:ee.string().min(1),version:ee.number().int().positive(),description:ee.string().optional(),estimated_duration_ms:ee.number().int().nonnegative().optional(),default_task_timeout_ms:ee.number().int().positive().max(216e5).optional(),concurrency_key:ee.string().min(1).optional(),concurrent_limit:ee.number().int().positive().optional(),errors:ju,inputs:ee.array(Lu).optional(),outputs:ee.array(Cu).optional(),steps:ee.array(Fj).min(1),connections:Pj.default({}),entry_step_id:ha,triggers:ee.array($u).optional(),read_only:ee.boolean().optional(),requires:Du}).superRefine((t,e)=>{let n=new Set;for(let[r,s]of t.steps.entries())n.has(s.id)&&e.addIssue({code:"custom",path:["steps",r,"id"],message:`duplicate step id: ${s.id}`}),n.add(s.id);n.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[r,s]of Object.entries(t.connections)){n.has(r)||e.addIssue({code:"custom",path:["connections",r],message:`connection source does not reference an existing step: ${r}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,u]of l.entries())n.has(u.step_id)||e.addIssue({code:"custom",path:["connections",r,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function ga(t){return Uu(t)}function Uu(t){if(Array.isArray(t))return t.map(Uu);if(t===null||typeof t!="object")return t;let e=t,n={};for(let r of Object.keys(e))n[r]=Uu(e[r]);if(typeof n.type=="string"){let r=Wj[n.type];r!==void 0&&(n.type=r)}return n}var Fu,Uj,Wj,Wu=E(()=>{"use strict";Fu="lmctl.builtin.",Uj={Review:`${Fu}Review`,Research:`${Fu}Research`,Consolidate:`${Fu}Consolidate`},Wj=Object.fromEntries(Object.entries(Uj).map(([t,e])=>[e,t]))});import{readFileSync as qj}from"node:fs";function Fw(t){return Hj(t)}function Hj(t){let e=ga(Jj(t));if(Xj(e),Uw(e)===3)return Bj(e);let n=_a.safeParse(e);if(!n.success)throw new fn({errors:n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let r=Gj(n.data);if(r.errors.length>0||r.unresolvedRefs.length>0)throw new fn(r);return n.data}function Bj(t){let e=zt.safeParse(t);if(!e.success)throw new fn({errors:e.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message}))});return e.data}function Xj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Uw(t);if(!(e===null||jw.includes(e)))throw new fn({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${jw.join(", ")}`}]})}function Uw(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 Jj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
2030
2030
  `)||e.startsWith("{")||e.startsWith("[")?Pw(t,"$"):e.endsWith(".json")?Pw(qj(e,"utf8"),e):t}function Pw(t,e){try{return JSON.parse(t)}catch(n){let r=n instanceof Error?n.message:"invalid JSON";throw new fn({errors:[{path:e,message:`invalid JSON: ${r}`}]})}}function Gj(t){let e=[],n=[],r=new Set(Object.keys(t.states));r.has(t.start_at)||n.push({state:"$",ref:t.start_at,kind:"next"}),Kj(t,r,n);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:n}}function Kj(t,e,n){let r=t.errors?.on_unhandled_failure_state;r!==void 0&&(e.has(r)||n.push({state:"$",ref:r,kind:"next"}))}var jw,fn,Ww=E(()=>{"use strict";Hr();Br();Wu();jw=[1,2,3],fn=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 Vj}from"node:crypto";function qw(t,e){let n=Yj(e),r=Vj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${n}-${r}`}function Yj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Hw=E(()=>{"use strict";Br()});function Qj(t,e){let n=Zj[t]??[],r={},s={};for(let[i,o]of Object.entries(e))n.includes(i)?s[i]=o:r[i]=o;return{params:r,members:s}}function Gw(t){let e=[],n=(I,A)=>{throw new Xr([{line:I,message:A}])},r=t.split(`
2031
- `),s=[];for(let I=0;I<r.length;I+=1){let D=nP(r[I]).trim();D.length>0&&s.push({n:I+1,text:D})}s.length===0&&n(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??n(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,_=new Map,y=(I,A,D,J,q,F)=>{l.has(I)&&n(J,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||n(J,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:A,params:D,line:J,isTerminal:q,...F?{members:F}:{}}),u.push(I)},g=I=>{let A=[],D=I+1;for(;D<s.length;D+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[D].text);if(J===null)break;A.push({label:J[1],dst:J[2]})}return{branches:A,nextIdx:D-1}};for(let I=1;I<s.length;I+=1){let{n:A,text:D}=s[I],J=D.split(/\s+/,1)[0];if(/^meta\s*\(/.test(D)){I!==1&&n(A,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let q=/^meta\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${D}`),F=Mn(q[1],A,n);for(let ne of Object.keys(F))Xw.has(ne)||n(A,`unknown \`meta\` key \`${ne}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Xw].join(", ")} (no grammar inflation; bounded)`);m=F;continue}if(J==="step"){let q=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${D}`),F=q[1],ne=q[2],ke=q[3],pe=Bw[ne];pe===void 0&&n(A,`unknown step type: ${ne} (supported \`step\` archetypes: ${Object.keys(Bw).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ae,members:sn}=Qj(pe,Mn(ke,A,n));y(F,pe,Ae,A,!1,Object.keys(sn).length>0?sn:void 0);continue}if(J==="trigger"){let q=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${D}`),F=q[1],ne=q[2],ke=q[3],pe=Jw[ne];pe===void 0&&n(A,`unknown trigger type: ${ne} (registered trigger archetypes: ${Object.keys(Jw).join(", ")})`),p.has(F)&&n(A,`duplicate trigger id: ${F}`),p.set(F,{id:F,type:pe,parameters:Mn(ke,A,n)});continue}if(J==="mcp"||J==="skill"){let q=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(D)??n(A,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${D}`),F=q[1],ne=q[2].trim(),ke=J==="mcp"?h:_;ke.has(F)&&n(A,`duplicate ${J} declaration: ${F}`);let pe;if(ne.startsWith("{")){let Ae=Mn(ne,A,n);J==="mcp"?pe={...Ae,name:F}:((typeof Ae.content!="string"||Ae.content.length===0)&&n(A,`\`skill ${F}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),pe={name:F,content:Ae.content})}else{let Ae=Kw(ne);(typeof Ae!="string"||Ae.length===0)&&n(A,`\`${J} ${F}\`: string form must be a non-empty file path or http(s) URL`),pe=Ae}ke.set(F,pe);continue}if(J==="terminal"){let q=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(D)??n(A,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${D}`);y(q[1],"lmctl/terminal",{name:q[2],kind:q[3]??"neutral"},A,!0);continue}if(J==="seq"){let F=D.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(ne=>ne.trim()).filter(ne=>ne.length>0);(F.length<3||F.length%2===0)&&n(A,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${D}`);for(let ne=0;ne+2<F.length+1&&!(ne+2>F.length-1);ne+=2){let ke=F[ne],pe=F[ne+1],Ae=F[ne+2],sn=pe==="->"?"main":pe.slice(1,-2);c.push({srcDeclId:ke,port:sn,dstDeclId:Ae,line:A})}continue}if(J==="choice"){let F=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(D)??n(A,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${D}`))[1],ne=[],ke,pe=I+1;for(;pe<s.length;pe+=1){let Ae=s[pe].text,sn=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(sn!==null){ke!==void 0&&n(s[pe].n,`\`choice ${F}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Es=sn[2];ne.push({when:sn[1].trim(),next:`@terminal:${Es}`}),c.push({srcDeclId:F,port:Es,dstDeclId:sn[3],line:s[pe].n});continue}let lc=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(lc!==null){ke!==void 0&&n(s[pe].n,`\`choice ${F}\` has more than one \`default\``);let Es=lc[1];ke=`@terminal:${Es}`,c.push({srcDeclId:F,port:Es,dstDeclId:lc[2],line:s[pe].n});continue}break}ne.length===0&&n(A,`\`choice ${F}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),y(F,"lmctl/choice",{branches:ne,...ke!==void 0?{default_next:ke}:{}},A,!1),I=pe-1;continue}if(J==="loop"){let q=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${D}`);y(q[1],"lmctl/loop",Mn(q[2],A,n),A,!1);continue}if(J==="foreach"){let q=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${D}`),F=Mn(q[2],A,n);"mode"in F&&n(A,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),y(q[1],"lmctl/foreach",F,A,!1);continue}if(J==="call"){let q=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${D}`),F=q[1],ne=Mn(q[2],A,n),ke=ne.workflow;(typeof ke!="string"||ke.length===0)&&n(A,`\`call ${F}\` requires a \`workflow=<name>\` argument`);let{workflow:pe,...Ae}=ne;y(F,"lmctl/subflow",{workflow_name:ke,...Ae},A,!1),d.push({declId:F,target:ke,line:A});continue}if(J==="decide"){let q=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(D)??n(A,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${D}`),F=q[1],ne=Mn(q[2],A,n),{branches:ke,nextIdx:pe}=g(I);ke.length===0&&n(A,`\`decide ${F}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),y(F,"lmctl/interactive",{termination:{operator_signal:!0}},A,!1,{agent:ne});for(let Ae of ke)c.push({srcDeclId:F,port:Ae.label,dstDeclId:Ae.dst,line:A});I=pe;continue}if(J==="entry"){let q=/^entry\s+([A-Za-z][\w-]*)$/.exec(D)??n(A,`malformed \`entry\` (expected \`entry <id>\`): ${D}`);f!==void 0&&n(A,`duplicate \`entry\` (already set to ${f})`),f=q[1];continue}n(A,`unknown statement \`${J}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let w=I=>{if(Array.isArray(I)){for(let D of I)w(D);return}if(typeof I!="object"||I===null)return;let A=I;if(typeof A.alias=="string")for(let[D,J]of[["mcp",h],["skills",_]]){let q=A[D];Array.isArray(q)&&(A[D]=q.map(F=>typeof F=="string"&&J.has(F)?structuredClone(J.get(F)):F))}for(let D of Object.values(A))w(D)};for(let I of u){let A=l.get(I);A.members!==void 0&&w(A.members)}let T=I=>qw(o,I),N=u.map(I=>{let A=l.get(I);return{id:T(I),name:I,type:A.type,typeVersion:1,parameters:A.params,...A.members?{members:A.members}:{}}}),b={};for(let I of c){l.has(I.srcDeclId)||n(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||n(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&n(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let A=T(I.srcDeclId);b[A]??={},b[A][I.port]!==void 0&&n(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),b[A][I.port]=[[{step_id:T(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let A=l.get(I);eP.has(A.type)||n(A.line,`unknown archetype \`${A.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===o&&n(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let I of c){let A=R.get(I.srcDeclId);A===void 0?R.set(I.srcDeclId,[I.dstDeclId]):A.push(I.dstDeclId)}for(let I of u){let A=l.get(I);if(A.type!=="lmctl/loop")continue;let D=A.params.body;if(typeof D=="string"&&l.has(D)){let J=R.get(I);J===void 0?R.set(I,[D]):J.push(D)}}let K=new Set([f]),j=[f];for(;j.length>0;){let I=j.shift();for(let A of R.get(I)??[])K.has(A)||(K.add(A),j.push(A))}for(let I of u)K.has(I)||n(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let U=new Map;for(let I of c){let A=U.get(I.srcDeclId);A===void 0&&(A=new Set,U.set(I.srcDeclId,A)),A.add(I.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let A=l.get(I);if(A.isTerminal)continue;let D=U.get(I)??new Set;if(A.type==="lmctl/review"){let q=[...D].some(F=>!x.has(F));!D.has("approve")&&!q&&n(A.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let J=tP[A.type];if(J!==void 0)for(let q of J)D.has(q)||n(A.line,`uncovered outcome: required outcome \`${q}\` of step \`${I}\` (\`${A.type}\`) has no connection \u2014 route it (\`seq ${I} -${q}-> <target|terminal>\`)`);else D.size===0&&n(A.line,`uncovered outcome: non-terminal step \`${I}\` (\`${A.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let A=l.get(I),D=zj[A.type];if(D===void 0)continue;let J={...A.params,...A.members??{},type:D.v2type,state_name:I,...Object.keys(D.outcomes).length>0?{outcomes:D.outcomes}:{}},q=D.schema.safeParse(J);if(!q.success){let F=q.error.issues[0],ne=F.path.length===0?"$":F.path.map(String).join(".");n(A.line,`step \`${I}\` (\`${A.type}\`) has invalid params for archetype \`${D.v2type}\` at \`${ne}\`: ${F.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${A.type.replace("lmctl/","")}({ ... })\``)}}let O={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:N,connections:b,entry_step_id:T(f)},W=zt.safeParse(O);if(!W.success)throw new Xr(W.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return W.data}function nP(t){let e=null;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==null){if(r==="\\"){n+=1;continue}r===e&&(e=null);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function Mn(t,e,n){let r=t.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(e,"structured args must be a JSON object"),i}let s={};for(let i of rP(r)){let o=i.indexOf("=");o===-1&&n(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||n(e,`invalid arg name: ${a}`),s[a]=Kw(l)}return s}function rP(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Kw(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 zj,Zj,Bw,Xr,eP,tP,Xw,Jw,Vw=E(()=>{"use strict";Br();Hw();Hr();zj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:da},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:ua},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:fa},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:ma},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:pa}},Zj={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Bw={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"},Xr=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
2031
+ `),s=[];for(let I=0;I<r.length;I+=1){let D=nP(r[I]).trim();D.length>0&&s.push({n:I+1,text:D})}s.length===0&&n(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??n(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,_=new Map,y=(I,A,D,G,q,F)=>{l.has(I)&&n(G,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||n(G,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:A,params:D,line:G,isTerminal:q,...F?{members:F}:{}}),u.push(I)},g=I=>{let A=[],D=I+1;for(;D<s.length;D+=1){let G=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[D].text);if(G===null)break;A.push({label:G[1],dst:G[2]})}return{branches:A,nextIdx:D-1}};for(let I=1;I<s.length;I+=1){let{n:A,text:D}=s[I],G=D.split(/\s+/,1)[0];if(/^meta\s*\(/.test(D)){I!==1&&n(A,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let q=/^meta\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${D}`),F=Mn(q[1],A,n);for(let ne of Object.keys(F))Xw.has(ne)||n(A,`unknown \`meta\` key \`${ne}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Xw].join(", ")} (no grammar inflation; bounded)`);m=F;continue}if(G==="step"){let q=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${D}`),F=q[1],ne=q[2],ke=q[3],pe=Bw[ne];pe===void 0&&n(A,`unknown step type: ${ne} (supported \`step\` archetypes: ${Object.keys(Bw).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ae,members:sn}=Qj(pe,Mn(ke,A,n));y(F,pe,Ae,A,!1,Object.keys(sn).length>0?sn:void 0);continue}if(G==="trigger"){let q=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${D}`),F=q[1],ne=q[2],ke=q[3],pe=Jw[ne];pe===void 0&&n(A,`unknown trigger type: ${ne} (registered trigger archetypes: ${Object.keys(Jw).join(", ")})`),p.has(F)&&n(A,`duplicate trigger id: ${F}`),p.set(F,{id:F,type:pe,parameters:Mn(ke,A,n)});continue}if(G==="mcp"||G==="skill"){let q=new RegExp(`^${G}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(D)??n(A,`malformed \`${G}\` decl (expected \`${G} <name> = {json} | ${G} <name> = "<file|url>"\`): ${D}`),F=q[1],ne=q[2].trim(),ke=G==="mcp"?h:_;ke.has(F)&&n(A,`duplicate ${G} declaration: ${F}`);let pe;if(ne.startsWith("{")){let Ae=Mn(ne,A,n);G==="mcp"?pe={...Ae,name:F}:((typeof Ae.content!="string"||Ae.content.length===0)&&n(A,`\`skill ${F}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),pe={name:F,content:Ae.content})}else{let Ae=Kw(ne);(typeof Ae!="string"||Ae.length===0)&&n(A,`\`${G} ${F}\`: string form must be a non-empty file path or http(s) URL`),pe=Ae}ke.set(F,pe);continue}if(G==="terminal"){let q=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(D)??n(A,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${D}`);y(q[1],"lmctl/terminal",{name:q[2],kind:q[3]??"neutral"},A,!0);continue}if(G==="seq"){let F=D.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(ne=>ne.trim()).filter(ne=>ne.length>0);(F.length<3||F.length%2===0)&&n(A,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${D}`);for(let ne=0;ne+2<F.length+1&&!(ne+2>F.length-1);ne+=2){let ke=F[ne],pe=F[ne+1],Ae=F[ne+2],sn=pe==="->"?"main":pe.slice(1,-2);c.push({srcDeclId:ke,port:sn,dstDeclId:Ae,line:A})}continue}if(G==="choice"){let F=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(D)??n(A,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${D}`))[1],ne=[],ke,pe=I+1;for(;pe<s.length;pe+=1){let Ae=s[pe].text,sn=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(sn!==null){ke!==void 0&&n(s[pe].n,`\`choice ${F}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Es=sn[2];ne.push({when:sn[1].trim(),next:`@terminal:${Es}`}),c.push({srcDeclId:F,port:Es,dstDeclId:sn[3],line:s[pe].n});continue}let lc=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(lc!==null){ke!==void 0&&n(s[pe].n,`\`choice ${F}\` has more than one \`default\``);let Es=lc[1];ke=`@terminal:${Es}`,c.push({srcDeclId:F,port:Es,dstDeclId:lc[2],line:s[pe].n});continue}break}ne.length===0&&n(A,`\`choice ${F}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),y(F,"lmctl/choice",{branches:ne,...ke!==void 0?{default_next:ke}:{}},A,!1),I=pe-1;continue}if(G==="loop"){let q=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${D}`);y(q[1],"lmctl/loop",Mn(q[2],A,n),A,!1);continue}if(G==="foreach"){let q=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${D}`),F=Mn(q[2],A,n);"mode"in F&&n(A,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),y(q[1],"lmctl/foreach",F,A,!1);continue}if(G==="call"){let q=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(D)??n(A,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${D}`),F=q[1],ne=Mn(q[2],A,n),ke=ne.workflow;(typeof ke!="string"||ke.length===0)&&n(A,`\`call ${F}\` requires a \`workflow=<name>\` argument`);let{workflow:pe,...Ae}=ne;y(F,"lmctl/subflow",{workflow_name:ke,...Ae},A,!1),d.push({declId:F,target:ke,line:A});continue}if(G==="decide"){let q=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(D)??n(A,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${D}`),F=q[1],ne=Mn(q[2],A,n),{branches:ke,nextIdx:pe}=g(I);ke.length===0&&n(A,`\`decide ${F}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),y(F,"lmctl/interactive",{termination:{operator_signal:!0}},A,!1,{agent:ne});for(let Ae of ke)c.push({srcDeclId:F,port:Ae.label,dstDeclId:Ae.dst,line:A});I=pe;continue}if(G==="entry"){let q=/^entry\s+([A-Za-z][\w-]*)$/.exec(D)??n(A,`malformed \`entry\` (expected \`entry <id>\`): ${D}`);f!==void 0&&n(A,`duplicate \`entry\` (already set to ${f})`),f=q[1];continue}n(A,`unknown statement \`${G}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let w=I=>{if(Array.isArray(I)){for(let D of I)w(D);return}if(typeof I!="object"||I===null)return;let A=I;if(typeof A.alias=="string")for(let[D,G]of[["mcp",h],["skills",_]]){let q=A[D];Array.isArray(q)&&(A[D]=q.map(F=>typeof F=="string"&&G.has(F)?structuredClone(G.get(F)):F))}for(let D of Object.values(A))w(D)};for(let I of u){let A=l.get(I);A.members!==void 0&&w(A.members)}let T=I=>qw(o,I),N=u.map(I=>{let A=l.get(I);return{id:T(I),name:I,type:A.type,typeVersion:1,parameters:A.params,...A.members?{members:A.members}:{}}}),b={};for(let I of c){l.has(I.srcDeclId)||n(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||n(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&n(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let A=T(I.srcDeclId);b[A]??={},b[A][I.port]!==void 0&&n(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),b[A][I.port]=[[{step_id:T(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let A=l.get(I);eP.has(A.type)||n(A.line,`unknown archetype \`${A.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===o&&n(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let I of c){let A=R.get(I.srcDeclId);A===void 0?R.set(I.srcDeclId,[I.dstDeclId]):A.push(I.dstDeclId)}for(let I of u){let A=l.get(I);if(A.type!=="lmctl/loop")continue;let D=A.params.body;if(typeof D=="string"&&l.has(D)){let G=R.get(I);G===void 0?R.set(I,[D]):G.push(D)}}let K=new Set([f]),j=[f];for(;j.length>0;){let I=j.shift();for(let A of R.get(I)??[])K.has(A)||(K.add(A),j.push(A))}for(let I of u)K.has(I)||n(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let U=new Map;for(let I of c){let A=U.get(I.srcDeclId);A===void 0&&(A=new Set,U.set(I.srcDeclId,A)),A.add(I.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let A=l.get(I);if(A.isTerminal)continue;let D=U.get(I)??new Set;if(A.type==="lmctl/review"){let q=[...D].some(F=>!x.has(F));!D.has("approve")&&!q&&n(A.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let G=tP[A.type];if(G!==void 0)for(let q of G)D.has(q)||n(A.line,`uncovered outcome: required outcome \`${q}\` of step \`${I}\` (\`${A.type}\`) has no connection \u2014 route it (\`seq ${I} -${q}-> <target|terminal>\`)`);else D.size===0&&n(A.line,`uncovered outcome: non-terminal step \`${I}\` (\`${A.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let A=l.get(I),D=zj[A.type];if(D===void 0)continue;let G={...A.params,...A.members??{},type:D.v2type,state_name:I,...Object.keys(D.outcomes).length>0?{outcomes:D.outcomes}:{}},q=D.schema.safeParse(G);if(!q.success){let F=q.error.issues[0],ne=F.path.length===0?"$":F.path.map(String).join(".");n(A.line,`step \`${I}\` (\`${A.type}\`) has invalid params for archetype \`${D.v2type}\` at \`${ne}\`: ${F.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${A.type.replace("lmctl/","")}({ ... })\``)}}let O={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:N,connections:b,entry_step_id:T(f)},W=zt.safeParse(O);if(!W.success)throw new Xr(W.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return W.data}function nP(t){let e=null;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==null){if(r==="\\"){n+=1;continue}r===e&&(e=null);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function Mn(t,e,n){let r=t.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(e,"structured args must be a JSON object"),i}let s={};for(let i of rP(r)){let o=i.indexOf("=");o===-1&&n(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||n(e,`invalid arg name: ${a}`),s[a]=Kw(l)}return s}function rP(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Kw(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 zj,Zj,Bw,Xr,eP,tP,Xw,Jw,Vw=E(()=>{"use strict";Br();Hw();Hr();zj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:da},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:ua},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:fa},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:ma},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:pa}},Zj={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Bw={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"},Xr=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
2032
2032
  ${e.map(n=>` line ${n.line}: ${n.message}`).join(`
2033
2033
  `)}`),this.issues=e,this.name="DslCompileError"}},eP=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"]),tP={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},Xw=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),Jw={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as sP}from"node:fs";function iP(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function oP(t){for(let e of t.split(`
2034
2034
  `)){let n=e.replace(/#.*/,"").trim();if(n.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(n)}return!1}function Rt(t){if(typeof t=="string"&&iP()&&oP(t)){let n;try{n=Gw(t)}catch(s){throw s instanceof Xr?new mn(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let r=zt.safeParse(n);if(!r.success)throw new mn(r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return r.data}let e=ga(lP(t));if(cP(e)&&e.definition_schema_version===3){let n=zt.safeParse(e);if(!n.success)throw new mn(n.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message})));return n.data}return aP(e)}function aP(t){let e=_a.safeParse(t);if(!e.success)throw new mn(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let n=e.data,r=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,i]of Object.entries(n.states))if(r.has(i.type))throw new mn([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return Fw(n)}catch(s){throw s instanceof fn?new qu(s):s}}function lP(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
2035
- `)||e.startsWith("{")||e.startsWith("[")?Yw(t):e.endsWith(".json")?Yw(sP(e,"utf8")):t}function Yw(t){return JSON.parse(t)}function cP(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var qu,mn,ei=E(()=>{"use strict";Hr();Ww();Wu();Br();Vw();qu=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},mn=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function ya(t){let e=t.workflow?.concurrent_limit??1,n=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return n===null||n.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:dP(n,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:fP(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function dP(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(n,r)=>{let s=uP(e,r.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function uP(t,e){let n=t;for(let r of e.split(".")){if(typeof n!="object"||n===null||!Object.prototype.hasOwnProperty.call(n,r))return;n=n[r]}return n}function fP(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Hu=E(()=>{"use strict"});var zw={};oe(zw,{enqueueFromAgentOutput:()=>pP,enqueueFromGitHubIssue:()=>Bu,enqueueManual:()=>mP,enqueueScheduled:()=>_P});function Bu(t,e){return Ea(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:wa(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function mP(t,e){return Ea(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:wa(e.payload),concurrency_key:e.concurrency_key})}function pP(t,e){let n=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Ea(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:n,dedupe_key:n,available_at:e.available_at,payload:wa(e.payload),concurrency_key:e.concurrency_key})}function _P(t,e){return Ea(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:wa(e.payload),concurrency_key:e.concurrency_key})}function wa(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Ea(t,e){let n=e.concurrency_key;if(n!==void 0)return t.enqueueJob({...e,concurrency_key:n});let r=t.getProject(e.project_id),s=r===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name);if(r===null||s===null)return t.enqueueJob(e);try{let i=Rt(s.definition),o={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=ya({workflow:i,job:o,project:r});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Xu=E(()=>{"use strict";ei();Hu()});async function Qw(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Zw(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let n={event:{kind:"github_issue",issue:t.issue}},r=[],s=0;for(let i of e){if(!await hP(i.condition,n))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...gP(i.parameters_override)},l=Zw(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);r.push(...l.jobs),s+=l.new_jobs}return{jobs:r,new_jobs:s}}function Zw(t,e,n,r,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",r);return{jobs:[Bu(t,{project_id:e,issue_url:n.url,payload:i,workflow_id_override:s,dedupe_key:r,priority:o})],new_jobs:a===null?1:0}}async function hP(t,e){if(t===null||t.trim().length===0)return!0;try{return await lr(t,e)===!0}catch{return!1}}function gP(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 eE=E(()=>{"use strict";Zs();Xu()});import{spawnSync as yP}from"node:child_process";async function wP(t){let e=t.labels??["bug"],n=t.state??"open",r=["issue","list","--repo",t.project.name,"--state",n,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&r.splice(4,0,"--label",e.join(","));let s=yP(t.binary??"gh",r,{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 i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!TP(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await Qw({dal:t.dal,project:t.project,issue:vP(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function Ta(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let n of t.listProjectsWithIntakeEnabled()){let r=EP(n.intake_config);try{let s=await wP({dal:t,project:n,labels:r.labels,state:r.state});e.push({project_id:n.id,project_name:n.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:n.id,project_name:n.name,scanned:0,new_jobs:0,error:i});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:n.id,payload:JSON.stringify({project_id:n.id,project_name:n.name,error:i})})}catch{}}}return e}function EP(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Ju(e))return{};let n=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,r=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:r,state:n}}catch{return{}}}function TP(t){return Array.isArray(t)&&t.every(e=>{if(!Ju(e))return!1;let n=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")&&(n===void 0||Array.isArray(n)&&n.every(r=>typeof r=="string"?!0:Ju(r)&&typeof r.name=="string"))})}function vP(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:n,...r}=t;return e===void 0?r:{...r,labels:e}}function Ju(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Gu=E(()=>{"use strict";eE()});function nE(t){return async e=>bP(t.app,e,t.log!==void 0?{log:t.log}:{})}async function bP(t,e,n={}){let r=kP(e.path),s={"content-type":"application/json",...e.headers??{},[va]:Ku},i={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(i.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let o=new Request(r,i),a=Date.now();try{let l=await t.fetch(o),c=await IP(l);if(n.log!==void 0){let u=Date.now()-a;n.log(`[mailbox-dispatch] ${e.method} ${tE(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(n.log!==void 0){let c=Date.now()-a;n.log(`[mailbox-dispatch] ${e.method} ${tE(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function tE(t){let e=t.startsWith("/")?t:`/${t}`,n=e.search(/[?#]/);return n===-1?e:e.slice(0,n)}function kP(t){let e=t.startsWith("/")?t:`/${t}`;return`${SP}${e}`}async function IP(t){let e=await t.text(),n;if(e==="")n=void 0;else try{n=JSON.parse(e)}catch{n=e}let r={};t.headers.forEach((i,o)=>{o.toLowerCase()!==va&&(r[o]=i)});let s={status:t.status};return Object.keys(r).length>0&&(s.headers=r),n!==void 0&&(s.body=n),s}var va,Ku,SP,Vu=E(()=>{"use strict";va="x-mailbox-channel",Ku="1",SP="http://mailbox.local"});import{createHash as rE,createHmac as NP,timingSafeEqual as AP}from"node:crypto";function sE(t={}){return async(e,n)=>{if(t.disabled===!0){await n();return}let r=iE();if(r===null||CP(e.req.path)){await n();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(va)===Ku){await n();return}let s=e.req.query("token");if(s!==void 0&&Sa(s,r)){zu(e,r),await n();return}if(LP(e,r)){await n();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function iE(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function oE(t){let e=iE();return e!==null&&Sa(t,e)}function zu(t,e,n=new Date){t.header("Set-Cookie",`${Yu}=${RP(e,n)}; Path=/; HttpOnly; SameSite=Lax`)}function aE(t){t.header("Set-Cookie",`${Yu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function RP(t,e=new Date){let r=`auth=ok|${new Date(e.getTime()+xP*24*60*60*1e3).toISOString()}`;return Buffer.from(`${r}|${lE(t,r)}`,"utf8").toString("base64url")}function OP(t,e,n=new Date){let r;try{r=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=r.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=n.getTime()?!1:Sa(s[2],lE(e,`${s[0]}|${s[1]}`))}function Sa(t,e){return AP(rE("sha256").update(t).digest(),rE("sha256").update(e).digest())}function LP(t,e){let n=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(n!==void 0&&Sa(n,e))return!0;let r=$P(t.req.header("cookie")??"")[Yu];return r!==void 0&&OP(r,e)}function CP(t){return t==="/login"||t==="/logout"}function $P(t){let e={};for(let n of t.split(";")){let[r,...s]=n.trim().split("=");r===void 0||r.length===0||s.length===0||(e[r]=s.join("="))}return e}function lE(t,e){return NP("sha256",t).update(e).digest("hex")}var Yu,xP,cE=E(()=>{"use strict";Vu();Yu="lmctl_next_session",xP=30});import{existsSync as Jr,mkdirSync as MP,readdirSync as DP,readFileSync as ba,unlinkSync as jP,writeFileSync as ef}from"node:fs";import{join as cr}from"node:path";function yt(t){if(!PP.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function uE(t,e){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(n===null)return null;let r=n[1],s=n[2].trimStart(),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return qP(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:dE,updated_at:dE}:null}function FP(t,e,n,r){let s=n!==null?`
2035
+ `)||e.startsWith("{")||e.startsWith("[")?Yw(t):e.endsWith(".json")?Yw(sP(e,"utf8")):t}function Yw(t){return JSON.parse(t)}function cP(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var qu,mn,ei=E(()=>{"use strict";Hr();Ww();Wu();Br();Vw();qu=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},mn=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function ya(t){let e=t.workflow?.concurrent_limit??1,n=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return n===null||n.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:dP(n,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:fP(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function dP(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(n,r)=>{let s=uP(e,r.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function uP(t,e){let n=t;for(let r of e.split(".")){if(typeof n!="object"||n===null||!Object.prototype.hasOwnProperty.call(n,r))return;n=n[r]}return n}function fP(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Hu=E(()=>{"use strict"});var zw={};oe(zw,{enqueueFromAgentOutput:()=>pP,enqueueFromGitHubIssue:()=>Bu,enqueueManual:()=>mP,enqueueScheduled:()=>_P});function Bu(t,e){return Ea(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:wa(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function mP(t,e){return Ea(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:wa(e.payload),concurrency_key:e.concurrency_key})}function pP(t,e){let n=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Ea(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:n,dedupe_key:n,available_at:e.available_at,payload:wa(e.payload),concurrency_key:e.concurrency_key})}function _P(t,e){return Ea(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:wa(e.payload),concurrency_key:e.concurrency_key})}function wa(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Ea(t,e){let n=e.concurrency_key;if(n!==void 0)return t.enqueueJob({...e,concurrency_key:n});let r=t.getProject(e.project_id),s=r===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name);if(r===null||s===null)return t.enqueueJob(e);try{let i=Rt(s.definition),o={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=ya({workflow:i,job:o,project:r});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Xu=E(()=>{"use strict";ei();Hu()});async function Qw(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Zw(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let n={event:{kind:"github_issue",issue:t.issue}},r=[],s=0;for(let i of e){if(!await hP(i.condition,n))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...gP(i.parameters_override)},l=Zw(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);r.push(...l.jobs),s+=l.new_jobs}return{jobs:r,new_jobs:s}}function Zw(t,e,n,r,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",r);return{jobs:[Bu(t,{project_id:e,issue_url:n.url,payload:i,workflow_id_override:s,dedupe_key:r,priority:o})],new_jobs:a===null?1:0}}async function hP(t,e){if(t===null||t.trim().length===0)return!0;try{return await lr(t,e)===!0}catch{return!1}}function gP(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 eE=E(()=>{"use strict";Zs();Xu()});import{spawnSync as yP}from"node:child_process";async function wP(t){let e=t.labels??["bug"],n=t.state??"open",r=["issue","list","--repo",t.project.name,"--state",n,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&r.splice(4,0,"--label",e.join(","));let s=yP(t.binary??"gh",r,{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 i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!TP(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await Qw({dal:t.dal,project:t.project,issue:vP(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function Ta(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let n of t.listProjectsWithIntakeEnabled()){let r=EP(n.intake_config);try{let s=await wP({dal:t,project:n,labels:r.labels,state:r.state});e.push({project_id:n.id,project_name:n.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:n.id,project_name:n.name,scanned:0,new_jobs:0,error:i});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:n.id,payload:JSON.stringify({project_id:n.id,project_name:n.name,error:i})})}catch{}}}return e}function EP(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Ju(e))return{};let n=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,r=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:r,state:n}}catch{return{}}}function TP(t){return Array.isArray(t)&&t.every(e=>{if(!Ju(e))return!1;let n=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")&&(n===void 0||Array.isArray(n)&&n.every(r=>typeof r=="string"?!0:Ju(r)&&typeof r.name=="string"))})}function vP(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:n,...r}=t;return e===void 0?r:{...r,labels:e}}function Ju(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Gu=E(()=>{"use strict";eE()});function nE(t){return async e=>bP(t.app,e,t.log!==void 0?{log:t.log}:{})}async function bP(t,e,n={}){let r=kP(e.path),s={"content-type":"application/json",...e.headers??{},[va]:Ku},i={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(i.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let o=new Request(r,i),a=Date.now();try{let l=await t.fetch(o),c=await IP(l);if(n.log!==void 0){let u=Date.now()-a;n.log(`[mailbox-dispatch] ${e.method} ${tE(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(n.log!==void 0){let c=Date.now()-a;n.log(`[mailbox-dispatch] ${e.method} ${tE(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function tE(t){let e=t.startsWith("/")?t:`/${t}`,n=e.search(/[?#]/);return n===-1?e:e.slice(0,n)}function kP(t){let e=t.startsWith("/")?t:`/${t}`;return`${SP}${e}`}async function IP(t){let e=await t.text(),n;if(e==="")n=void 0;else try{n=JSON.parse(e)}catch{n=e}let r={};t.headers.forEach((i,o)=>{o.toLowerCase()!==va&&(r[o]=i)});let s={status:t.status};return Object.keys(r).length>0&&(s.headers=r),n!==void 0&&(s.body=n),s}var va,Ku,SP,Vu=E(()=>{"use strict";va="x-mailbox-channel",Ku="1",SP="http://mailbox.local"});import{createHash as rE,createHmac as NP,timingSafeEqual as AP}from"node:crypto";function sE(t={}){return async(e,n)=>{if(t.disabled===!0){await n();return}let r=iE();if(r===null||CP(e.req.path)){await n();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(va)===Ku){await n();return}let s=e.req.query("token");if(s!==void 0&&Sa(s,r)){zu(e,r),await n();return}if(LP(e,r)){await n();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function iE(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function oE(t){let e=iE();return e!==null&&Sa(t,e)}function zu(t,e,n=new Date){t.header("Set-Cookie",`${Yu}=${RP(e,n)}; Path=/; HttpOnly; SameSite=Lax`)}function aE(t){t.header("Set-Cookie",`${Yu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function RP(t,e=new Date){let r=`auth=ok|${new Date(e.getTime()+xP*24*60*60*1e3).toISOString()}`;return Buffer.from(`${r}|${lE(t,r)}`,"utf8").toString("base64url")}function OP(t,e,n=new Date){let r;try{r=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=r.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=n.getTime()?!1:Sa(s[2],lE(e,`${s[0]}|${s[1]}`))}function Sa(t,e){return AP(rE("sha256").update(t).digest(),rE("sha256").update(e).digest())}function LP(t,e){let n=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(n!==void 0&&Sa(n,e))return!0;let r=$P(t.req.header("cookie")??"")[Yu];return r!==void 0&&OP(r,e)}function CP(t){return t==="/login"||t==="/logout"}function $P(t){let e={};for(let n of t.split(";")){let[r,...s]=n.trim().split("=");r===void 0||r.length===0||s.length===0||(e[r]=s.join("="))}return e}function lE(t,e){return NP("sha256",t).update(e).digest("hex")}var Yu,xP,cE=E(()=>{"use strict";Vu();Yu="lmctl_next_session",xP=30});import{existsSync as Jr,mkdirSync as MP,readdirSync as DP,readFileSync as ba,unlinkSync as jP,writeFileSync as ef}from"node:fs";import{join as cr}from"node:path";function gt(t){if(!PP.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function uE(t,e){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(n===null)return null;let r=n[1],s=n[2].trimStart(),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return qP(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:dE,updated_at:dE}:null}function FP(t,e,n,r){let s=n!==null?`
2036
2036
  description: ${n}`:"";return`---
2037
2037
  name: ${t}${s}
2038
2038
  type: ${e}
@@ -2041,12 +2041,12 @@ ${r}`}function UP(t,e,n,r){let s=cr(t,tf),i=`- [${e}.md](${e}.md)${r!==null?` \u
2041
2041
  `)?`${o}
2042
2042
  ${i}
2043
2043
  `:`${o}${i}
2044
- `,ef(s,o,"utf8")}function WP(t,e){let n=cr(t,tf);if(!Jr(n))return;let r=ba(n,"utf8"),s=new RegExp(`^- \\[${fE(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(r)&&ef(n,r.replace(s,""),"utf8")}function fE(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function qP(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function Ot(t,e){return t.durable_memory_mode==="db"?new Qu(e,t.id):new Zu(t.local_path)}var PP,tf,dE,Zu,Qu,nf=E(()=>{"use strict";PP=/^[a-zA-Z0-9_-]+$/;tf="MEMORY.md",dE="1970-01-01T00:00:00.000Z",Zu=class{dir;constructor(e){this.dir=cr(e,"durable-memory")}read(e){yt(e);let n=cr(this.dir,`${e}.md`);if(!Jr(n))return null;let r=ba(n,"utf8");return uE(e,r)}write(e){yt(e.name),MP(this.dir,{recursive:!0});let n=cr(this.dir,`${e.name}.md`),r=!Jr(n),s=FP(e.name,e.type,e.description??null,e.body);return ef(n,s,"utf8"),UP(this.dir,e.name,e.type,e.description??null),{created:r}}index(e){return this.listFiles().filter(n=>e===void 0||e.length===0||e.includes(n.type)).map(({name:n,type:r,description:s,updated_at:i})=>({name:n,type:r,description:s,updated_at:i}))}list(e){return this.listFiles().filter(n=>e===void 0||n.type===e).map(({name:n,type:r,updated_at:s})=>({name:n,type:r,updated_at:s}))}delete(e){yt(e);let n=cr(this.dir,`${e}.md`);return Jr(n)?(jP(n),WP(this.dir,e),!0):!1}listFiles(){if(!Jr(this.dir))return[];let e=DP(this.dir).filter(r=>r.endsWith(".md")&&r!==tf),n=[];for(let r of e){let s=r.slice(0,-3),i=ba(cr(this.dir,r),"utf8"),o=uE(s,i);o!==null&&n.push(o)}return n.sort((r,s)=>r.name.localeCompare(s.name))}};Qu=class{dal;projectId;constructor(e,n){this.dal=e,this.projectId=n}read(e){yt(e);let n=this.dal.getDurableMemoryByName(this.projectId,e);return n===null?null:{name:n.name,type:n.type,description:n.description,body:n.body,created_at:n.created_at,updated_at:n.updated_at}}write(e){yt(e.name);let n=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:n===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,description:r.description,updated_at:r.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,updated_at:r.updated_at}))}delete(e){return yt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function pE(t,e){let{dal:n}=e;t.get("/api/durable-memory/index/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=Ot(i,n),a=r.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return r.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",r=>{let s=Number(r.req.param("project_id")),i=r.req.param("name"),o=n.getProject(s);if(o===null)return r.json({error:"project not found"},404);let a=Ot(o,n),l;try{l=a.read(i)}catch(c){return r.json({error:c.message},400)}return l===null?r.json({error:`memory entry not found: ${i}`},404):r.json(l)}),t.post("/api/durable-memory/write/:project_id",async r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o;try{o=await r.req.json()}catch{return r.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,u=typeof o.description=="string"?o.description:null;if(a===null||!mE.has(a))return r.json({error:`invalid type: must be one of ${[...mE].join("|")}`},400);if(l===null)return r.json({error:"missing name"},400);if(c===null)return r.json({error:"missing body"},400);let d=Ot(i,n),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return r.json({error:m.message},400)}return r.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=Ot(i,n),a=r.req.query("type");return r.json(o.list(a))})}var mE,_E=E(()=>{"use strict";nf();mE=new Set(["user","feedback","project","reference"])});function BP(t){let e=4294967295;for(let n=0;n<t.length;n+=1)e=(HP[(e^t[n])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function XP(t){let e=Math.max(1980,t.getFullYear()),n=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,r=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:n,date:r}}function hE(t,e=new Date){let{time:n,date:r}=XP(e),s=[],i=[],o=0,a=new TextEncoder;for(let h of t){let _=a.encode(h.name),y=BP(h.data),g=h.data.length,w=new Uint8Array(30+_.length),T=new DataView(w.buffer);T.setUint32(0,67324752,!0),T.setUint16(4,20,!0),T.setUint16(6,0,!0),T.setUint16(8,0,!0),T.setUint16(10,n,!0),T.setUint16(12,r,!0),T.setUint32(14,y,!0),T.setUint32(18,g,!0),T.setUint32(22,g,!0),T.setUint16(26,_.length,!0),T.setUint16(28,0,!0),w.set(_,30),s.push(w,h.data);let N=new Uint8Array(46+_.length),b=new DataView(N.buffer);b.setUint32(0,33639248,!0),b.setUint16(4,20,!0),b.setUint16(6,20,!0),b.setUint16(8,0,!0),b.setUint16(10,0,!0),b.setUint16(12,n,!0),b.setUint16(14,r,!0),b.setUint32(16,y,!0),b.setUint32(20,g,!0),b.setUint32(24,g,!0),b.setUint16(28,_.length,!0),b.setUint16(30,0,!0),b.setUint16(32,0,!0),b.setUint16(34,0,!0),b.setUint16(36,0,!0),b.setUint32(38,0,!0),b.setUint32(42,o,!0),N.set(_,46),i.push(N),o+=w.length+h.data.length}let l=o,c=0;for(let h of i)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 i)m.set(h,p),p+=h.length;return m.set(u,p),m}var HP,gE=E(()=>{"use strict";HP=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let n=e;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;t[e]=n>>>0}return t})()});import{existsSync as Na,mkdirSync as JP,readdirSync as GP,readFileSync as EE,statSync as KP,unlinkSync as VP,writeFileSync as YP}from"node:fs";import{join as ri}from"node:path";function TE(t,e){let{dal:n}=e;t.post("/api/projects",async r=>{let s=await Lt(r);if(typeof s=="string")return L(r,s,400);let i=he(s,"name"),o=he(s,"local_path");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(o===null||o.length===0)return L(r,"missing or empty local_path",400);if(n.findProjectByName(i)!==null)return L(r,`project already exists: ${i}`,409);let a=he(s,"workflow_name")??"bugfix",l,c=he(s,"team_name");if(c!==null&&c.length>0){let d=n.findTeamByName(c);if(d===null)return L(r,`team not found: ${c}`,404);l=d.id}else{let d=n.listTeams();if(d.length===0)return L(r,"no teams exist; create a team first",400);l=d[0].id}let u=n.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:he(s,"default_branch")});return r.json(u,201)}),t.patch("/api/projects/:name",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await Lt(r);if(typeof i=="string")return L(r,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return L(r,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return L(r,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return L(r,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return L(r,"intake_config must be a JSON object, string, or null",400)}let a=n.updateProjectSettings(s.id,o);return a===null?L(r,"project not found",404):r.json(a)}),t.post("/api/teams",async r=>{let s=await Lt(r);if(typeof s=="string")return L(r,s,400);let i=he(s,"name");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(n.findTeamByName(i)!==null)return L(r,`team already exists: ${i}`,409);let o=n.insertTeam({name:i});return r.json(o,201)}),t.post("/api/teams/:name/members",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=await Lt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"alias"),a=he(i,"provider");if(o===null||o.length===0)return L(r,"missing or empty alias",400);if(a===null||a.length===0)return L(r,"missing or empty provider",400);if(n.findTeamMemberByAlias(s.id,o)!==null)return L(r,`member already exists: ${o}`,409);let l=he(i,"model"),c=n.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),u=he(i,"role_prompt");u!==null&&n.setMemberRolePrompt(c.id,u);let d=n.findTeamMemberByAlias(s.id,o);return r.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=n.findTeamMemberByAlias(s.id,r.req.param("alias"));if(i===null)return L(r,"member not found",404);let o=await Lt(r);if(typeof o=="string")return L(r,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return L(r,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return L(r,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return L(r,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return L(r,"no updatable fields provided",400);let l=n.updateTeamMemberMeta(i.id,a);return l===null?L(r,"member not found",404):r.json(l)}),t.get("/api/projects/:name/durable-memory",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=Ot(s,n);return r.json(i.index())}),t.post("/api/projects/:name/durable-memory",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await Lt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!ka.includes(l))return L(r,`invalid type: must be one of ${ka.join("|")}`,400);try{yt(o)}catch(d){return L(r,d.message,400)}let c=Ot(s,n);try{if(c.read(o)!==null)return L(r,`chapter already exists: ${o}`,409)}catch(d){return L(r,d.message,400)}try{c.write({type:l,name:o,description:he(i,"description"),body:a})}catch(d){return L(r,d.message,400)}let u=c.read(o);return u===null?L(r,"chapter created but unreadable",500):r.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=Ot(s,n),o;try{o=i.read(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o===null?L(r,"chapter not found",404):r.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter"),o=await Lt(r);if(typeof o=="string")return L(r,o,400);let a=Ot(s,n),l;try{l=a.read(i)}catch(m){return L(r,m.message,400)}if(l===null)return L(r,"chapter not found",404);let c=he(o,"body")??l.body,u=Object.prototype.hasOwnProperty.call(o,"description")?he(o,"description"):l.description,d=he(o,"type")??l.type;if(!ka.includes(d))return L(r,`invalid type: must be one of ${ka.join("|")}`,400);try{a.write({type:d,name:i,description:u,body:c})}catch(m){return L(r,m.message,400)}let f=a.read(i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=Ot(s,n),o;try{o=i.delete(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o?r.json({removed:!0}):L(r,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",r=>{let s=n.findProjectByName(r.req.param("name"));return s===null?L(r,"project not found",404):r.json(ZP(s.local_path))}),t.post("/api/projects/:name/ai-test",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await Lt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!Ia.has(l))return L(r,`invalid type: must be one of ${[...Ia].join("|")}`,400);try{yt(o)}catch(f){return L(r,f.message,400)}let c=ti(s.local_path),u=ri(c,`${o}.md`);if(Na(u))return L(r,`chapter already exists: ${o}`,409);JP(c,{recursive:!0}),wE(u,o,l,he(i,"description"),a);let d=ni(c,o);return d===null?L(r,"chapter created but unreadable",500):r.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);try{yt(r.req.param("chapter"))}catch(o){return L(r,o.message,400)}let i=ni(ti(s.local_path),r.req.param("chapter"));return i===null?L(r,"chapter not found",404):r.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{yt(i)}catch(m){return L(r,m.message,400)}let o=ti(s.local_path),a=ni(o,i);if(a===null)return L(r,"chapter not found",404);let l=await Lt(r);if(typeof l=="string")return L(r,l,400);let c=he(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?he(l,"description"):a.description,d=he(l,"type")??a.type;if(!Ia.has(d))return L(r,`invalid type: must be one of ${[...Ia].join("|")}`,400);wE(ri(o,`${i}.md`),i,d,u,c);let f=ni(o,i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{yt(i)}catch(a){return L(r,a.message,400)}let o=ri(ti(s.local_path),`${i}.md`);return Na(o)?(VP(o),r.json({removed:!0})):L(r,"chapter not found",404)}),t.get("/api/tokens",r=>r.json([])),t.post("/api/tokens",r=>L(r,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",r=>r.json({})),t.patch("/api/settings",async r=>{let s=await Lt(r);return typeof s=="string"?L(r,s,400):r.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",r=>r.json(n.listChatbotSessions(yE))),t.post("/api/chat/sessions",async r=>{let s=await zP(r);if(typeof s=="string")return L(r,s,400);let i=s!==null?he(s,"title"):null,o=n.createChatbotSession(yE,i);return r.json(o,201)}),t.get("/api/chat/sessions/:id/messages",r=>{let s=r.req.param("id");return n.getChatbotSession(s)===null?L(r,"chat session not found",404):r.json(n.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async r=>{let s=r.req.param("id");if(n.getChatbotSession(s)===null)return L(r,"chat session not found",404);let i=await Lt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"role"),a=he(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return L(r,"role must be one of user|assistant|tool",400);if(a===null)return L(r,"missing content",400);let l=n.appendChatbotMessage(s,o,a);return r.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",r=>{let s=Number(r.req.param("id"));if(!Number.isInteger(s))return L(r,"invalid run id",400);if(n.getRun(s)===null)return L(r,"run not found",404);let o=or(n,s),a=[];for(let c of o){let u=e1(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=EE(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=hE(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function L(t,e,n){return t.json({error:e},n)}async function Lt(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 zP(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let n=JSON.parse(e);return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:"invalid JSON body"}catch{return"invalid JSON body"}}function he(t,e){let n=t[e];return typeof n!="string"?null:n}function ti(t){return ri(t,"ai-test")}function ni(t,e){let n=ri(t,`${e}.md`);if(!Na(n))return null;let r=EE(n,"utf8"),s=QP(r),i=KP(n).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function ZP(t){let e=ti(t);return Na(e)?GP(e).filter(n=>n.endsWith(".md")&&n!=="index.md").map(n=>n.slice(0,-3)).sort().map(n=>{let r=ni(e,n);if(r===null)return null;let{name:s,type:i,description:o,updated_at:a}=r;return{name:s,type:i,description:o,updated_at:a}}).filter(n=>n!==null):[]}function wE(t,e,n,r,s){let i=r!==null&&r.length>0?`
2044
+ `,ef(s,o,"utf8")}function WP(t,e){let n=cr(t,tf);if(!Jr(n))return;let r=ba(n,"utf8"),s=new RegExp(`^- \\[${fE(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(r)&&ef(n,r.replace(s,""),"utf8")}function fE(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function qP(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function Ot(t,e){return t.durable_memory_mode==="db"?new Qu(e,t.id):new Zu(t.local_path)}var PP,tf,dE,Zu,Qu,nf=E(()=>{"use strict";PP=/^[a-zA-Z0-9_-]+$/;tf="MEMORY.md",dE="1970-01-01T00:00:00.000Z",Zu=class{dir;constructor(e){this.dir=cr(e,"durable-memory")}read(e){gt(e);let n=cr(this.dir,`${e}.md`);if(!Jr(n))return null;let r=ba(n,"utf8");return uE(e,r)}write(e){gt(e.name),MP(this.dir,{recursive:!0});let n=cr(this.dir,`${e.name}.md`),r=!Jr(n),s=FP(e.name,e.type,e.description??null,e.body);return ef(n,s,"utf8"),UP(this.dir,e.name,e.type,e.description??null),{created:r}}index(e){return this.listFiles().filter(n=>e===void 0||e.length===0||e.includes(n.type)).map(({name:n,type:r,description:s,updated_at:i})=>({name:n,type:r,description:s,updated_at:i}))}list(e){return this.listFiles().filter(n=>e===void 0||n.type===e).map(({name:n,type:r,updated_at:s})=>({name:n,type:r,updated_at:s}))}delete(e){gt(e);let n=cr(this.dir,`${e}.md`);return Jr(n)?(jP(n),WP(this.dir,e),!0):!1}listFiles(){if(!Jr(this.dir))return[];let e=DP(this.dir).filter(r=>r.endsWith(".md")&&r!==tf),n=[];for(let r of e){let s=r.slice(0,-3),i=ba(cr(this.dir,r),"utf8"),o=uE(s,i);o!==null&&n.push(o)}return n.sort((r,s)=>r.name.localeCompare(s.name))}};Qu=class{dal;projectId;constructor(e,n){this.dal=e,this.projectId=n}read(e){gt(e);let n=this.dal.getDurableMemoryByName(this.projectId,e);return n===null?null:{name:n.name,type:n.type,description:n.description,body:n.body,created_at:n.created_at,updated_at:n.updated_at}}write(e){gt(e.name);let n=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:n===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,description:r.description,updated_at:r.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,updated_at:r.updated_at}))}delete(e){return gt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function pE(t,e){let{dal:n}=e;t.get("/api/durable-memory/index/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=Ot(i,n),a=r.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return r.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",r=>{let s=Number(r.req.param("project_id")),i=r.req.param("name"),o=n.getProject(s);if(o===null)return r.json({error:"project not found"},404);let a=Ot(o,n),l;try{l=a.read(i)}catch(c){return r.json({error:c.message},400)}return l===null?r.json({error:`memory entry not found: ${i}`},404):r.json(l)}),t.post("/api/durable-memory/write/:project_id",async r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o;try{o=await r.req.json()}catch{return r.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,u=typeof o.description=="string"?o.description:null;if(a===null||!mE.has(a))return r.json({error:`invalid type: must be one of ${[...mE].join("|")}`},400);if(l===null)return r.json({error:"missing name"},400);if(c===null)return r.json({error:"missing body"},400);let d=Ot(i,n),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return r.json({error:m.message},400)}return r.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=Ot(i,n),a=r.req.query("type");return r.json(o.list(a))})}var mE,_E=E(()=>{"use strict";nf();mE=new Set(["user","feedback","project","reference"])});function BP(t){let e=4294967295;for(let n=0;n<t.length;n+=1)e=(HP[(e^t[n])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function XP(t){let e=Math.max(1980,t.getFullYear()),n=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,r=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:n,date:r}}function hE(t,e=new Date){let{time:n,date:r}=XP(e),s=[],i=[],o=0,a=new TextEncoder;for(let h of t){let _=a.encode(h.name),y=BP(h.data),g=h.data.length,w=new Uint8Array(30+_.length),T=new DataView(w.buffer);T.setUint32(0,67324752,!0),T.setUint16(4,20,!0),T.setUint16(6,0,!0),T.setUint16(8,0,!0),T.setUint16(10,n,!0),T.setUint16(12,r,!0),T.setUint32(14,y,!0),T.setUint32(18,g,!0),T.setUint32(22,g,!0),T.setUint16(26,_.length,!0),T.setUint16(28,0,!0),w.set(_,30),s.push(w,h.data);let N=new Uint8Array(46+_.length),b=new DataView(N.buffer);b.setUint32(0,33639248,!0),b.setUint16(4,20,!0),b.setUint16(6,20,!0),b.setUint16(8,0,!0),b.setUint16(10,0,!0),b.setUint16(12,n,!0),b.setUint16(14,r,!0),b.setUint32(16,y,!0),b.setUint32(20,g,!0),b.setUint32(24,g,!0),b.setUint16(28,_.length,!0),b.setUint16(30,0,!0),b.setUint16(32,0,!0),b.setUint16(34,0,!0),b.setUint16(36,0,!0),b.setUint32(38,0,!0),b.setUint32(42,o,!0),N.set(_,46),i.push(N),o+=w.length+h.data.length}let l=o,c=0;for(let h of i)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 i)m.set(h,p),p+=h.length;return m.set(u,p),m}var HP,gE=E(()=>{"use strict";HP=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let n=e;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;t[e]=n>>>0}return t})()});import{existsSync as Na,mkdirSync as JP,readdirSync as GP,readFileSync as EE,statSync as KP,unlinkSync as VP,writeFileSync as YP}from"node:fs";import{join as ri}from"node:path";function TE(t,e){let{dal:n}=e;t.post("/api/projects",async r=>{let s=await Lt(r);if(typeof s=="string")return L(r,s,400);let i=he(s,"name"),o=he(s,"local_path");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(o===null||o.length===0)return L(r,"missing or empty local_path",400);if(n.findProjectByName(i)!==null)return L(r,`project already exists: ${i}`,409);let a=he(s,"workflow_name")??"bugfix",l,c=he(s,"team_name");if(c!==null&&c.length>0){let d=n.findTeamByName(c);if(d===null)return L(r,`team not found: ${c}`,404);l=d.id}else{let d=n.listTeams();if(d.length===0)return L(r,"no teams exist; create a team first",400);l=d[0].id}let u=n.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:he(s,"default_branch")});return r.json(u,201)}),t.patch("/api/projects/:name",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await Lt(r);if(typeof i=="string")return L(r,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return L(r,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return L(r,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return L(r,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return L(r,"intake_config must be a JSON object, string, or null",400)}let a=n.updateProjectSettings(s.id,o);return a===null?L(r,"project not found",404):r.json(a)}),t.post("/api/teams",async r=>{let s=await Lt(r);if(typeof s=="string")return L(r,s,400);let i=he(s,"name");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(n.findTeamByName(i)!==null)return L(r,`team already exists: ${i}`,409);let o=n.insertTeam({name:i});return r.json(o,201)}),t.post("/api/teams/:name/members",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=await Lt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"alias"),a=he(i,"provider");if(o===null||o.length===0)return L(r,"missing or empty alias",400);if(a===null||a.length===0)return L(r,"missing or empty provider",400);if(n.findTeamMemberByAlias(s.id,o)!==null)return L(r,`member already exists: ${o}`,409);let l=he(i,"model"),c=n.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),u=he(i,"role_prompt");u!==null&&n.setMemberRolePrompt(c.id,u);let d=n.findTeamMemberByAlias(s.id,o);return r.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=n.findTeamMemberByAlias(s.id,r.req.param("alias"));if(i===null)return L(r,"member not found",404);let o=await Lt(r);if(typeof o=="string")return L(r,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return L(r,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return L(r,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return L(r,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return L(r,"no updatable fields provided",400);let l=n.updateTeamMemberMeta(i.id,a);return l===null?L(r,"member not found",404):r.json(l)}),t.get("/api/projects/:name/durable-memory",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=Ot(s,n);return r.json(i.index())}),t.post("/api/projects/:name/durable-memory",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await Lt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!ka.includes(l))return L(r,`invalid type: must be one of ${ka.join("|")}`,400);try{gt(o)}catch(d){return L(r,d.message,400)}let c=Ot(s,n);try{if(c.read(o)!==null)return L(r,`chapter already exists: ${o}`,409)}catch(d){return L(r,d.message,400)}try{c.write({type:l,name:o,description:he(i,"description"),body:a})}catch(d){return L(r,d.message,400)}let u=c.read(o);return u===null?L(r,"chapter created but unreadable",500):r.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=Ot(s,n),o;try{o=i.read(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o===null?L(r,"chapter not found",404):r.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter"),o=await Lt(r);if(typeof o=="string")return L(r,o,400);let a=Ot(s,n),l;try{l=a.read(i)}catch(m){return L(r,m.message,400)}if(l===null)return L(r,"chapter not found",404);let c=he(o,"body")??l.body,u=Object.prototype.hasOwnProperty.call(o,"description")?he(o,"description"):l.description,d=he(o,"type")??l.type;if(!ka.includes(d))return L(r,`invalid type: must be one of ${ka.join("|")}`,400);try{a.write({type:d,name:i,description:u,body:c})}catch(m){return L(r,m.message,400)}let f=a.read(i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=Ot(s,n),o;try{o=i.delete(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o?r.json({removed:!0}):L(r,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",r=>{let s=n.findProjectByName(r.req.param("name"));return s===null?L(r,"project not found",404):r.json(ZP(s.local_path))}),t.post("/api/projects/:name/ai-test",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await Lt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!Ia.has(l))return L(r,`invalid type: must be one of ${[...Ia].join("|")}`,400);try{gt(o)}catch(f){return L(r,f.message,400)}let c=ti(s.local_path),u=ri(c,`${o}.md`);if(Na(u))return L(r,`chapter already exists: ${o}`,409);JP(c,{recursive:!0}),wE(u,o,l,he(i,"description"),a);let d=ni(c,o);return d===null?L(r,"chapter created but unreadable",500):r.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);try{gt(r.req.param("chapter"))}catch(o){return L(r,o.message,400)}let i=ni(ti(s.local_path),r.req.param("chapter"));return i===null?L(r,"chapter not found",404):r.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{gt(i)}catch(m){return L(r,m.message,400)}let o=ti(s.local_path),a=ni(o,i);if(a===null)return L(r,"chapter not found",404);let l=await Lt(r);if(typeof l=="string")return L(r,l,400);let c=he(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?he(l,"description"):a.description,d=he(l,"type")??a.type;if(!Ia.has(d))return L(r,`invalid type: must be one of ${[...Ia].join("|")}`,400);wE(ri(o,`${i}.md`),i,d,u,c);let f=ni(o,i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{gt(i)}catch(a){return L(r,a.message,400)}let o=ri(ti(s.local_path),`${i}.md`);return Na(o)?(VP(o),r.json({removed:!0})):L(r,"chapter not found",404)}),t.get("/api/tokens",r=>r.json([])),t.post("/api/tokens",r=>L(r,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",r=>r.json({})),t.patch("/api/settings",async r=>{let s=await Lt(r);return typeof s=="string"?L(r,s,400):r.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",r=>r.json(n.listChatbotSessions(yE))),t.post("/api/chat/sessions",async r=>{let s=await zP(r);if(typeof s=="string")return L(r,s,400);let i=s!==null?he(s,"title"):null,o=n.createChatbotSession(yE,i);return r.json(o,201)}),t.get("/api/chat/sessions/:id/messages",r=>{let s=r.req.param("id");return n.getChatbotSession(s)===null?L(r,"chat session not found",404):r.json(n.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async r=>{let s=r.req.param("id");if(n.getChatbotSession(s)===null)return L(r,"chat session not found",404);let i=await Lt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"role"),a=he(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return L(r,"role must be one of user|assistant|tool",400);if(a===null)return L(r,"missing content",400);let l=n.appendChatbotMessage(s,o,a);return r.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",r=>{let s=Number(r.req.param("id"));if(!Number.isInteger(s))return L(r,"invalid run id",400);if(n.getRun(s)===null)return L(r,"run not found",404);let o=or(n,s),a=[];for(let c of o){let u=e1(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=EE(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=hE(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function L(t,e,n){return t.json({error:e},n)}async function Lt(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 zP(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let n=JSON.parse(e);return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:"invalid JSON body"}catch{return"invalid JSON body"}}function he(t,e){let n=t[e];return typeof n!="string"?null:n}function ti(t){return ri(t,"ai-test")}function ni(t,e){let n=ri(t,`${e}.md`);if(!Na(n))return null;let r=EE(n,"utf8"),s=QP(r),i=KP(n).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function ZP(t){let e=ti(t);return Na(e)?GP(e).filter(n=>n.endsWith(".md")&&n!=="index.md").map(n=>n.slice(0,-3)).sort().map(n=>{let r=ni(e,n);if(r===null)return null;let{name:s,type:i,description:o,updated_at:a}=r;return{name:s,type:i,description:o,updated_at:a}}).filter(n=>n!==null):[]}function wE(t,e,n,r,s){let i=r!==null&&r.length>0?`
2045
2045
  description: ${r}`:"",o=`---
2046
2046
  name: ${e}${i}
2047
2047
  type: ${n}
2048
2048
  ---
2049
- ${s}`;YP(t,o,"utf8")}function QP(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 n=e[1],r=e[2].trimStart(),s=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:r}}function e1(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.path!==null?t1(t.path):n1(t.kind);return`step-${t.step_id}-${e}/${t.id}-${n}${r}`}function t1(t){let e=t.lastIndexOf(".");if(e<0)return"";let n=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(n)?n:""}function n1(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var ka,Ia,yE,vE=E(()=>{"use strict";un();gE();nf();ka=["user","feedback","project","reference"],Ia=new Set(["smoke","integration","vision","scenario","regression"]),yE="operator"});function Fe(t,e){return`<!doctype html>
2049
+ ${s}`;YP(t,o,"utf8")}function QP(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 n=e[1],r=e[2].trimStart(),s=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:r}}function e1(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.path!==null?t1(t.path):n1(t.kind);return`step-${t.step_id}-${e}/${t.id}-${n}${r}`}function t1(t){let e=t.lastIndexOf(".");if(e<0)return"";let n=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(n)?n:""}function n1(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var ka,Ia,yE,vE=E(()=>{"use strict";un();gE();nf();ka=["user","feedback","project","reference"],Ia=new Set(["smoke","integration","vision","scenario","regression"]),yE="operator"});function Ue(t,e){return`<!doctype html>
2050
2050
  <html lang="en">
2051
2051
  <head>
2052
2052
  <meta charset="utf-8">
@@ -2117,18 +2117,18 @@ ${s}`;YP(t,o,"utf8")}function QP(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
2117
2117
  FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,r.started_at,r.ended_at??new Date().toISOString())[0],R=b?.input!==null&&b?.input!==void 0?`input: ${b.input}, output: ${b.output??0}`:"n/a",K=e.getWorkflow(r.workflow_id),j=r.started_at!==null&&r.ended_at!==null?Math.max(0,new Date(r.ended_at).getTime()-new Date(r.started_at).getTime()):null,U={run_id:t,workflow_name:K?.name??null,started_at:r.started_at,ended_at:r.ended_at,terminal_state:r.terminal_state,duration_ms:j,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:T,token_totals:R};e.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(U)})}var OE=E(()=>{"use strict"});import{spawnSync as CE}from"node:child_process";function df(t){return g1[t]??`no install hint; ensure '${t}' is on PATH`}function y1(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 LE(t){return CE("which",[t],{encoding:"utf8"}).status===0}function $E(t){if(t===void 0)return null;for(let e of t.tools??[])if(!LE(e)){let n=df(e);return{kind:"missing_tool",tool:e,install_hint:n,message:`missing dependency: ${e}; ${n}`}}for(let e of t.auth??[]){if(!LE(e)){let s=df(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let n=y1(e);if(n===null)continue;let r=CE(e,n.args,{encoding:"utf8"});if(r.status!==0){let s=typeof r.stderr=="string"?r.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:df(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var g1,ME=E(()=>{"use strict";g1={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",kimi:"install: https://github.com/MoonshotAI/kimi-code",hermes:"install: https://github.com/NousResearch/hermes-agent"}});import{existsSync as w1,readdirSync as E1,readFileSync as T1}from"node:fs";import{join as DE}from"node:path";function v1(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let n=e[1],r=n.match(/^tags:\s*\[([^\]]*)\]/m);if(r)return r[1].split(",").map(i=>i.trim()).filter(Boolean);let s=n.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
2118
2118
  `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function jE(t,e){let n=t.match(/^---\n([\s\S]*?)\n---/);if(!n)return null;let s=n[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function PE(t,e){if(e.length===0)return null;let n=DE(t,"durable-memory");if(!w1(n))return null;let r;try{r=E1(n).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of r)try{let o=T1(DE(n,i),"utf8");if(v1(o).some(l=>e.includes(l))){let l=jE(o,"name")??i.replace(".md",""),c=jE(o,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var FE=E(()=>{"use strict"});function mf(t){let e=t.trim().replace(S1,"").trim();for(let n=0;n<4;n+=1){let r=b1.exec(e);if(r===null)break;e=r[2].trim()}return e}function UE(t){let e=t.trim(),n=k1.exec(e);if(n!==null)return n[2];let r=I1.exec(e);return r!==null?r[0]:null}function oi(t,e){let n=t.split(`
2119
2119
  `),r=null,s=-1;for(let o=0;o<n.length;o+=1){let a=mf(n[o]),l=uf.exec(a);if(l===null)continue;let c=l[1].trim();if(ff.test(c))continue;let u=UE(c);u!==null&&(r=u,s=o)}if(r===null)return{outcome:null,reason:"no_stance"};if(!e.includes(r))return{outcome:null,reason:"unknown_outcome",actual:r};let i={};for(let o=s-1;o>=0;o-=1){let a=mf(n[o]),l=uf.exec(a);if(l===null)break;let c=ff.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:r,evidence:i}}function WE(t){let e=t.split(`
2120
- `),n=null;for(let r=0;r<e.length;r+=1){let s=mf(e[r]),i=uf.exec(s);if(i===null)continue;let o=i[1].trim();if(ff.test(o))continue;let a=UE(o);if(a===null||!Ar(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();n={token:a,reason:c}}return n}var S1,b1,uf,ff,k1,I1,pf=E(()=>{"use strict";$s();S1=/^#{1,6}\s+/,b1=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,uf=/^STANCE:\s+(.+)$/,ff=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,k1=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,I1=/^[A-Za-z0-9_-]+/});function qE(t,e,n){return r=>{let s=n(),i=Date.now(),o=JSON.stringify({kind:r.kind,tool:r.tool??null,summary:r.summary??null,id:r.id??null,elapsedMs:r.elapsedMs??null,status:r.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var HE=E(()=>{"use strict"});import{readFileSync as N1}from"node:fs";import{dirname as A1,join as x1}from"node:path";import{fileURLToPath as R1}from"node:url";function C1(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(n=>n.trim().split(/\s+/)),kind:e.kind}))}function j1(t){let e=[],n=[];for(let r of t)O1.has(r)?(n.length>0&&e.push(n),n=[]):n.push(r);return n.length>0&&e.push(n),e}function P1(t,e){if(t.length===0)return{matched:!1};let n=0;for(;n<t.length&&L1.test(t[n]);)n+=1;if(n>=t.length)return{matched:!1};let r=t[n],s=t.slice(n+1);for(let i of e)if(r===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function F1(t,e){if(t.length===0)return{matched:!1};let n=j1(t);for(let r of n){let s=P1(r,e);if(s.matched)return s}return{matched:!1}}function _f(t){return F1(t,D1)}function U1(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 hf(t){return U1(t).split(" ").filter(e=>e.length>0)}var O1,L1,$1,M1,D1,BE=E(()=>{"use strict";O1=new Set(["&&","||",";","|",">",">>","<","<<"]),L1=/^[A-Za-z_][A-Za-z0-9_]*=/;$1=A1(R1(import.meta.url)),M1=JSON.parse(N1(x1($1,"side_effect_classifier.json"),"utf-8")),D1=C1(M1)});function Oa(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 XE(t,e){try{return await lr(gf(t)??t,Oa(e))===!0}catch{return!1}}async function La(t,e){try{return await lr(gf(t)??t,Oa(e))}catch{return}}async function JE(t,e){if(typeof t!="string")return t;let n=gf(t);if(n===null)return t;try{return await lr(n,Oa(e))}catch{return}}async function GE(t,e){let n=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(n.length===0)return t;let r="",s=0;for(let i of n){let o=i.index??0;r+=t.slice(s,o);let a=i[1]?.trim()??"";try{r+=W1(await lr(a,Oa(e)))}catch{r+=""}s=o+i[0].length}return r+=t.slice(s),r}function gf(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function W1(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var ai=E(()=>{"use strict";Zs()});import{existsSync as KE,readdirSync as VE,readFileSync as q1,statSync as YE}from"node:fs";import{join as $a}from"node:path";function zE(t,e,n,r){return Object.assign(t,{stateId:e,state:n,displayName:r})}function V(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function z(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 wt(t,e,n,r,s={}){let i=P(),o=V(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${r}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${li}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=Ar(n)?"generic":"unhandled";return t.dal.raiseAttention({kind:ao,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:o.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:n,reason:r,declared_outcomes:[...s.declared_outcomes??[]],agent_output:H1(s.agent_output??r),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function H1(t){return t.length>8e3?`${t.slice(0,8e3)}
2121
- \u2026[truncated ${t.length-8e3} chars]`:t}function Z(t,e,n,r){t.outcomes[e]=r,n!==e&&(t.outcomes[n]=r)}function te(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,n])=>n.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function ZE(t,e){let n=e.trim();if(n.startsWith("[")){try{let r=JSON.parse(n);if(Array.isArray(r)&&r.every(s=>typeof s=="string"))return r}catch{return null}return null}if(n.startsWith("job.payload.")){let r=n.slice(12);if(r.length===0)return null;let i=Dn(t.job.payload)?.[r];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function lt(t,e,n){let r=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return n;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=Dn(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=Dn(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=B1(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return GE(r,e)}function B1(t,e){let n=t;for(let r of e.split(".")){if(n===null||typeof n!="object"||Array.isArray(n))return;n=n[r]}return n}function Dn(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 ci(t){let{context:e,stateId:n,member:r,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=qE(e.dal,e.run_id,()=>i),c=yf(e,n),u={violation:null},d=g=>{if(l(g),u.violation===null&&g.kind==="tool_use"&&g.tool==="Bash"&&g.summary){let w=hf(g.summary),T=_f(w);T.matched&&!c&&(u.violation={summary:g.summary,kind:T.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=g=>{d(g),X1(g,(w,T)=>{m+=w,p+=T})},_=await Bo({sessionid:r.sessionid,sessiondir:r.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:r.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:r.alias,provider:Qe(r),model:r.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:_.ms})}),J1(e.project,e.dal,f);let y=u.violation;return y!==null?{kind:"g3_violation",summary:y.summary,violationKind:y.kind}:!a&&e.project.local_path.trim().length>0&&wf(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:_.text,ms:_.ms,argv:_.argv}}function X1(t,e){let n=t.raw;if(n==null)return;let s=n.message?.usage;if(s!==void 0){let o=Ca(s.input_tokens),a=Ca(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=n.usage;if(i!==void 0){let o=Ca(i.input_tokens),a=Ca(i.output_tokens);(o>0||a>0)&&e(o,a)}}function Ca(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function pn(t,e,n,r){if(n.sessionid===null)return;let s=`${e}:write_back`,i=V(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof r=="string"?` Category hint: "${r}".`:""} 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 ci({context:t,stateId:s,member:n,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function Kr(t,e,n,r,s,i,o,a=!1,l){let c=t.membersByAlias.get(n.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${n.alias}`};let u=V(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),i&&d.push(vh(s)),l!=null&&l.length>0&&d.push(l);let f=n.prompt_template!==void 0?await lt(n.prompt_template,t,e):"";f.length>0&&d.push(f),r!==null&&r.length>0&&d.push(r);let m=d.join(`
2120
+ `),n=null;for(let r=0;r<e.length;r+=1){let s=mf(e[r]),i=uf.exec(s);if(i===null)continue;let o=i[1].trim();if(ff.test(o))continue;let a=UE(o);if(a===null||!Ar(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();n={token:a,reason:c}}return n}var S1,b1,uf,ff,k1,I1,pf=E(()=>{"use strict";$s();S1=/^#{1,6}\s+/,b1=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,uf=/^STANCE:\s+(.+)$/,ff=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,k1=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,I1=/^[A-Za-z0-9_-]+/});function qE(t,e,n){return r=>{let s=n(),i=Date.now(),o=JSON.stringify({kind:r.kind,tool:r.tool??null,summary:r.summary??null,id:r.id??null,elapsedMs:r.elapsedMs??null,status:r.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var HE=E(()=>{"use strict"});import{readFileSync as N1}from"node:fs";import{dirname as A1,join as x1}from"node:path";import{fileURLToPath as R1}from"node:url";function C1(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(n=>n.trim().split(/\s+/)),kind:e.kind}))}function j1(t){let e=[],n=[];for(let r of t)O1.has(r)?(n.length>0&&e.push(n),n=[]):n.push(r);return n.length>0&&e.push(n),e}function P1(t,e){if(t.length===0)return{matched:!1};let n=0;for(;n<t.length&&L1.test(t[n]);)n+=1;if(n>=t.length)return{matched:!1};let r=t[n],s=t.slice(n+1);for(let i of e)if(r===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function F1(t,e){if(t.length===0)return{matched:!1};let n=j1(t);for(let r of n){let s=P1(r,e);if(s.matched)return s}return{matched:!1}}function _f(t){return F1(t,D1)}function U1(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 hf(t){return U1(t).split(" ").filter(e=>e.length>0)}var O1,L1,$1,M1,D1,BE=E(()=>{"use strict";O1=new Set(["&&","||",";","|",">",">>","<","<<"]),L1=/^[A-Za-z_][A-Za-z0-9_]*=/;$1=A1(R1(import.meta.url)),M1=JSON.parse(N1(x1($1,"side_effect_classifier.json"),"utf-8")),D1=C1(M1)});function Oa(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 XE(t,e){try{return await lr(gf(t)??t,Oa(e))===!0}catch{return!1}}async function La(t,e){try{return await lr(gf(t)??t,Oa(e))}catch{return}}async function JE(t,e){if(typeof t!="string")return t;let n=gf(t);if(n===null)return t;try{return await lr(n,Oa(e))}catch{return}}async function GE(t,e){let n=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(n.length===0)return t;let r="",s=0;for(let i of n){let o=i.index??0;r+=t.slice(s,o);let a=i[1]?.trim()??"";try{r+=W1(await lr(a,Oa(e)))}catch{r+=""}s=o+i[0].length}return r+=t.slice(s),r}function gf(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function W1(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var ai=E(()=>{"use strict";Zs()});import{existsSync as KE,readdirSync as VE,readFileSync as q1,statSync as YE}from"node:fs";import{join as $a}from"node:path";function zE(t,e,n,r){return Object.assign(t,{stateId:e,state:n,displayName:r})}function V(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function z(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 yt(t,e,n,r,s={}){let i=P(),o=V(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${r}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${li}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=Ar(n)?"generic":"unhandled";return t.dal.raiseAttention({kind:ao,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:o.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:n,reason:r,declared_outcomes:[...s.declared_outcomes??[]],agent_output:H1(s.agent_output??r),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function H1(t){return t.length>8e3?`${t.slice(0,8e3)}
2121
+ \u2026[truncated ${t.length-8e3} chars]`:t}function Z(t,e,n,r){t.outcomes[e]=r,n!==e&&(t.outcomes[n]=r)}function te(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,n])=>n.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function ZE(t,e){let n=e.trim();if(n.startsWith("[")){try{let r=JSON.parse(n);if(Array.isArray(r)&&r.every(s=>typeof s=="string"))return r}catch{return null}return null}if(n.startsWith("job.payload.")){let r=n.slice(12);if(r.length===0)return null;let i=Dn(t.job.payload)?.[r];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function at(t,e,n){let r=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return n;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=Dn(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=Dn(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=B1(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return GE(r,e)}function B1(t,e){let n=t;for(let r of e.split(".")){if(n===null||typeof n!="object"||Array.isArray(n))return;n=n[r]}return n}function Dn(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 ci(t){let{context:e,stateId:n,member:r,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=qE(e.dal,e.run_id,()=>i),c=yf(e,n),u={violation:null},d=g=>{if(l(g),u.violation===null&&g.kind==="tool_use"&&g.tool==="Bash"&&g.summary){let w=hf(g.summary),T=_f(w);T.matched&&!c&&(u.violation={summary:g.summary,kind:T.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=g=>{d(g),X1(g,(w,T)=>{m+=w,p+=T})},_=await Bo({sessionid:r.sessionid,sessiondir:r.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:r.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:r.alias,provider:Ze(r),model:r.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:_.ms})}),J1(e.project,e.dal,f);let y=u.violation;return y!==null?{kind:"g3_violation",summary:y.summary,violationKind:y.kind}:!a&&e.project.local_path.trim().length>0&&wf(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:_.text,ms:_.ms,argv:_.argv}}function X1(t,e){let n=t.raw;if(n==null)return;let s=n.message?.usage;if(s!==void 0){let o=Ca(s.input_tokens),a=Ca(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=n.usage;if(i!==void 0){let o=Ca(i.input_tokens),a=Ca(i.output_tokens);(o>0||a>0)&&e(o,a)}}function Ca(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function pn(t,e,n,r){if(n.sessionid===null)return;let s=`${e}:write_back`,i=V(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof r=="string"?` Category hint: "${r}".`:""} 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 ci({context:t,stateId:s,member:n,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function Kr(t,e,n,r,s,i,o,a=!1,l){let c=t.membersByAlias.get(n.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${n.alias}`};let u=V(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),i&&d.push(vh(s)),l!=null&&l.length>0&&d.push(l);let f=n.prompt_template!==void 0?await at(n.prompt_template,t,e):"";f.length>0&&d.push(f),r!==null&&r.length>0&&d.push(r);let m=d.join(`
2122
2122
 
2123
2123
  `);try{let p=await ci({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let _=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,_),{outcome:null,text:"",status_detail:_}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!i)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=oi(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 Oe?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function Vr(t,e){return(e?.length??0)>0?PE(t.project.local_path,e):null}function QE(t){return _f(hf(t))}function yf(t,e){let n=t.dal.query(`SELECT state_name, outcome FROM step
2124
2124
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
2125
2125
  ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(n.length===0)return!1;let r=n[0];return t.workflow.states[r.state_name]?.type==="Interactive"&&r.outcome==="done"}function wf(t,e){if(!KE(t))return!1;let n=$a(t,"durable-memory");function r(s){let i;try{i=VE(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=$a(s,o.name);if(a!==n)if(o.isDirectory()){if(r(a))return!0}else try{if(YE(a).mtime>e)return!0}catch{}}return!1}return r(t)}function J1(t,e,n){let r=$a(t.local_path,"durable-memory");if(!KE(r))return;let s;try{s=VE(r)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=$a(r,i),a;try{a=YE(o).mtime}catch{continue}if(a<=n)continue;let l;try{l=q1(o,"utf8")}catch{continue}let c=K1(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
2126
- `),C({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});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 K1(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let n=e[1],r=e[2].trimStart(),s=n.match(/^name:\s*(.+)$/m),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!G1.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:r}}var li,G1,rt=E(()=>{"use strict";mt();Hr();Xo();FE();pf();$s();HE();ae();BE();ai();li="__paused__:";G1=new Set(["user","feedback","project","reference"])});import{spawnSync as eT}from"node:child_process";function V1(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.project.local_path,o=eT("git",["diff","--quiet"],{cwd:i}).status!==0,a=eT("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),Z(t,n,r,Mu),{kind:"terminal",terminal:te(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Z(t,n,r,"clean"),z(t.workflow,e.next)}var tT,nT=E(()=>{"use strict";rt();tT={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=>V1(t,t.state)}});async function Y1(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;for(let i of e.branches)if(await XE(i.when,t))return t.dal.finishStep(s.id,"matched",i.when),Z(t,n,r,"matched"),z(t.workflow,i.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Z(t,n,r,"no_match"),e.default_next!==void 0?z(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":te(t.workflow)}}var rT,sT=E(()=>{"use strict";rt();ai();rT={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=>Y1(t,t.state)}});async function z1(t,e){let n=t.stateId,r=t.displayName,s=t.workflow.default_task_timeout_ms,i=e.researchers??[],o=Vr(t,e.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let h=`${r}:researcher_${m.alias}[${p}]`,_=await Kr(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);_.text.length>0&&(a[p]=_.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
2126
+ `),C({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});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 K1(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let n=e[1],r=e[2].trimStart(),s=n.match(/^name:\s*(.+)$/m),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!G1.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:r}}var li,G1,nt=E(()=>{"use strict";ft();Hr();Xo();FE();pf();$s();HE();ae();BE();ai();li="__paused__:";G1=new Set(["user","feedback","project","reference"])});import{spawnSync as eT}from"node:child_process";function V1(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.project.local_path,o=eT("git",["diff","--quiet"],{cwd:i}).status!==0,a=eT("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),Z(t,n,r,Mu),{kind:"terminal",terminal:te(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Z(t,n,r,"clean"),z(t.workflow,e.next)}var tT,nT=E(()=>{"use strict";nt();tT={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=>V1(t,t.state)}});async function Y1(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;for(let i of e.branches)if(await XE(i.when,t))return t.dal.finishStep(s.id,"matched",i.when),Z(t,n,r,"matched"),z(t.workflow,i.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Z(t,n,r,"no_match"),e.default_next!==void 0?z(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":te(t.workflow)}}var rT,sT=E(()=>{"use strict";nt();ai();rT={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=>Y1(t,t.state)}});async function z1(t,e){let n=t.stateId,r=t.displayName,s=t.workflow.default_task_timeout_ms,i=e.researchers??[],o=Vr(t,e.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let h=`${r}:researcher_${m.alias}[${p}]`,_=await Kr(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);_.text.length>0&&(a[p]=_.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
2127
2127
  ${m}`:null).filter(m=>m!==null).join(`
2128
2128
 
2129
- `),c=`${r}:consolidator`,u=await Kr(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),d=V(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Z(t,n,r,"error");let m=e.outcomes.error;return m!==void 0?z(t.workflow,m):{kind:"terminal",terminal:te(t.workflow)}}let f=e.research_artifact_prefix??r;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Z(t,n,r,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await pn(t,r,m,e.write_back_durable_memory)}return z(t.workflow,e.outcomes.ok)}var iT,oT=E(()=>{"use strict";rt();iT={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=>z1(t,t.state)}});async function Z1(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.progress_step_id;t.progress_step_id=s.id;try{let o=await La(e.items_from,t),a=nF(o);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?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await eF(t,e,s.id,a,l):await Q1(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})),Z(t,n,r,d),u){let f=e.outcomes.any_failed;return f!==void 0?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}return z(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=i}}async function Q1(t,e,n,r,s){let i=[];for(let o=0;o<r.length;o+=1){let a=await lT(t,e,n,r[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return i}async function eF(t,e,n,r,s){let i=new Array(r.length),o=0,a=Array.from({length:Math.min(e.max_concurrency,r.length)},async()=>{for(;o<r.length&&s.routed===null;){let l=o;o+=1,i[l]=await lT(t,e,n,r[l],l,s)}});return await Promise.all(a),i}async function lT(t,e,n,r,s,i){let o=t.iteration;t.iteration={item:r,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:r}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:n,iteration:{item:r,index:s}})}finally{t.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":tF(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:r,outcome:u}}),{index:s,value:r,outcome:u}}function tF(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function nF(t){if(!Array.isArray(t))return null;let e=[];for(let n of t)if(typeof n=="string")e.push(n);else if(typeof n=="number"||typeof n=="boolean")e.push(String(n));else return null;return e}var aT,cT=E(()=>{"use strict";rt();ai();aT={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=>Z1(t,t.state)}});async function rF(t,e){let n=t.stateId,r=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,i=t.membersByAlias.get(e.agent.alias);if(i===void 0||i.sessionid===null){let f=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:te(t.workflow)}}let o=Vr(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,n);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[r]="done",e.write_back_durable_memory&&await pn(t,r,i,e.write_back_durable_memory),z(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}`),Z(t,n,r,"timeout");let m=e.outcomes.timeout;return m!==void 0?z(t.workflow,m):{kind:"terminal",terminal:te(t.workflow)}}let f=a.last_operator_input??"";try{let m=await ci({context:t,stateId:r,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return 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:r,kind:m.violationKind,command_summary:m.summary,message:`State ${r} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:r,message:`State ${r} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:te(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"),Z(t,n,r,"done"),e.write_back_durable_memory&&await pn(t,r,i,e.write_back_durable_memory),z(t.workflow,e.outcomes.done)):(dT({context:t,state:e,stateId:n,displayName:r,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Oe?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:te(t.workflow)}}}return{kind:"paused"}}let l=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:n,status:"waiting_agent"}),u=await lt(e.agent.initial_prompt_template,t,r),d=o?`${o}
2129
+ `),c=`${r}:consolidator`,u=await Kr(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),d=V(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Z(t,n,r,"error");let m=e.outcomes.error;return m!==void 0?z(t.workflow,m):{kind:"terminal",terminal:te(t.workflow)}}let f=e.research_artifact_prefix??r;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Z(t,n,r,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await pn(t,r,m,e.write_back_durable_memory)}return z(t.workflow,e.outcomes.ok)}var iT,oT=E(()=>{"use strict";nt();iT={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=>z1(t,t.state)}});async function Z1(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.progress_step_id;t.progress_step_id=s.id;try{let o=await La(e.items_from,t),a=nF(o);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?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await eF(t,e,s.id,a,l):await Q1(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})),Z(t,n,r,d),u){let f=e.outcomes.any_failed;return f!==void 0?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}return z(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=i}}async function Q1(t,e,n,r,s){let i=[];for(let o=0;o<r.length;o+=1){let a=await lT(t,e,n,r[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return i}async function eF(t,e,n,r,s){let i=new Array(r.length),o=0,a=Array.from({length:Math.min(e.max_concurrency,r.length)},async()=>{for(;o<r.length&&s.routed===null;){let l=o;o+=1,i[l]=await lT(t,e,n,r[l],l,s)}});return await Promise.all(a),i}async function lT(t,e,n,r,s,i){let o=t.iteration;t.iteration={item:r,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:r}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:n,iteration:{item:r,index:s}})}finally{t.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":tF(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:r,outcome:u}}),{index:s,value:r,outcome:u}}function tF(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function nF(t){if(!Array.isArray(t))return null;let e=[];for(let n of t)if(typeof n=="string")e.push(n);else if(typeof n=="number"||typeof n=="boolean")e.push(String(n));else return null;return e}var aT,cT=E(()=>{"use strict";nt();ai();aT={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=>Z1(t,t.state)}});async function rF(t,e){let n=t.stateId,r=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,i=t.membersByAlias.get(e.agent.alias);if(i===void 0||i.sessionid===null){let f=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:te(t.workflow)}}let o=Vr(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,n);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[r]="done",e.write_back_durable_memory&&await pn(t,r,i,e.write_back_durable_memory),z(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}`),Z(t,n,r,"timeout");let m=e.outcomes.timeout;return m!==void 0?z(t.workflow,m):{kind:"terminal",terminal:te(t.workflow)}}let f=a.last_operator_input??"";try{let m=await ci({context:t,stateId:r,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return 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:r,kind:m.violationKind,command_summary:m.summary,message:`State ${r} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:r,message:`State ${r} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:te(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"),Z(t,n,r,"done"),e.write_back_durable_memory&&await pn(t,r,i,e.write_back_durable_memory),z(t.workflow,e.outcomes.done)):(dT({context:t,state:e,stateId:n,displayName:r,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Oe?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:te(t.workflow)}}}return{kind:"paused"}}let l=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:n,status:"waiting_agent"}),u=await at(e.agent.initial_prompt_template,t,r),d=o?`${o}
2130
2130
 
2131
- ${u}`:u;try{let f=await ci({context:t,stateId:r,member:i,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:r,kind:f.violationKind,command_summary:f.summary,message:`State ${r} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:r,message:`State ${r} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:te(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[r]="done",e.write_back_durable_memory&&await pn(t,r,i,e.write_back_durable_memory),z(t.workflow,e.outcomes.done)):(dT({context:t,state:e,stateId:n,displayName:r,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Oe?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:te(t.workflow)}}}function dT(t){let{context:e,state:n,stateId:r,displayName:s,stepId:i,agentText:o}=t,a=P();e.dal.setRunPausedState(e.run_id,`${li}${r}`,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(sF({context:e,stateId:s,state:n,stepId:i,agentText:o,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function sF(t){let{context:e,stateId:n,state:r,stepId:s,agentText:i,pausedAt:o}=t,a=e.dal.getRun(e.run_id),l=iF(e,n),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:n,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:oF(i,3),paused_at:o,created_run_inputs:Dn(e.job.payload)}}function iF(t,e){let n=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let i=0;i<32&&s!==null;i+=1){let o=t.dal.getRun(s);if(o===null)break;o.current_state!==null&&n.unshift(o.current_state),s=o.parent_run_id}return n.push(e),n}function oF(t,e){if(typeof t!="string"||t.length===0)return[];let n=t.split(/\r?\n/);return(n.length>0&&n[n.length-1]===""?n.slice(0,-1):n).slice(-e)}var uT,fT=E(()=>{"use strict";Xo();rt();uT={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=>rF(t,t.state)}});async function aF(t,e){let n=t.stateId,r=t.displayName,s=ZE(t,e.over);if(s===null){let d=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}let i=t.workflow.states[e.body];if(i===void 0){let d=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:te(t.workflow)}}let o=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<o.length;d+=1){let f=o[d],m=`${r}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,i,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let _=lF(t.outcomes[m]);if(a.push({index:d,value:f,outcome:_}),_===null&&e.stop_on_error){l=!0;break}}let c=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:o.length})),Z(t,n,r,u),l){let d=e.outcomes.error;return d!==void 0?z(t.workflow,d):{kind:"terminal",terminal:te(t.workflow)}}return z(t.workflow,e.outcomes.ok)}function lF(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var mT,pT=E(()=>{"use strict";rt();mT={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>aF(t,t.state)}});import{createHash as cF}from"node:crypto";import{existsSync as dF,mkdirSync as uF,readFileSync as fF,writeFileSync as mF}from"node:fs";import{dirname as pF,isAbsolute as hT,normalize as _F,resolve as di}from"node:path";import{Document as hF,ExternalHyperlink as gF,HeadingLevel as Yr,LevelFormat as yF,Packer as wF,Paragraph as $t,Table as EF,TableCell as TF,TableRow as vF,TextRun as Mt,WidthType as SF}from"docx";import{marked as bF}from"marked";async function kF(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;try{let i=await IF(t,e,r),o=await NF(t,e),a=await AF(t,e.title),l=await CF(i,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return uF(pF(o),{recursive:!0}),mF(o,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:cF("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${o}`),Z(t,n,r,{output_path:o,path:o,bytes:l.length}),z(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),Z(t,n,r,{error:o}),z(t.workflow,e.outcomes?.error??"@terminal:error")}}async function IF(t,e,n){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let r=(await lt(e.markdown_source,t,n)).trim(),i=(r.length===0?LF(t,e.markdown_source):null)??r;if(i.length===0)throw new Error("markdown_source resolved empty");let o=RF(t.project.local_path,i);if(o!==null){if(!dF(o))throw new Error(`markdown_source file not found: ${o}`);return Ma(fF(o,"utf8"))}return Ma(i)}async function NF(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let n=(await lt(e.output_path,t,t.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=xF(t.project.local_path,n);if(!r.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${r}`);return r}async function AF(t,e){if(typeof e!="string"||e.trim().length===0)return null;let n=(await lt(e,t,t.stateId)).trim();return n.length===0?null:n}function xF(t,e){let n=di(t);return _F(hT(e)?di(e):di(n,e))}function RF(t,e){return OF(e)?hT(e)?di(e):di(t,e):null}function OF(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function LF(t,e){let r=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(r===void 0)return null;let s=Object.entries(t.transcripts).filter(([o])=>o.startsWith(`${r}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return Ma(s);let i=t.dal.query(`SELECT sa.content
2131
+ ${u}`:u;try{let f=await ci({context:t,stateId:r,member:i,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:r,kind:f.violationKind,command_summary:f.summary,message:`State ${r} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:r,message:`State ${r} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:te(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[r]="done",e.write_back_durable_memory&&await pn(t,r,i,e.write_back_durable_memory),z(t.workflow,e.outcomes.done)):(dT({context:t,state:e,stateId:n,displayName:r,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Oe?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:te(t.workflow)}}}function dT(t){let{context:e,state:n,stateId:r,displayName:s,stepId:i,agentText:o}=t,a=P();e.dal.setRunPausedState(e.run_id,`${li}${r}`,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(sF({context:e,stateId:s,state:n,stepId:i,agentText:o,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function sF(t){let{context:e,stateId:n,state:r,stepId:s,agentText:i,pausedAt:o}=t,a=e.dal.getRun(e.run_id),l=iF(e,n),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:n,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:oF(i,3),paused_at:o,created_run_inputs:Dn(e.job.payload)}}function iF(t,e){let n=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let i=0;i<32&&s!==null;i+=1){let o=t.dal.getRun(s);if(o===null)break;o.current_state!==null&&n.unshift(o.current_state),s=o.parent_run_id}return n.push(e),n}function oF(t,e){if(typeof t!="string"||t.length===0)return[];let n=t.split(/\r?\n/);return(n.length>0&&n[n.length-1]===""?n.slice(0,-1):n).slice(-e)}var uT,fT=E(()=>{"use strict";Xo();nt();uT={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=>rF(t,t.state)}});async function aF(t,e){let n=t.stateId,r=t.displayName,s=ZE(t,e.over);if(s===null){let d=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}let i=t.workflow.states[e.body];if(i===void 0){let d=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:te(t.workflow)}}let o=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<o.length;d+=1){let f=o[d],m=`${r}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,i,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let _=lF(t.outcomes[m]);if(a.push({index:d,value:f,outcome:_}),_===null&&e.stop_on_error){l=!0;break}}let c=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:o.length})),Z(t,n,r,u),l){let d=e.outcomes.error;return d!==void 0?z(t.workflow,d):{kind:"terminal",terminal:te(t.workflow)}}return z(t.workflow,e.outcomes.ok)}function lF(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var mT,pT=E(()=>{"use strict";nt();mT={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>aF(t,t.state)}});import{createHash as cF}from"node:crypto";import{existsSync as dF,mkdirSync as uF,readFileSync as fF,writeFileSync as mF}from"node:fs";import{dirname as pF,isAbsolute as hT,normalize as _F,resolve as di}from"node:path";import{Document as hF,ExternalHyperlink as gF,HeadingLevel as Yr,LevelFormat as yF,Packer as wF,Paragraph as $t,Table as EF,TableCell as TF,TableRow as vF,TextRun as Mt,WidthType as SF}from"docx";import{marked as bF}from"marked";async function kF(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;try{let i=await IF(t,e,r),o=await NF(t,e),a=await AF(t,e.title),l=await CF(i,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return uF(pF(o),{recursive:!0}),mF(o,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:cF("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${o}`),Z(t,n,r,{output_path:o,path:o,bytes:l.length}),z(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),Z(t,n,r,{error:o}),z(t.workflow,e.outcomes?.error??"@terminal:error")}}async function IF(t,e,n){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let r=(await at(e.markdown_source,t,n)).trim(),i=(r.length===0?LF(t,e.markdown_source):null)??r;if(i.length===0)throw new Error("markdown_source resolved empty");let o=RF(t.project.local_path,i);if(o!==null){if(!dF(o))throw new Error(`markdown_source file not found: ${o}`);return Ma(fF(o,"utf8"))}return Ma(i)}async function NF(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let n=(await at(e.output_path,t,t.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=xF(t.project.local_path,n);if(!r.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${r}`);return r}async function AF(t,e){if(typeof e!="string"||e.trim().length===0)return null;let n=(await at(e,t,t.stateId)).trim();return n.length===0?null:n}function xF(t,e){let n=di(t);return _F(hT(e)?di(e):di(n,e))}function RF(t,e){return OF(e)?hT(e)?di(e):di(t,e):null}function OF(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function LF(t,e){let r=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(r===void 0)return null;let s=Object.entries(t.transcripts).filter(([o])=>o.startsWith(`${r}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return Ma(s);let i=t.dal.query(`SELECT sa.content
2132
2132
  FROM step_artifact sa
2133
2133
  JOIN step s ON s.id = sa.step_id
2134
2134
  WHERE s.run_id = ?
@@ -2136,18 +2136,18 @@ ${u}`:u;try{let f=await ci({context:t,stateId:r,member:i,prompt:d,stepId:l.id,ti
2136
2136
  AND sa.content IS NOT NULL
2137
2137
  ORDER BY sa.id DESC
2138
2138
  LIMIT 1`,t.run_id,`${r}:coder[%`);return i[0]?.content===void 0?null:Ma(i[0].content)}function Ma(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function CF(t,e){let n=yT(bF.lexer(t,{gfm:!0})),r=new hF({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:yF.DECIMAL,text:"%1."}]}]},sections:[{children:n.length===0?[new $t("")]:n}]});return wF.toBuffer(r)}function yT(t){let e=[];for(let n of t)switch(n.type){case"space":break;case"heading":e.push(new $t({heading:UF(n.depth),children:Pn(jn(n))}));break;case"paragraph":e.push(new $t({children:Pn(jn(n))}));break;case"text":e.push(new $t({children:jn(n).length===0?[new Mt(n.text)]:Pn(jn(n))}));break;case"blockquote":e.push(...yT(jn(n)).map(r=>r instanceof $t?r:new $t({children:[new Mt(n.text)]})));break;case"list":jF(n)&&e.push(...$F(n));break;case"table":PF(n)&&e.push(MF(n));break;case"code":FF(n)&&e.push(...DF(n));break;case"hr":e.push(new $t(""));break;case"html":n.text.trim().length>0&&e.push(new $t({children:[new Mt(n.text)]}));break;default:break}return e}function Pn(t,e){let n=[];for(let r of t)switch(r.type){case"text":case"escape":n.push(new Mt({text:r.text,...Ef(e)}));break;case"strong":n.push(...Pn(jn(r),{...e,bold:!0}));break;case"em":n.push(...Pn(jn(r),{...e,italics:!0}));break;case"codespan":n.push(new Mt({text:r.text,...Ef({...e,code:!0})}));break;case"link":n.push(new gF({link:r.href,children:Pn(jn(r),{...e})}));break;case"br":n.push(new Mt({text:"",break:1}));break;case"image":n.push(new Mt({text:`[image: ${r.text}]`,italics:!0}));break;case"del":n.push(new Mt({text:r.text,strike:!0}));break;default:n.push(new Mt({text:r.raw,...Ef(e)}));break}return n.length===0?[new Mt("")]:n}function Ef(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function $F(t){return t.items.map(e=>new $t({children:Pn(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:_T(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:_T(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function _T(t){return t.task?`[${t.checked?"x":" "}] `:""}function MF(t){let e=[t.header,...t.rows].map(n=>new vF({children:n.map(r=>new TF({children:[new $t({children:Pn(r.tokens,r.header?{bold:!0}:void 0)})]}))}));return new EF({width:{size:100,type:SF.PERCENTAGE},rows:e})}function DF(t){return t.text.split(`
2139
- `).map(n=>new $t({children:[new Mt({text:n.length===0?" ":n,font:"Courier New"})]}))}function jn(t){let e=t.tokens;return Array.isArray(e)?e:[]}function jF(t){return t.type==="list"&&Array.isArray(t.items)}function PF(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function FF(t){return t.type==="code"&&typeof t.text=="string"}function UF(t){switch(t){case 1:return Yr.HEADING_1;case 2:return Yr.HEADING_2;case 3:return Yr.HEADING_3;case 4:return Yr.HEADING_4;case 5:return Yr.HEADING_5;default:return Yr.HEADING_6}}var gT,wT=E(()=>{"use strict";rt();gT={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=>kF(t,t.state)}});import{createHash as WF}from"node:crypto";import{existsSync as qF,mkdirSync as HF,readFileSync as ET,statSync as BF}from"node:fs";import{dirname as XF,isAbsolute as TT,normalize as JF,resolve as ui}from"node:path";import{marked as GF}from"marked";import KF from"write-excel-file/node";async function VF(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;try{let i=await YF(t,e),o=zF(e.input_format),a=await ZF(t,e),l=await QF(t,e.title),c=o==="markdown"?lU(i):rU(i);await cU({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=BF(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=WF("sha256").update(ET(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}`),Z(t,n,r,{output_path:a,path:a,bytes:u}),z(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),Z(t,n,r,{error:o}),z(t.workflow,e.outcomes?.error??"@terminal:error")}}async function YF(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let n=(await lt(e.source,t,t.stateId)).trim(),r=tU(t.project.local_path,n);if(r!==null){if(!qF(r))throw new Error(`source file not found: ${r}`);return ET(r,"utf8")}return n}function zF(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function ZF(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let n=(await lt(e.output_path,t,t.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=eU(t.project.local_path,n);if(!r.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${r}`);return r}async function QF(t,e){if(typeof e!="string"||e.trim().length===0)return null;let n=(await lt(e,t,t.stateId)).trim();return n.length===0?null:n}function eU(t,e){let n=ui(t);return JF(TT(e)?ui(e):ui(n,e))}function tU(t,e){return nU(e)?TT(e)?ui(e):ui(t,e):null}function nU(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function rU(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`invalid JSON source: ${r}`)}if(!Da(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((n,r)=>sU(n,r))}function sU(t,e){if(!Da(t))throw new Error(`sheets[${e}] must be an object`);let n=iU(t.headers,`sheets[${e}].headers`),r=oU(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:n,rows:r,headerStyle:aU(t.styles)}}function iU(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(n=>typeof n=="string"))throw new Error(`${e} must be an array of strings`);return t}function oU(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((n,r)=>{if(!Array.isArray(n))throw new Error(`${e}[${r}] must be an array`);return n.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${r}][${i}] must be string, number, boolean, or null`)})})}function aU(t){if(!Da(t)||!Da(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 lU(t){let e=GF.lexer(t,{gfm:!0}),n=[],r=null;for(let s of e){if(hU(s)){r=s.text;continue}gU(s)&&(n.push({name:r??`Sheet${n.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),r=null)}return n}async function cU(t){HF(XF(t.outputPath),{recursive:!0});let e=new Set,n=t.sheets.map(r=>({sheet:mU(r.name,e),data:dU(r),columns:fU(r)}));await KF(n).toFile(t.outputPath)}function dU(t){let e=[];if(t.headers.length>0){let n=_U(t.headerStyle?.fill);e.push(t.headers.map(r=>({value:r,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:n??void 0})))}for(let n of t.rows)e.push(n.map(uU));return e.length===0?[[{}]]:e}function uU(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 fU(t){let e=Math.max(t.headers.length,...t.rows.map(r=>r.length),1),n=[];for(let r=1;r<=e;r+=1){let s=[t.headers[r-1],...t.rows.map(o=>o[r-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));n.push({width:i})}return n}function mU(t,e){let n=pU(t),r=n,s=2;for(;e.has(r.toLowerCase());){let i=` ${s}`;r=`${n.slice(0,31-i.length)}${i}`,s+=1}return e.add(r.toLowerCase()),r}function pU(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function _U(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 hU(t){return t.type==="heading"&&typeof t.text=="string"}function gU(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Da(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var vT,ST=E(()=>{"use strict";rt();vT={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=>VF(t,t.state)}});import{spawnSync as yU}from"node:child_process";async function EU(t,e){let n=t.stateId,r=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(yU("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Z(t,n,r,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?z(t.workflow,h):{kind:"terminal",terminal:te(t.workflow)}}let i=Vr(t,e.durable_memory_tags),o=e.reviewers??[],a=null,l=o.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=`${r}:coder[${f}]`,p=await Kr(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
2139
+ `).map(n=>new $t({children:[new Mt({text:n.length===0?" ":n,font:"Courier New"})]}))}function jn(t){let e=t.tokens;return Array.isArray(e)?e:[]}function jF(t){return t.type==="list"&&Array.isArray(t.items)}function PF(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function FF(t){return t.type==="code"&&typeof t.text=="string"}function UF(t){switch(t){case 1:return Yr.HEADING_1;case 2:return Yr.HEADING_2;case 3:return Yr.HEADING_3;case 4:return Yr.HEADING_4;case 5:return Yr.HEADING_5;default:return Yr.HEADING_6}}var gT,wT=E(()=>{"use strict";nt();gT={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=>kF(t,t.state)}});import{createHash as WF}from"node:crypto";import{existsSync as qF,mkdirSync as HF,readFileSync as ET,statSync as BF}from"node:fs";import{dirname as XF,isAbsolute as TT,normalize as JF,resolve as ui}from"node:path";import{marked as GF}from"marked";import KF from"write-excel-file/node";async function VF(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;try{let i=await YF(t,e),o=zF(e.input_format),a=await ZF(t,e),l=await QF(t,e.title),c=o==="markdown"?lU(i):rU(i);await cU({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=BF(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=WF("sha256").update(ET(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}`),Z(t,n,r,{output_path:a,path:a,bytes:u}),z(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),Z(t,n,r,{error:o}),z(t.workflow,e.outcomes?.error??"@terminal:error")}}async function YF(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let n=(await at(e.source,t,t.stateId)).trim(),r=tU(t.project.local_path,n);if(r!==null){if(!qF(r))throw new Error(`source file not found: ${r}`);return ET(r,"utf8")}return n}function zF(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function ZF(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let n=(await at(e.output_path,t,t.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=eU(t.project.local_path,n);if(!r.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${r}`);return r}async function QF(t,e){if(typeof e!="string"||e.trim().length===0)return null;let n=(await at(e,t,t.stateId)).trim();return n.length===0?null:n}function eU(t,e){let n=ui(t);return JF(TT(e)?ui(e):ui(n,e))}function tU(t,e){return nU(e)?TT(e)?ui(e):ui(t,e):null}function nU(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function rU(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`invalid JSON source: ${r}`)}if(!Da(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((n,r)=>sU(n,r))}function sU(t,e){if(!Da(t))throw new Error(`sheets[${e}] must be an object`);let n=iU(t.headers,`sheets[${e}].headers`),r=oU(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:n,rows:r,headerStyle:aU(t.styles)}}function iU(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(n=>typeof n=="string"))throw new Error(`${e} must be an array of strings`);return t}function oU(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((n,r)=>{if(!Array.isArray(n))throw new Error(`${e}[${r}] must be an array`);return n.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${r}][${i}] must be string, number, boolean, or null`)})})}function aU(t){if(!Da(t)||!Da(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 lU(t){let e=GF.lexer(t,{gfm:!0}),n=[],r=null;for(let s of e){if(hU(s)){r=s.text;continue}gU(s)&&(n.push({name:r??`Sheet${n.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),r=null)}return n}async function cU(t){HF(XF(t.outputPath),{recursive:!0});let e=new Set,n=t.sheets.map(r=>({sheet:mU(r.name,e),data:dU(r),columns:fU(r)}));await KF(n).toFile(t.outputPath)}function dU(t){let e=[];if(t.headers.length>0){let n=_U(t.headerStyle?.fill);e.push(t.headers.map(r=>({value:r,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:n??void 0})))}for(let n of t.rows)e.push(n.map(uU));return e.length===0?[[{}]]:e}function uU(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 fU(t){let e=Math.max(t.headers.length,...t.rows.map(r=>r.length),1),n=[];for(let r=1;r<=e;r+=1){let s=[t.headers[r-1],...t.rows.map(o=>o[r-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));n.push({width:i})}return n}function mU(t,e){let n=pU(t),r=n,s=2;for(;e.has(r.toLowerCase());){let i=` ${s}`;r=`${n.slice(0,31-i.length)}${i}`,s+=1}return e.add(r.toLowerCase()),r}function pU(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function _U(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 hU(t){return t.type==="heading"&&typeof t.text=="string"}function gU(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Da(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var vT,ST=E(()=>{"use strict";nt();vT={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=>VF(t,t.state)}});import{spawnSync as yU}from"node:child_process";async function EU(t,e){let n=t.stateId,r=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(yU("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Z(t,n,r,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?z(t.workflow,h):{kind:"terminal",terminal:te(t.workflow)}}let i=Vr(t,e.durable_memory_tags),o=e.reviewers??[],a=null,l=o.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=`${r}:coder[${f}]`,p=await Kr(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
2140
2140
  ${a}`:null,c,l,s,e.writes_to_project_path===!0,i);if(l){let _=WE(p.text);if(_!==null){let y=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(y.id,null,`escalation_vocab:${_.token}`),{kind:"escalate",token:_.token,reason:_.reason.length>0?`${_.token}: ${_.reason}`:_.token}}}if(p.outcome===null){let _=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(_.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(e.outcomes_from_stance!==void 0){let g=Object.keys(e.outcomes_from_stance),w=oi(p.text,g);if(w.outcome===null){let N=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(N.id,null,`unhandled_stance:${w.reason}`),{kind:"escalate",token:"",reason:`no_stance:${w.reason}`}}let T=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(T.id,w.outcome,"outcomes_from_stance"),Z(t,n,r,w.outcome),z(t.workflow,e.outcomes_from_stance[w.outcome])}let _=oi(p.text,wU);if(_.outcome!==null){let g=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(g.id,_.outcome,"default_failure_stance"),Z(t,n,r,_.outcome),{kind:"escalate",token:_.outcome,reason:`failure_stance:${_.outcome}`}}let y=V(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(y.id,"approve","no_reviewers"),Z(t,n,r,"approve"),e.write_back_durable_memory){let g=t.membersByAlias.get(e.coder.alias);g!==void 0&&await pn(t,r,g,e.write_back_durable_memory)}return z(t.workflow,e.outcomes.approve)}let h=await Promise.all(o.map(_=>Kr(t,`${r}:reviewer_${_.alias}[${f}]`,_,`CODER OUTPUT:
2141
2141
  ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(_=>_.outcome==="approve")){let _=V(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve",`loop=${f}`),Z(t,n,r,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await pn(t,r,y,e.write_back_durable_memory)}return z(t.workflow,e.outcomes.approve)}if(a=h.filter(_=>_.outcome==="request_changes").map(_=>_.text).join(`
2142
2142
 
2143
- `),e.loop_feedback_artifact!==void 0){let _=V(t,{run_id:t.run_id,state_name:`${r}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(_.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:_.id,kind:e.loop_feedback_artifact,content:a})}}let u=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Z(t,n,r,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?z(t.workflow,d):{kind:"terminal",terminal:te(t.workflow)}}var wU,bT,kT=E(()=>{"use strict";pf();rt();wU=["blocked","failed","aborted"],bT={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=>EU(t,t.state)}});import{spawnSync as TU}from"node:child_process";async function vU(t,e){let n=t.stateId,r=t.displayName,s=await lt(e.command,t,r),i=yf(t,r),o=QE(s);if(o.matched&&!i){let h=V(t,{run_id:t.run_id,state_name:r});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:r,kind:o.kind,command:s,message:`ShellStep ${r} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:te(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=TU("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=V(t,{run_id:t.run_id,state_name:r});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:r,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:te(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&wf(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:r,message:`ShellStep ${r} 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:te(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}`),Z(t,n,r,m),z(t.workflow,p))}var IT,NT=E(()=>{"use strict";rt();IT={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=>vU(t,t.state)}});async function SU(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:te(t.workflow)};let o=Rt(i.definition),a=await bU(t,e),l=await t.runChildWorkflow(i,o,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:te(t.workflow)};Z(t,n,r,kU(t,l.run_id,o.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:te(t.workflow)}:z(t.workflow,u)}async function bU(t,e){let n={};for(let[r,s]of Object.entries(e.inputs??{})){let i=await JE(s,t);n[r]=i===s?await La(s,t):i}return n}function kU(t,e,n){let r={};for(let s of n)r[s.name]=IU(t,e,s);return r}function IU(t,e,n){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,n.source_step_id)[0];if(s===void 0)return null;let i=NU(s,n.source_field);if(i.found)return i.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,n.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function NU(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 AT,xT=E(()=>{"use strict";ei();rt();ai();AT={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=>SU(t,t.state)}});function AU(t,e){let n=t.stateId,r=t.displayName,s=e.name??r,i=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),Z(t,n,r,s),{kind:"terminal",terminal:s}}var RT,OT=E(()=>{"use strict";rt();RT={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=>AU(t,t.state)}});async function xU(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",n=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||n.length===0)return null;let r=new URL(`https://api.github.com/repos/${e}/${n}/issues`);r.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&r.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&r.searchParams.set("since",t.parameters.since);let s=await fetch(r);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=RU(t.cursor),a=i.filter(OU).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function RU(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function OU(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 LT,CT=E(()=>{"use strict";LT={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=>xU(t)}});async function LU(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let n=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===n?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:n,cron:e}]}}var $T,MT=E(()=>{"use strict";$T={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=>LU(t)}});function DT(t){t.register(tT),t.register(bT),t.register(iT),t.register(uT),t.register(mT),t.register(gT),t.register(vT),t.register(IT),t.register(rT),t.register(aT),t.register(AT),t.register(RT),t.register($T),t.register(LT)}var jT=E(()=>{"use strict";nT();sT();oT();cT();fT();pT();wT();ST();kT();NT();xT();OT();CT();MT()});function PT(){return ja===null&&(ja=new Tf,DT(ja)),ja}var CU,Tf,ja,FT=E(()=>{"use strict";jT();CU={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"},Tf=class{types=new Map;register(e){let n=`${e.description.namespace}/${e.description.name}`;if(this.types.has(n))throw new Error(`archetype already registered: ${n}`);this.types.set(n,e)}get(e){let n=e.includes("/")?e:CU[e];return n?this.types.get(n):void 0}list(){return Array.from(this.types.values())}},ja=null});async function qT(t){GT(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 n=t.dal.getProjectByJob(t.job.id);if(n===null)throw new Error(`job ${t.job.id} has no project`);let r=MU(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=fi(r)?r.entry_step_id:r.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=r.requires,l=$E(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:n.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:r.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(fi(r)){let m=vf({dal:t.dal,workflow:Fa(r),job:t.job,project:n,run:o,membersByAlias:c,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:Dn(t.job.payload)??{},team_id:t.team.id}),p=await BT(r,m,o.current_state??r.entry_step_id);return WT(t.dal,n.id,o.id,r.name,p),p}let u=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},d=vf({dal:t.dal,workflow:r,job:t.job,project:n,run:o,membersByAlias:c,outcomes:u,inputs:Dn(t.job.payload)??{},team_id:t.team.id}),f=await HT(d,o.current_state??r.start_at);return WT(t.dal,n.id,o.id,r.name,f),f}function WT(t,e,n,r,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let u=t.getRun(n);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let _ of f.steps)if(_.type==="lmctl/terminal"&&_.parameters!==null&&typeof _.parameters=="object"){let y=_.parameters;if(y.name===i&&(y.kind==="success"||y.kind==="failure"||y.kind==="neutral")){o=y.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let _=h;(_.on_unhandled_failure!==void 0||_.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",n)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:e,run_id:n,payload:JSON.stringify({run_id:n,workflow_name:r,terminal_state:i,terminal_kind:o,last_error:l})})}function vf(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(n,r,s)=>{let i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await Sf(e,n,r,s?.display_name??n)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(n,r,s)=>{GT(r);let i=fi(r)?r.entry_step_id:r.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:n.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=vf({dal:t.dal,workflow:fi(r)?Fa(r):r,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return fi(r)?BT(r,a,o.current_state??r.entry_step_id):HT(a,o.current_state??r.start_at)}};return e}async function HT(t,e){let n=e;if(n.startsWith(li))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(n.startsWith("@terminal:"))return _n(t,n.slice(10));t.dal.setRunCurrentState(t.run_id,n),t.last_state_id=n;let i=t.workflow.states[n];if(i===void 0){let l=Pa(t,te(t.workflow));if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return wt(t,{id:n,name:n,type:"unknown"},l.token,l.reason),Ye(t);if(l.kind==="terminal")return _n(t,l.terminal);n=l.state;continue}let o,a=JT(t,n);if(a!==null){let l=V(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Z(t,n,n,a),a===Cs)return _n(t,$c);let c=i.outcomes?.[a];o=c!==void 0?z(t.workflow,c):wt(t,{id:n,name:n,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${n}'`)}else o=await Sf(t,n,i);if(o.kind==="paused")return Ye(t);if(o.kind==="escalate")return wt(t,{id:n,name:n,type:i.type},o.token,o.reason),Ye(t);if(o.kind==="terminal"){let l=Pa(t,o.terminal);if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return wt(t,{id:n,name:n,type:i.type},l.token,l.reason),Ye(t);if(l.kind==="terminal")return _n(t,l.terminal);n=l.state;continue}n=o.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 r=Pa(t,te(t.workflow));return r.kind==="terminal"?_n(t,r.terminal):_n(t,te(t.workflow))}async function BT(t,e,n){let r=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=n;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=r.get(i);if(a===void 0)return wt(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ye(e);let l=JT(e,a.id);if(l!==null){let m=V(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Z(e,a.id,a.name,l),l===Cs)return _n(e,$c);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 wt(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}),Ye(e);i=h;continue}let c=await $U(e,t,a);if(c.kind==="paused")return Ye(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return wt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Ye(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Fa(t,a);try{let p=Pa(e,d);if(p.kind==="paused")return Ye(e);if(p.kind==="escalate")return wt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ye(e);if(p.kind==="terminal")return _n(e,p.terminal);let h=s.get(p.state);if(h===void 0)return wt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ye(e);i=h.id;continue}finally{e.workflow=m}}if(Ar(d))return wt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ye(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 wt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ye(e);i=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})}),_n(e,"aborted")}async function $U(t,e,n){let r=XT(e,n),s=t.workflow;t.workflow=Fa(e,n);try{return await Sf(t,n.id,r,n.name)}finally{t.workflow=s}}function XT(t,e){let n=e.parameters,r=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={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{...o,type:"Review",...n,coder:r.coder,reviewers:r.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...n,researchers:r.researchers,consolidator:r.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...n,agent:r.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...n,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...n,outcomes_from_exit:n.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...n,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...n};case"lmctl/foreach":return{...o,type:"ForEach",...n,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...n,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:n.name,kind:n.kind};default:return{...o,type:e.type,...n}}}async function Sf(t,e,n,r){let s=PT().get(n.type);if(s===void 0)throw new Error(`unknown archetype: ${n.type}`);if(s.execute===void 0)throw new Error(`archetype ${n.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?PU(t,s):void 0,t.progress_step_id=null;try{return await s.execute(zE(t,e,n,r??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function MU(t,e){try{let n=JSON.parse(t);if(jU(n)&&n.definition_schema_version===3)return zt.parse(n)}catch{return e}return e}function fi(t){return t.definition_schema_version===3}function Fa(t,e){let n=e===void 0?[]:Object.keys(t.connections[e.id]??{}),r=Object.fromEntries(n.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=XT(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(r[e.parameters.name]={kind:DU(e.parameters.kind)}),r.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:r,...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 DU(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function jU(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function PU(t,e){let n=`progress.${e.description.namespace}/${e.description.name}`;return r=>{try{if(typeof r.kind!="string"||r.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${n}.${r.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:r.message,data:r.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${n} event: ${i}`)}}}function _n(t,e){t.dal.setRunTerminalState(t.run_id,e);try{RE(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ye(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function JT(t,e){let r=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(r===null)return null;let s;try{let a=JSON.parse(r);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function Pa(t,e){if(!FU(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let n=t.workflow.errors;return n===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,n.on_unhandled_failure_state!==void 0?{kind:"state",state:n.on_unhandled_failure_state}:(n.on_unhandled_failure!==void 0&&UU(t,e,n.on_unhandled_failure),{kind:"terminal",terminal:e}))}function FU(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function UU(t,e,n){let r=WU(t),s=n.capture_evidence&&r!==null?qU(t,r.id):[];t.dal.raiseAttention({kind:n.attention_kind,severity:n.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:r?.id??null,last_error:r?.status_detail??null,evidence_paths:s,recommend_recovery:n.recommend_recovery??null})})}function WU(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 qU(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(r=>r.path)}function GT(t){if(!UT.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${UT.join(", ")}`)}var UT,KT=E(()=>{"use strict";Br();OE();ME();rt();FT();$s();UT=[1,2,3]});import{readFileSync as HU,readdirSync as BU}from"node:fs";import{basename as XU,join as JU,resolve as GU}from"node:path";function zT(t={}){let e=GU(t.workflowsDir??"workflows"),n=BU(e).filter(r=>r.endsWith(".compound.json")).sort((r,s)=>r.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:n.map(r=>KU(JU(e,r)))}}function KU(t){let e=XU(t);try{let n=HU(t,"utf8"),r=Rt(n);return ev(e,r)}catch(n){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:tv(n)}}}function ZT(t,e){try{let n=Rt(e);return ev(t,n)}catch(n){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:tv(n)}}}function QT(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 i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let n=t.rows.filter(i=>i.status==="PASS").length,r=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${n} pass, ${r} pass_needs_inputs, ${s} fail`),`${e.join(`
2143
+ `),e.loop_feedback_artifact!==void 0){let _=V(t,{run_id:t.run_id,state_name:`${r}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(_.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:_.id,kind:e.loop_feedback_artifact,content:a})}}let u=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Z(t,n,r,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?z(t.workflow,d):{kind:"terminal",terminal:te(t.workflow)}}var wU,bT,kT=E(()=>{"use strict";pf();nt();wU=["blocked","failed","aborted"],bT={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=>EU(t,t.state)}});import{spawnSync as TU}from"node:child_process";async function vU(t,e){let n=t.stateId,r=t.displayName,s=await at(e.command,t,r),i=yf(t,r),o=QE(s);if(o.matched&&!i){let h=V(t,{run_id:t.run_id,state_name:r});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:r,kind:o.kind,command:s,message:`ShellStep ${r} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:te(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=TU("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=V(t,{run_id:t.run_id,state_name:r});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:r,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:te(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&wf(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:r,message:`ShellStep ${r} 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:te(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}`),Z(t,n,r,m),z(t.workflow,p))}var IT,NT=E(()=>{"use strict";nt();IT={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=>vU(t,t.state)}});async function SU(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:te(t.workflow)};let o=Rt(i.definition),a=await bU(t,e),l=await t.runChildWorkflow(i,o,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:te(t.workflow)};Z(t,n,r,kU(t,l.run_id,o.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:te(t.workflow)}:z(t.workflow,u)}async function bU(t,e){let n={};for(let[r,s]of Object.entries(e.inputs??{})){let i=await JE(s,t);n[r]=i===s?await La(s,t):i}return n}function kU(t,e,n){let r={};for(let s of n)r[s.name]=IU(t,e,s);return r}function IU(t,e,n){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,n.source_step_id)[0];if(s===void 0)return null;let i=NU(s,n.source_field);if(i.found)return i.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,n.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function NU(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 AT,xT=E(()=>{"use strict";ei();nt();ai();AT={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=>SU(t,t.state)}});function AU(t,e){let n=t.stateId,r=t.displayName,s=e.name??r,i=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),Z(t,n,r,s),{kind:"terminal",terminal:s}}var RT,OT=E(()=>{"use strict";nt();RT={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=>AU(t,t.state)}});async function xU(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",n=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||n.length===0)return null;let r=new URL(`https://api.github.com/repos/${e}/${n}/issues`);r.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&r.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&r.searchParams.set("since",t.parameters.since);let s=await fetch(r);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=RU(t.cursor),a=i.filter(OU).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function RU(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function OU(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 LT,CT=E(()=>{"use strict";LT={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=>xU(t)}});async function LU(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let n=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===n?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:n,cron:e}]}}var $T,MT=E(()=>{"use strict";$T={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=>LU(t)}});function DT(t){t.register(tT),t.register(bT),t.register(iT),t.register(uT),t.register(mT),t.register(gT),t.register(vT),t.register(IT),t.register(rT),t.register(aT),t.register(AT),t.register(RT),t.register($T),t.register(LT)}var jT=E(()=>{"use strict";nT();sT();oT();cT();fT();pT();wT();ST();kT();NT();xT();OT();CT();MT()});function PT(){return ja===null&&(ja=new Tf,DT(ja)),ja}var CU,Tf,ja,FT=E(()=>{"use strict";jT();CU={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"},Tf=class{types=new Map;register(e){let n=`${e.description.namespace}/${e.description.name}`;if(this.types.has(n))throw new Error(`archetype already registered: ${n}`);this.types.set(n,e)}get(e){let n=e.includes("/")?e:CU[e];return n?this.types.get(n):void 0}list(){return Array.from(this.types.values())}},ja=null});async function qT(t){GT(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 n=t.dal.getProjectByJob(t.job.id);if(n===null)throw new Error(`job ${t.job.id} has no project`);let r=MU(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=fi(r)?r.entry_step_id:r.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=r.requires,l=$E(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:n.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:r.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(fi(r)){let m=vf({dal:t.dal,workflow:Fa(r),job:t.job,project:n,run:o,membersByAlias:c,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:Dn(t.job.payload)??{},team_id:t.team.id}),p=await BT(r,m,o.current_state??r.entry_step_id);return WT(t.dal,n.id,o.id,r.name,p),p}let u=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},d=vf({dal:t.dal,workflow:r,job:t.job,project:n,run:o,membersByAlias:c,outcomes:u,inputs:Dn(t.job.payload)??{},team_id:t.team.id}),f=await HT(d,o.current_state??r.start_at);return WT(t.dal,n.id,o.id,r.name,f),f}function WT(t,e,n,r,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let u=t.getRun(n);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let _ of f.steps)if(_.type==="lmctl/terminal"&&_.parameters!==null&&typeof _.parameters=="object"){let y=_.parameters;if(y.name===i&&(y.kind==="success"||y.kind==="failure"||y.kind==="neutral")){o=y.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let _=h;(_.on_unhandled_failure!==void 0||_.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",n)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:e,run_id:n,payload:JSON.stringify({run_id:n,workflow_name:r,terminal_state:i,terminal_kind:o,last_error:l})})}function vf(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(n,r,s)=>{let i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await Sf(e,n,r,s?.display_name??n)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(n,r,s)=>{GT(r);let i=fi(r)?r.entry_step_id:r.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:n.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=vf({dal:t.dal,workflow:fi(r)?Fa(r):r,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return fi(r)?BT(r,a,o.current_state??r.entry_step_id):HT(a,o.current_state??r.start_at)}};return e}async function HT(t,e){let n=e;if(n.startsWith(li))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(n.startsWith("@terminal:"))return _n(t,n.slice(10));t.dal.setRunCurrentState(t.run_id,n),t.last_state_id=n;let i=t.workflow.states[n];if(i===void 0){let l=Pa(t,te(t.workflow));if(l.kind==="paused")return Ve(t);if(l.kind==="escalate")return yt(t,{id:n,name:n,type:"unknown"},l.token,l.reason),Ve(t);if(l.kind==="terminal")return _n(t,l.terminal);n=l.state;continue}let o,a=JT(t,n);if(a!==null){let l=V(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Z(t,n,n,a),a===Cs)return _n(t,$c);let c=i.outcomes?.[a];o=c!==void 0?z(t.workflow,c):yt(t,{id:n,name:n,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${n}'`)}else o=await Sf(t,n,i);if(o.kind==="paused")return Ve(t);if(o.kind==="escalate")return yt(t,{id:n,name:n,type:i.type},o.token,o.reason),Ve(t);if(o.kind==="terminal"){let l=Pa(t,o.terminal);if(l.kind==="paused")return Ve(t);if(l.kind==="escalate")return yt(t,{id:n,name:n,type:i.type},l.token,l.reason),Ve(t);if(l.kind==="terminal")return _n(t,l.terminal);n=l.state;continue}n=o.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 r=Pa(t,te(t.workflow));return r.kind==="terminal"?_n(t,r.terminal):_n(t,te(t.workflow))}async function BT(t,e,n){let r=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=n;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=r.get(i);if(a===void 0)return yt(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ve(e);let l=JT(e,a.id);if(l!==null){let m=V(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Z(e,a.id,a.name,l),l===Cs)return _n(e,$c);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 yt(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}),Ve(e);i=h;continue}let c=await $U(e,t,a);if(c.kind==="paused")return Ve(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return yt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Ve(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Fa(t,a);try{let p=Pa(e,d);if(p.kind==="paused")return Ve(e);if(p.kind==="escalate")return yt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ve(e);if(p.kind==="terminal")return _n(e,p.terminal);let h=s.get(p.state);if(h===void 0)return yt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ve(e);i=h.id;continue}finally{e.workflow=m}}if(Ar(d))return yt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ve(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 yt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ve(e);i=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})}),_n(e,"aborted")}async function $U(t,e,n){let r=XT(e,n),s=t.workflow;t.workflow=Fa(e,n);try{return await Sf(t,n.id,r,n.name)}finally{t.workflow=s}}function XT(t,e){let n=e.parameters,r=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={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{...o,type:"Review",...n,coder:r.coder,reviewers:r.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...n,researchers:r.researchers,consolidator:r.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...n,agent:r.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...n,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...n,outcomes_from_exit:n.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...n,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...n};case"lmctl/foreach":return{...o,type:"ForEach",...n,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...n,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:n.name,kind:n.kind};default:return{...o,type:e.type,...n}}}async function Sf(t,e,n,r){let s=PT().get(n.type);if(s===void 0)throw new Error(`unknown archetype: ${n.type}`);if(s.execute===void 0)throw new Error(`archetype ${n.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?PU(t,s):void 0,t.progress_step_id=null;try{return await s.execute(zE(t,e,n,r??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function MU(t,e){try{let n=JSON.parse(t);if(jU(n)&&n.definition_schema_version===3)return zt.parse(n)}catch{return e}return e}function fi(t){return t.definition_schema_version===3}function Fa(t,e){let n=e===void 0?[]:Object.keys(t.connections[e.id]??{}),r=Object.fromEntries(n.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=XT(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(r[e.parameters.name]={kind:DU(e.parameters.kind)}),r.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:r,...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 DU(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function jU(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function PU(t,e){let n=`progress.${e.description.namespace}/${e.description.name}`;return r=>{try{if(typeof r.kind!="string"||r.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${n}.${r.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:r.message,data:r.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${n} event: ${i}`)}}}function _n(t,e){t.dal.setRunTerminalState(t.run_id,e);try{RE(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ve(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function JT(t,e){let r=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(r===null)return null;let s;try{let a=JSON.parse(r);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function Pa(t,e){if(!FU(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let n=t.workflow.errors;return n===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,n.on_unhandled_failure_state!==void 0?{kind:"state",state:n.on_unhandled_failure_state}:(n.on_unhandled_failure!==void 0&&UU(t,e,n.on_unhandled_failure),{kind:"terminal",terminal:e}))}function FU(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function UU(t,e,n){let r=WU(t),s=n.capture_evidence&&r!==null?qU(t,r.id):[];t.dal.raiseAttention({kind:n.attention_kind,severity:n.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:r?.id??null,last_error:r?.status_detail??null,evidence_paths:s,recommend_recovery:n.recommend_recovery??null})})}function WU(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 qU(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(r=>r.path)}function GT(t){if(!UT.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${UT.join(", ")}`)}var UT,KT=E(()=>{"use strict";Br();OE();ME();nt();FT();$s();UT=[1,2,3]});import{readFileSync as HU,readdirSync as BU}from"node:fs";import{basename as XU,join as JU,resolve as GU}from"node:path";function zT(t={}){let e=GU(t.workflowsDir??"workflows"),n=BU(e).filter(r=>r.endsWith(".compound.json")).sort((r,s)=>r.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:n.map(r=>KU(JU(e,r)))}}function KU(t){let e=XU(t);try{let n=HU(t,"utf8"),r=Rt(n);return ev(e,r)}catch(n){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:tv(n)}}}function ZT(t,e){try{let n=Rt(e);return ev(t,n)}catch(n){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:tv(n)}}}function QT(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 i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let n=t.rows.filter(i=>i.status==="PASS").length,r=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${n} pass, ${r} pass_needs_inputs, ${s} fail`),`${e.join(`
2144
2144
  `)}
2145
2145
  `}function ev(t,e){let n=YU(e),r=zU(e);if(n===null||r===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:n,first_step_type:r,first_step_disposition:null,note:"entry step missing after validation"};let s=VU(e.inputs);return s.length>0?{file:t,workflow_name:e.name,status:"PASS_NEEDS_INPUTS",first_step_id:n,first_step_type:r,first_step_disposition:`needs_inputs:${r}`,note:`load ok; graph ok; entry step is ${n}; requires inputs: ${s.join(", ")}`}:{file:t,workflow_name:e.name,status:"PASS",first_step_id:n,first_step_type:r,first_step_disposition:`ready:${r}`,note:"load ok; graph ok; first step entered without inputs"}}function VU(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function YU(t){return bf(t)?t.entry_step_id:t.start_at}function zU(t){return bf(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function bf(t){return t.definition_schema_version===3}function tv(t){return t instanceof mn?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 nv(t){let e=new Set;if(bf(t))for(let n of t.steps){let r=n.members??{};VT(r,e)}else for(let n of Object.values(t.states))VT(n,e);return[...e].sort()}function VT(t,e){let n=["coder","agent","consolidator"],r=["reviewers","researchers"];for(let s of n){let i=t[s],o=YT(i);o!==null&&e.add(o)}for(let s of r){let i=t[s];if(Array.isArray(i))for(let o of i){let a=YT(o);a!==null&&e.add(a)}}}function YT(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Ua=E(()=>{"use strict";ei()});function ZU({dal:t}){let e=t.listProjects();for(let n of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",n.id,Wa)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=QU(t,n,o);if(a<20)continue;let c=o??"initial",u=`${mi}:${n.id}:${c}`;t.enqueueJob({project_id:n.id,source:Wa,source_ref:mi,payload:JSON.stringify({kind:mi,project_id:n.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:u})}}function QU(t,e,n){let r=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
2146
2146
  FROM run r
2147
2147
  JOIN job j ON j.id = r.job_id
2148
2148
  WHERE j.project_id = ?
2149
2149
  AND r.terminal_state IS NOT NULL
2150
- ${n!==null?"AND r.id > ?":""}`,...n!==null?[e.id,n]:[e.id]);return{count:r[0]?.cnt??0,maxRunId:r[0]?.max_id??0}}function rv(t){for(let e of eW)try{e(t)}catch{}}var Wa,mi,eW,kf=E(()=>{"use strict";Wa="memory_policy",mi="memory_consolidation_request";eW=[ZU]});var cv={};oe(cv,{getOrInsertConsolidationWorkflow:()=>iv,runJobById:()=>iW,runOnce:()=>ur,startWorker:()=>oW});import{createHash as tW}from"node:crypto";import{readFileSync as nW}from"node:fs";import{pathToFileURL as rW}from"node:url";function iv(t,e="durable-memory-consolidation-v2"){let n=t.getWorkflowByName(e);if(n!==null)return n;try{xE({swallow:!0});let r=Ra(e);if(r===null)return null;let s=nW(r,"utf8"),i=Rt(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:rW(r).href,source_sha256:tW("sha256").update(s).digest("hex")})}catch{return null}}async function ur(t){let e=Date.now(),n=null;try{return n=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??sv,evaluator:r=>av(t.dal,r)}),n===null?null:await ov(t.dal,n,e)}catch(r){if(n!==null)return Fn(t.dal,n,"worker_run_failed",dr(r),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:qa(dr(r))})})}catch{}return null}finally{t.max_concurrent}}async function iW(t){let e=Date.now(),n=null;try{let r=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??sv,evaluator:s=>av(t.dal,s)});return r.claimed?(n=r.job,{claimed:!0,...await ov(t.dal,n,e)}):r}catch(r){if(n!==null)return{claimed:!0,...Fn(t.dal,n,"worker_run_failed",dr(r),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:qa(dr(r)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function ov(t,e,n){let r=t.getProjectByJob(e.id);if(r===null)return Fn(t,e,"worker_project_missing","project_not_found",n);let s=e.source===Wa&&e.source_ref===mi,i=e.run_id===null?null:t.getRun(e.run_id),o;if(i!==null?o=t.getWorkflow(i.workflow_id):s?o=iv(t):o=lv(t,e,r),o===null)return Fn(t,e,"worker_workflow_missing","workflow_not_found",n,r);let a=t.getTeam(i?.team_id??r.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return Fn(t,e,"worker_team_missing","team_not_found",n,r);let c;try{c=Rt(o.definition)}catch(d){return Fn(t,e,"worker_workflow_invalid",dr(d),n,r)}let u=aW(c,l);if(u.length>0)return Fn(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,n,r,a);try{let d=await qT({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:o});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()-n}:(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()-n})}catch(d){return Fn(t,e,"worker_run_failed",dr(d),n,r,a)}}function av(t,e){let n=t.getProjectByJob(e.id);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let r=lv(t,e,n);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Rt(r.definition)}catch{s=null}return ya({workflow:s,job:e,project:n})}function lv(t,e,n){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name)}async function oW(t){let e=!1,n=null,r=Promise.resolve(),s=async()=>{if(!e){try{let i;do i=await ur(t);while(!e&&i!==null)}catch(i){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:qa(dr(i))})})}catch{}}e||(n=setTimeout(()=>{r=s()},t.poll_interval_ms??sW))}};return r=s(),{stop:async()=>{e=!0,n!==null&&clearTimeout(n),await r.catch(()=>{})}}}function Fn(t,e,n,r,s,i,o){let a=qa(r);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:n,severity:"error",project_id:i?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:o?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function dr(t){return t instanceof Error?t.message:String(t)}function qa(t){return t.length>4096?t.slice(0,4096):t}function aW(t,e){let n=nv(t);if(n.length===0)return[];let r=new Set(e.map(s=>s.alias));return n.filter(s=>!r.has(s))}var sv,sW,Ha=E(()=>{"use strict";cf();KT();ei();Ua();Hu();kf();sv=6e5,sW=5e3});import{existsSync as lW,readFileSync as cW}from"node:fs";import{marked as dW}from"marked";function mv(t,e){t.get("/layman",n=>n.html(Fe("Layman Home",uW(e.dal)))),t.get("/api/layman",n=>n.json(gv(e.dal))),t.get("/layman/start/:workflow",n=>{let r=fv(n);return r===null?n.notFound():n.html(Fe(`Start ${zr(r)}`,pW(e.dal,r)))}),t.post("/layman/start/:workflow",async n=>{let r=fv(n);return r===null?n.notFound():r==="newspaper"?dv(n,e.dal):_W(n,e.dal,r)}),t.get("/layman/run/:id",n=>{let r=ir(e.dal,Ba(n,"id"));return r===null?n.notFound():n.html(Fe(`Run ${r.id}`,yW(e.dal,r)))}),t.get("/api/layman/run/:id",n=>{let r=ir(e.dal,Ba(n,"id"));return r===null?n.notFound():n.json(xW(e.dal,r))}),t.post("/layman/run/:id/respond",async n=>EW(n,e.dal)),t.get("/layman/newspaper",n=>n.html(Fe("Newspaper Subscriptions",NW(e.dal)))),t.post("/layman/newspaper",n=>dv(n,e.dal)),t.delete("/layman/newspaper/:id",n=>uv(n,e.dal)),t.post("/layman/newspaper/:id/delete",n=>uv(n,e.dal))}function uW(t){let e=gv(t);return`<section class="layman-home">
2150
+ ${n!==null?"AND r.id > ?":""}`,...n!==null?[e.id,n]:[e.id]);return{count:r[0]?.cnt??0,maxRunId:r[0]?.max_id??0}}function rv(t){for(let e of eW)try{e(t)}catch{}}var Wa,mi,eW,kf=E(()=>{"use strict";Wa="memory_policy",mi="memory_consolidation_request";eW=[ZU]});var cv={};oe(cv,{getOrInsertConsolidationWorkflow:()=>iv,runJobById:()=>iW,runOnce:()=>ur,startWorker:()=>oW});import{createHash as tW}from"node:crypto";import{readFileSync as nW}from"node:fs";import{pathToFileURL as rW}from"node:url";function iv(t,e="durable-memory-consolidation-v2"){let n=t.getWorkflowByName(e);if(n!==null)return n;try{xE({swallow:!0});let r=Ra(e);if(r===null)return null;let s=nW(r,"utf8"),i=Rt(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:rW(r).href,source_sha256:tW("sha256").update(s).digest("hex")})}catch{return null}}async function ur(t){let e=Date.now(),n=null;try{return n=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??sv,evaluator:r=>av(t.dal,r)}),n===null?null:await ov(t.dal,n,e)}catch(r){if(n!==null)return Fn(t.dal,n,"worker_run_failed",dr(r),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:qa(dr(r))})})}catch{}return null}finally{t.max_concurrent}}async function iW(t){let e=Date.now(),n=null;try{let r=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??sv,evaluator:s=>av(t.dal,s)});return r.claimed?(n=r.job,{claimed:!0,...await ov(t.dal,n,e)}):r}catch(r){if(n!==null)return{claimed:!0,...Fn(t.dal,n,"worker_run_failed",dr(r),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:qa(dr(r)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function ov(t,e,n){let r=t.getProjectByJob(e.id);if(r===null)return Fn(t,e,"worker_project_missing","project_not_found",n);let s=e.source===Wa&&e.source_ref===mi,i=e.run_id===null?null:t.getRun(e.run_id),o;if(i!==null?o=t.getWorkflow(i.workflow_id):s?o=iv(t):o=lv(t,e,r),o===null)return Fn(t,e,"worker_workflow_missing","workflow_not_found",n,r);let a=t.getTeam(i?.team_id??r.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return Fn(t,e,"worker_team_missing","team_not_found",n,r);let c;try{c=Rt(o.definition)}catch(d){return Fn(t,e,"worker_workflow_invalid",dr(d),n,r)}let u=aW(c,l);if(u.length>0)return Fn(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,n,r,a);try{let d=await qT({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:o});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()-n}:(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()-n})}catch(d){return Fn(t,e,"worker_run_failed",dr(d),n,r,a)}}function av(t,e){let n=t.getProjectByJob(e.id);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let r=lv(t,e,n);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Rt(r.definition)}catch{s=null}return ya({workflow:s,job:e,project:n})}function lv(t,e,n){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name)}async function oW(t){let e=!1,n=null,r=Promise.resolve(),s=async()=>{if(!e){try{let i;do i=await ur(t);while(!e&&i!==null)}catch(i){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:qa(dr(i))})})}catch{}}e||(n=setTimeout(()=>{r=s()},t.poll_interval_ms??sW))}};return r=s(),{stop:async()=>{e=!0,n!==null&&clearTimeout(n),await r.catch(()=>{})}}}function Fn(t,e,n,r,s,i,o){let a=qa(r);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:n,severity:"error",project_id:i?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:o?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function dr(t){return t instanceof Error?t.message:String(t)}function qa(t){return t.length>4096?t.slice(0,4096):t}function aW(t,e){let n=nv(t);if(n.length===0)return[];let r=new Set(e.map(s=>s.alias));return n.filter(s=>!r.has(s))}var sv,sW,Ha=E(()=>{"use strict";cf();KT();ei();Ua();Hu();kf();sv=6e5,sW=5e3});import{existsSync as lW,readFileSync as cW}from"node:fs";import{marked as dW}from"marked";function mv(t,e){t.get("/layman",n=>n.html(Ue("Layman Home",uW(e.dal)))),t.get("/api/layman",n=>n.json(gv(e.dal))),t.get("/layman/start/:workflow",n=>{let r=fv(n);return r===null?n.notFound():n.html(Ue(`Start ${zr(r)}`,pW(e.dal,r)))}),t.post("/layman/start/:workflow",async n=>{let r=fv(n);return r===null?n.notFound():r==="newspaper"?dv(n,e.dal):_W(n,e.dal,r)}),t.get("/layman/run/:id",n=>{let r=ir(e.dal,Ba(n,"id"));return r===null?n.notFound():n.html(Ue(`Run ${r.id}`,yW(e.dal,r)))}),t.get("/api/layman/run/:id",n=>{let r=ir(e.dal,Ba(n,"id"));return r===null?n.notFound():n.json(xW(e.dal,r))}),t.post("/layman/run/:id/respond",async n=>EW(n,e.dal)),t.get("/layman/newspaper",n=>n.html(Ue("Newspaper Subscriptions",NW(e.dal)))),t.post("/layman/newspaper",n=>dv(n,e.dal)),t.delete("/layman/newspaper/:id",n=>uv(n,e.dal)),t.post("/layman/newspaper/:id/delete",n=>uv(n,e.dal))}function uW(t){let e=gv(t);return`<section class="layman-home">
2151
2151
  <h1>Welcome</h1>
2152
2152
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
2153
2153
  <div class="grid">${Xa.map(fW).join("")}</div>
@@ -2175,7 +2175,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2175
2175
  <label>Slug<input name="slug" placeholder="my-document" required></label>
2176
2176
  <label>Output directory<input name="output_dir" value="drafts"></label>
2177
2177
  <button type="submit">Start Document Wizard</button>
2178
- </form>`:hv(r,"/layman/start/newspaper")}function pv(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 _W(t,e,n){let r=await t.req.parseBody(),s=Ev(e,r);if(s===null)return t.html(Fe("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let i=e.getWorkflowByName(n);if(i===null)return t.html(Fe("Start workflow",`<p class="error">${S(zr(n))} is not loaded.</p>`),400);let o=n==="info-qa"?hW(r):gW(r);if(typeof o=="string")return t.html(Fe("Start workflow",`<p class="error">${S(o)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:i.id,source:"layman",source_ref:n,dedupe_key:`layman:${n}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(o)}),l=await ur({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 hW(t){let e=ct(t.question).trim();if(e.length===0)return"Enter a question.";let n=ct(t.output_path).trim();return{question:e,...n.length>0?{output_path:n}:{}}}function gW(t){let e=ct(t.task_description).trim(),n=DW(ct(t.slug).trim()),r=ct(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":n.length===0?"Enter a document slug.":{task_description:e,slug:n,output_dir:r}}function yW(t,e){let n=e.workflow?.name??"unknown",r=`<h1>${S(zr(n))}</h1>
2178
+ </form>`:hv(r,"/layman/start/newspaper")}function pv(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 _W(t,e,n){let r=await t.req.parseBody(),s=Ev(e,r);if(s===null)return t.html(Ue("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let i=e.getWorkflowByName(n);if(i===null)return t.html(Ue("Start workflow",`<p class="error">${S(zr(n))} is not loaded.</p>`),400);let o=n==="info-qa"?hW(r):gW(r);if(typeof o=="string")return t.html(Ue("Start workflow",`<p class="error">${S(o)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:i.id,source:"layman",source_ref:n,dedupe_key:`layman:${n}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(o)}),l=await ur({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 hW(t){let e=lt(t.question).trim();if(e.length===0)return"Enter a question.";let n=lt(t.output_path).trim();return{question:e,...n.length>0?{output_path:n}:{}}}function gW(t){let e=lt(t.task_description).trim(),n=DW(lt(t.slug).trim()),r=lt(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":n.length===0?"Enter a document slug.":{task_description:e,slug:n,output_dir:r}}function yW(t,e){let n=e.workflow?.name??"unknown",r=`<h1>${S(zr(n))}</h1>
2179
2179
  <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${r}${vW(t,e,n)}`;let s=wv(t,e);return s!==null&&s.status==="waiting_operator"?`${r}${wW(e,s)}`:`${r}<section hx-get="/layman/run/${S(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
2180
2180
  <h2>Running</h2>
2181
2181
  <p class="muted">Current stage: <strong>${S(e.current_state??"starting")}</strong></p>
@@ -2191,7 +2191,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2191
2191
  <button type="submit" name="done" value="false">Send response</button>
2192
2192
  <button type="submit" name="done" value="true">Done with this stage</button>
2193
2193
  </form>
2194
- </section>`}async function EW(t,e){let n=Ba(t,"id"),r=await t.req.parseBody(),s=Number(ct(r.step_id)),i=ct(r.input),o=ct(r.done)==="true";if(!Number.isInteger(s))return t.html(Fe("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,i,o);return a.resumed?(TW(e,a.run.id),await ur({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${n}`,302)):t.html(Fe("Interactive response",`<p class="error">Could not submit response: ${S(a.reason)}</p>`),400)}function TW(t,e){let n=t.getRun(e);if(n===null||n.current_state===null)return;let r=t.getWorkflow(n.workflow_id);if(r!==null)try{let s=JSON.parse(r.definition);if(!Nf(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>Nf(o)&&o.name===n.current_state&&typeof o.id=="string");Nf(i)&&typeof i.id=="string"&&t.setRunCurrentState(n.id,i.id)}catch{return}}function vW(t,e,n){let r=CW(e.terminal_state);return`<section class="metric terminal-run">
2194
+ </section>`}async function EW(t,e){let n=Ba(t,"id"),r=await t.req.parseBody(),s=Number(lt(r.step_id)),i=lt(r.input),o=lt(r.done)==="true";if(!Number.isInteger(s))return t.html(Ue("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,i,o);return a.resumed?(TW(e,a.run.id),await ur({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${n}`,302)):t.html(Ue("Interactive response",`<p class="error">Could not submit response: ${S(a.reason)}</p>`),400)}function TW(t,e){let n=t.getRun(e);if(n===null||n.current_state===null)return;let r=t.getWorkflow(n.workflow_id);if(r!==null)try{let s=JSON.parse(r.definition);if(!Nf(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>Nf(o)&&o.name===n.current_state&&typeof o.id=="string");Nf(i)&&typeof i.id=="string"&&t.setRunCurrentState(n.id,i.id)}catch{return}}function vW(t,e,n){let r=CW(e.terminal_state);return`<section class="metric terminal-run">
2195
2195
  <h2>${r?"Complete":"Stopped"}</h2>
2196
2196
  <p>Status: <strong>${S(e.terminal_state)}</strong></p>
2197
2197
  ${r?SW(t,e,n):kW(e)}
@@ -2214,7 +2214,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2214
2214
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
2215
2215
  <label>Output directory<input name="output_dir" value="digests"></label>
2216
2216
  <button type="submit">Create subscription</button>
2217
- </form>`}async function dv(t,e){let n=await t.req.parseBody(),r=Ev(e,n);if(r===null)return t.html(Fe("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Fe("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let i=ct(n.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(i.length===0)return t.html(Fe("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let o={topics:i,output_dir:ct(n.output_dir).trim()||"digests",schedule:OW(n)};return e.insertProjectWorkflow({project_id:r.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(o),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function uv(t,e){let n=Ba(t,"id");return e.removeProjectWorkflow(n)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function AW(t){return Ee(["id","project","topics","status","action"],t.map(e=>{let n=jW(e.parameters_override),r=Array.isArray(n.topics)?n.topics.join(", "):"";return[S(e.id),S(e.project_name),S(r),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function gv(t){let e=yv(t);return{workflows:Xa,recent_runs:RW(t),newspaper_subscriptions:e.length}}function xW(t,e){let n=wv(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.terminal_state,paused_interactive:n?.status==="waiting_operator"?{step_id:n.step_id,state_name:n.state_name,last_agent_output:n.last_agent_output}:null,steps:e.steps.map(r=>({id:r.id,state_name:r.state_name,outcome:r.outcome,status_detail:r.status_detail}))}}function RW(t){return t.query(`SELECT r.*, w.name AS workflow_name
2217
+ </form>`}async function dv(t,e){let n=await t.req.parseBody(),r=Ev(e,n);if(r===null)return t.html(Ue("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Ue("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let i=lt(n.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(i.length===0)return t.html(Ue("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let o={topics:i,output_dir:lt(n.output_dir).trim()||"digests",schedule:OW(n)};return e.insertProjectWorkflow({project_id:r.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(o),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function uv(t,e){let n=Ba(t,"id");return e.removeProjectWorkflow(n)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function AW(t){return Ee(["id","project","topics","status","action"],t.map(e=>{let n=jW(e.parameters_override),r=Array.isArray(n.topics)?n.topics.join(", "):"";return[S(e.id),S(e.project_name),S(r),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function gv(t){let e=yv(t);return{workflows:Xa,recent_runs:RW(t),newspaper_subscriptions:e.length}}function xW(t,e){let n=wv(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.terminal_state,paused_interactive:n?.status==="waiting_operator"?{step_id:n.step_id,state_name:n.state_name,last_agent_output:n.last_agent_output}:null,steps:e.steps.map(r=>({id:r.id,state_name:r.state_name,outcome:r.outcome,status_detail:r.status_detail}))}}function RW(t){return t.query(`SELECT r.*, w.name AS workflow_name
2218
2218
  FROM run r
2219
2219
  JOIN workflow w ON w.id = r.workflow_id
2220
2220
  WHERE w.name IN (${Af.map(()=>"?").join(",")})
@@ -2224,21 +2224,21 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2224
2224
  JOIN workflow w ON w.id = pw.workflow_id
2225
2225
  JOIN project p ON p.id = pw.project_id
2226
2226
  WHERE w.name = ?
2227
- ORDER BY pw.id DESC`,"newspaper")}function wv(t,e){for(let n of[...e.steps].reverse()){let r=t.getInteractiveSessionByStepId(n.id);if(r!==null)return r}return null}function Ev(t,e){let n=Number(ct(e.project_id));return Number.isInteger(n)?t.getProject(n):null}function OW(t){let e=ct(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:ct(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function fv(t){let e=t.req.param("workflow");return Af.includes(e)?e:null}function zr(t){return Xa.find(e=>e.name===t)?.title??t}function LW(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Rf(t){return dW.parse(t,{async:!1})}function CW(t){return t==="done"||t==="pr_ready"||t==="merged"}function $W(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function MW(t,e){return t.split(`
2227
+ ORDER BY pw.id DESC`,"newspaper")}function wv(t,e){for(let n of[...e.steps].reverse()){let r=t.getInteractiveSessionByStepId(n.id);if(r!==null)return r}return null}function Ev(t,e){let n=Number(lt(e.project_id));return Number.isInteger(n)?t.getProject(n):null}function OW(t){let e=lt(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:lt(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function fv(t){let e=t.req.param("workflow");return Af.includes(e)?e:null}function zr(t){return Xa.find(e=>e.name===t)?.title??t}function LW(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Rf(t){return dW.parse(t,{async:!1})}function CW(t){return t==="done"||t==="pr_ready"||t==="merged"}function $W(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function MW(t,e){return t.split(`
2228
2228
  `).slice(0,e).join(`
2229
- `)}function DW(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function ct(t){return typeof t=="string"?t:""}function jW(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 Nf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ba(t,e){return Number(t.req.param(e))}var Xa,Af,Tv=E(()=>{"use strict";Ha();un();rf();Xa=[{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."}],Af=Xa.map(t=>t.name)});function FW(t){return t.replace(/^\/+/,"")}function vv(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Zr(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=FW(t.mailboxKey),n=e.lastIndexOf("/");return(n>=0?e.slice(n+1):e).includes(".")&&(e=n>=0?e.slice(0,n+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return vv(t.userId)&&vv(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${PW}/${t.identityId}/`}function WW(t){return String(Math.max(0,Math.floor(t))).padStart(UW,"0")}function Of(t,e,n){return`${t}${e}${WW(n)}.json`}function Ja(t,e){return`${t}${e}`}function Ga(t,e,n){let r=`${e}${n}`;if(!t.startsWith(r))return;let s=t.slice(r.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var PW,UW,Ka=E(()=>{"use strict";PW="mailbox";UW=12});function hn(t,e){let n=Math.floor(t),r="",s=n;for(let u=0;u<12;u++)r=Va[s&15]+r,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let u=0;u<3;u++)o=Va[a&15]+o,a=a>>4;let l=Va[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Va[Math.floor(e()*16)&15];return r.slice(0,8)+"-"+r.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Va,Ya=E(()=>{"use strict";Va="0123456789abcdef"});function Cf(t,e){return!Number.isFinite(t)||t<=0?e:t}function $f(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 Nv(t){return t.conversation_id===Iv&&BW(t.payload)}function BW(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function XW(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Nv(t)?t.timestamp:void 0;if(e===void 0)return;let n=Date.parse(e);return Number.isFinite(n)?n:void 0}var Sv,bv,kv,qW,Iv,HW,Lf,fr,za=E(()=>{"use strict";Ka();Ya();Sv=3e3,bv=1e4,kv=12e3,qW=1e3,Iv="__lmctl_heartbeat__",HW={kind:"heartbeat"},Lf={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},fr=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=Zr({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=Cf(e.readIntervalMs??e.pollIntervalMs??Sv,Sv),this.heartbeatIdleMs=Cf(e.heartbeatIdleMs??bv,bv),this.backoffReadIntervalMs=Cf(e.backoffReadIntervalMs??e.pollIntervalMs??kv,kv)}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??Lf;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 n=Ja(this.basePrefix,e),r=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:n,MaxKeys:qW,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Ga(o.Key??"",this.basePrefix,e);a!==void 0&&a>r&&(r=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return r}async putEnvelope(e,n){let r=this.writeChain.then(()=>this.doPut(e,n));return this.writeChain=r.catch(()=>{}),r}async doPut(e,n){await this.ensureBootstrapped();let r=(this.opts.now??Date.now)(),s=new Date(r).toISOString(),i={message_id:hn(r,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:n},o=(this.ownSeq??0)+1,a=Of(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(r),a}scheduleNextTick(e){if(this.stopRequested)return;let n=this.opts.timers??Lf;this.timerHandle=n.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,n=Of(this.basePrefix,this.peerStream,e),r;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:n}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${n}: empty body`),"get"),this.advanceCursor(e);continue}r=await i.Body.transformToString("utf-8")}catch(i){if($f(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(r)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Nv(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"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 n=XW(e);n!==void 0&&(this.lastPeerHeartbeatMs=n)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let n=this.opts.timers??Lf;this.heartbeatTimerHandle!==null&&n.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=n.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 n=e-this.lastWriteMs;if(n<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-n);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Iv,HW)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(n){this.emitError(n,"handle")}}emitError(e,n){if(this.opts.onError!==void 0)try{this.opts.onError(e,n)}catch{}else console.error(`SequentialMailboxClient[${n}]`,e)}}});import{getConnInfo as JW}from"@hono/node-server/conninfo";function Av(t,e){let n=e.bucket??GW,r=e.remoteAddressOf??(i=>VW(i)),s=i=>{let o=r(i);return YW(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Mf(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:n,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return $f(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Df(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Mf(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:n,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Df(c)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Mf(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=KW(i.req.query("maxKeys")),u=i.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:n,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return i.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 i.json({error:"internal",message:Df(d)},500)}})}function Mf(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let n=t.replace(/^\/+/,"");return n.split("/").includes("..")?{error:"key must not contain '..'"}:n}function KW(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function VW(t){try{return JW(t).remote.address}catch{return}}function YW(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Df(t){return t instanceof Error?t.message:String(t)}var GW,xv=E(()=>{"use strict";za();GW="local"});function Rv(t,e){t.get("/mailbox/workspace",n=>QW(n,e)),t.get("/mailbox/projects",n=>eq(n,e)),t.get("/mailbox/projects/:id",n=>tq(n,e)),t.post("/mailbox/projects",n=>nq(n,e)),t.patch("/mailbox/projects/:id",n=>rq(n,e)),t.delete("/mailbox/projects/:id",n=>sq(n,e)),t.post("/mailbox/projects/:project_id/prompts",n=>iq(n,e)),t.get("/mailbox/prompts/:id",n=>oq(n,e))}function QW(t,e){e.dal.ensureWorkspace({id:es,name:jf});let n=Ov(e.dal),r={id:es,name:jf,created_at:ZW,projects:n};return t.json({workspace:r})}function eq(t,e){return t.json({projects:Ov(e.dal)})}function tq(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Qr)){let s=Pf(e.dal,n);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:el(s)})}let r=Cv(e.dal,n);return r===null?t.json({project:null},404):t.json({project:Lv(r)})}async function nq(t,e){let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let r=n.input;if(r===void 0||typeof r!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof r.name!="string"||r.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof r.repo_path!="string"||r.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:es,name:jf});let s=e.dal.insertWebProject({workspace_id:es,name:r.name,repo_path:r.repo_path,config_json:r.config_json===void 0?null:JSON.stringify(r.config_json)});return t.json({project:el(s)},201)}async function rq(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input??{};if(n.startsWith(Qr)){let i=Pf(e.dal,n);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${n}`},404);let o=e.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?t.json({error:"project_not_found",message:`project not found: ${n}`},404):t.json({project:el(o)})}return t.json({error:"project_not_found",message:`project not found: ${n}`},404)}function sq(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Qr)){let r=Pf(e.dal,n);if(r===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(r.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function iq(t,e){let n=t.req.param("project_id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??n;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=Cv(e.dal,i);if(o===null)return t.json({error:"project_not_found",message:`project not found: ${i}`},404);if(e.dal.getWorkflowByName(o.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${zW}${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:o.id,source_ref:l,payload:c}):u=await aq({dal:e.dal,project_id:o.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.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:`${Qa}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function oq(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"prompt id required"},400);let r=lq(e.dal,n);return t.json({result:r})}function Ov(t){let e=t.listProjects().map(Lv),n=t.listWebProjectsActive(es).map(el);return[...e,...n].sort(yq)}function Lv(t){return{id:`${Qa}${t.id}`,workspace_id:es,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 el(t){let e={};if(t.config_json!==null)try{let n=JSON.parse(t.config_json);n!==null&&typeof n=="object"&&(e=n)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${Qr}${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 Pf(t,e){if(!e.startsWith(Qr))return null;let n=e.slice(Qr.length),r=Number.parseInt(n,10);return!Number.isFinite(r)||String(r)!==n?null:t.getWebProject(r)}function Cv(t,e){if(e.startsWith(Qa)){let r=e.slice(Qa.length),s=Number.parseInt(r,10);if(Number.isFinite(s)&&String(s)===r)return t.getProject(s)}let n=Number.parseInt(e,10);return Number.isFinite(n)&&String(n)===e?t.getProject(n):null}async function aq(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Xu(),zw));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function lq(t,e){let n=t.getPromptDispatch(e);if(n===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let r=t.getJob(n.job_id);if(r===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:n.job_id},duration_ms:null};let s=r.run_id===null?null:t.getRun(r.run_id),i=t.getProject(n.project_id),o=_q(t,i?.team_id??null),a=pq(s),l=hq(r,a,o.length>0),c=gq(n.created_at,s),u=i===null?{totalEstimatedMs:void 0,perStep:new Map}:cq(t,i.workflow_name),d=u.totalEstimatedMs,f=$v(n.created_at),m=i?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:dq(t,s.id),_=uq(s,a,h,u.perStep,o),y=fq(h,u.perStep),g=mq(_,y,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,...Za(d,f),...g},errors_json:{error:r.last_error??"job_failed",job_id:r.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(n.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:n.text,...Za(d,f),...g},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,paused_step:a,attention_needed:o,...Za(d,f),...g},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,...Za(d,f),...g},errors_json:null,duration_ms:c}}function cq(t,e){let n={totalEstimatedMs:void 0,perStep:new Map},r=t.getWorkflowByName(e);if(r===null)return n;let s;try{s=JSON.parse(r.definition)}catch{return n}if(s===null||typeof s!="object")return n;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let 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(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let 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:o,perStep:a}}function dq(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function uq(t,e,n,r,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...n].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=r.get(i),c=l?.name??i,u=$v(a),d={id:i,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 fq(t,e){let n=[];for(let r of t){if(r.ended_at===null)continue;let s=Date.parse(r.started_at),i=Date.parse(r.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=e.get(r.state_name)?.name??r.state_name,l=r.outcome==="failed"?"failed":"done";n.push({id:r.state_name,name:a,duration_ms:o,status:l})}return n}function mq(t,e,n,r,s,i){let o={completed_steps:e,total_elapsed_ms:r};return t!==void 0&&(o.current_step=t),n!==void 0&&(o.total_estimated_ms=n),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function $v(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Za(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function pq(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let n="__paused__:";return e.startsWith(n)?e.slice(n.length):null}function _q(t,e){if(e===null)return[];let n;try{n=t.listTeamMembers(e)}catch{return[]}return n.filter(r=>r.state==="attention_needed").map(r=>({alias:r.alias,reason:r.state_reason}))}function hq(t,e,n){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||n||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function gq(t,e){let n=Date.parse(t);if(Number.isNaN(n))return null;let r=e?.ended_at??null,s=r===null?Date.now():Date.parse(r);return Number.isNaN(s)?null:Math.max(0,s-n)}function yq(t,e){let n=Date.parse(t.last_active_at??""),r=Date.parse(e.last_active_at??""),s=(Number.isNaN(r)?0:r)-(Number.isNaN(n)?0:n);return s===0?t.name.localeCompare(e.name):s}var Qa,Qr,zW,es,jf,ZW,Mv=E(()=>{"use strict";Qa="project:",Qr="web_project:",zW="prompt:",es="default",jf="Default workspace",ZW=new Date(0).toISOString()});import{Buffer as Dv}from"node:buffer";function jv(t,e,n){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let r=Number(e);if(Number.isFinite(r)&&r>0)return r}return n}function Pv(t){return Tq[t]}function Fv(t){let e=t.trim();if(e==="")return;let n=e.split(/\s+/),r=n.shift();if(!(r===void 0||r===""))return{cmd:r,args:n}}var wq,Eq,tl,Tq,Ff=E(()=>{"use strict";wq=1e4,Eq=256*1024,tl=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=jv(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,wq),this.pushByteCap=jv(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,Eq),this.timers=e.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let n=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}),r={session_id:e.session_id,pty:n,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,r),n.onData(s=>{this.onPtyData(r,s)}),n.onExit(s=>{this.onPtyExit(r,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${n.pid} cmd=${e.command}`),{pid:n.pid}}endSession(e){let n=this.sessions.get(e);if(n!==void 0)try{n.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let n=this.sessions.get(e.session_id);if(n===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{n.pty.write(e.data)}catch(r){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${r instanceof Error?r.message:String(r)}`)}}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,n){if(!e.closed){if(e.pendingOutput.push(n),e.pendingBytes+=Dv.byteLength(n,"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,n){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let r=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:r,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${n} bytes=${Dv.byteLength(r,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,n){if(e.closed)return;await this.flush(e,"pty_exit");let r=`\r
2229
+ `)}function DW(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function lt(t){return typeof t=="string"?t:""}function jW(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 Nf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ba(t,e){return Number(t.req.param(e))}var Xa,Af,Tv=E(()=>{"use strict";Ha();un();rf();Xa=[{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."}],Af=Xa.map(t=>t.name)});function FW(t){return t.replace(/^\/+/,"")}function vv(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Zr(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=FW(t.mailboxKey),n=e.lastIndexOf("/");return(n>=0?e.slice(n+1):e).includes(".")&&(e=n>=0?e.slice(0,n+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return vv(t.userId)&&vv(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${PW}/${t.identityId}/`}function WW(t){return String(Math.max(0,Math.floor(t))).padStart(UW,"0")}function Of(t,e,n){return`${t}${e}${WW(n)}.json`}function Ja(t,e){return`${t}${e}`}function Ga(t,e,n){let r=`${e}${n}`;if(!t.startsWith(r))return;let s=t.slice(r.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var PW,UW,Ka=E(()=>{"use strict";PW="mailbox";UW=12});function hn(t,e){let n=Math.floor(t),r="",s=n;for(let u=0;u<12;u++)r=Va[s&15]+r,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let u=0;u<3;u++)o=Va[a&15]+o,a=a>>4;let l=Va[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Va[Math.floor(e()*16)&15];return r.slice(0,8)+"-"+r.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Va,Ya=E(()=>{"use strict";Va="0123456789abcdef"});function Cf(t,e){return!Number.isFinite(t)||t<=0?e:t}function $f(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 Nv(t){return t.conversation_id===Iv&&BW(t.payload)}function BW(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function XW(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Nv(t)?t.timestamp:void 0;if(e===void 0)return;let n=Date.parse(e);return Number.isFinite(n)?n:void 0}var Sv,bv,kv,qW,Iv,HW,Lf,fr,za=E(()=>{"use strict";Ka();Ya();Sv=3e3,bv=1e4,kv=12e3,qW=1e3,Iv="__lmctl_heartbeat__",HW={kind:"heartbeat"},Lf={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},fr=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=Zr({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=Cf(e.readIntervalMs??e.pollIntervalMs??Sv,Sv),this.heartbeatIdleMs=Cf(e.heartbeatIdleMs??bv,bv),this.backoffReadIntervalMs=Cf(e.backoffReadIntervalMs??e.pollIntervalMs??kv,kv)}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??Lf;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 n=Ja(this.basePrefix,e),r=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:n,MaxKeys:qW,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Ga(o.Key??"",this.basePrefix,e);a!==void 0&&a>r&&(r=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return r}async putEnvelope(e,n){let r=this.writeChain.then(()=>this.doPut(e,n));return this.writeChain=r.catch(()=>{}),r}async doPut(e,n){await this.ensureBootstrapped();let r=(this.opts.now??Date.now)(),s=new Date(r).toISOString(),i={message_id:hn(r,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:n},o=(this.ownSeq??0)+1,a=Of(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(r),a}scheduleNextTick(e){if(this.stopRequested)return;let n=this.opts.timers??Lf;this.timerHandle=n.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,n=Of(this.basePrefix,this.peerStream,e),r;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:n}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${n}: empty body`),"get"),this.advanceCursor(e);continue}r=await i.Body.transformToString("utf-8")}catch(i){if($f(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(r)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Nv(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"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 n=XW(e);n!==void 0&&(this.lastPeerHeartbeatMs=n)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let n=this.opts.timers??Lf;this.heartbeatTimerHandle!==null&&n.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=n.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 n=e-this.lastWriteMs;if(n<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-n);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Iv,HW)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(n){this.emitError(n,"handle")}}emitError(e,n){if(this.opts.onError!==void 0)try{this.opts.onError(e,n)}catch{}else console.error(`SequentialMailboxClient[${n}]`,e)}}});import{getConnInfo as JW}from"@hono/node-server/conninfo";function Av(t,e){let n=e.bucket??GW,r=e.remoteAddressOf??(i=>VW(i)),s=i=>{let o=r(i);return YW(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Mf(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:n,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return $f(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Df(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Mf(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:n,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Df(c)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Mf(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=KW(i.req.query("maxKeys")),u=i.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:n,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return i.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 i.json({error:"internal",message:Df(d)},500)}})}function Mf(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let n=t.replace(/^\/+/,"");return n.split("/").includes("..")?{error:"key must not contain '..'"}:n}function KW(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function VW(t){try{return JW(t).remote.address}catch{return}}function YW(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Df(t){return t instanceof Error?t.message:String(t)}var GW,xv=E(()=>{"use strict";za();GW="local"});function Rv(t,e){t.get("/mailbox/workspace",n=>QW(n,e)),t.get("/mailbox/projects",n=>eq(n,e)),t.get("/mailbox/projects/:id",n=>tq(n,e)),t.post("/mailbox/projects",n=>nq(n,e)),t.patch("/mailbox/projects/:id",n=>rq(n,e)),t.delete("/mailbox/projects/:id",n=>sq(n,e)),t.post("/mailbox/projects/:project_id/prompts",n=>iq(n,e)),t.get("/mailbox/prompts/:id",n=>oq(n,e))}function QW(t,e){e.dal.ensureWorkspace({id:es,name:jf});let n=Ov(e.dal),r={id:es,name:jf,created_at:ZW,projects:n};return t.json({workspace:r})}function eq(t,e){return t.json({projects:Ov(e.dal)})}function tq(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Qr)){let s=Pf(e.dal,n);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:el(s)})}let r=Cv(e.dal,n);return r===null?t.json({project:null},404):t.json({project:Lv(r)})}async function nq(t,e){let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let r=n.input;if(r===void 0||typeof r!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof r.name!="string"||r.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof r.repo_path!="string"||r.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:es,name:jf});let s=e.dal.insertWebProject({workspace_id:es,name:r.name,repo_path:r.repo_path,config_json:r.config_json===void 0?null:JSON.stringify(r.config_json)});return t.json({project:el(s)},201)}async function rq(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input??{};if(n.startsWith(Qr)){let i=Pf(e.dal,n);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${n}`},404);let o=e.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?t.json({error:"project_not_found",message:`project not found: ${n}`},404):t.json({project:el(o)})}return t.json({error:"project_not_found",message:`project not found: ${n}`},404)}function sq(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Qr)){let r=Pf(e.dal,n);if(r===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(r.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function iq(t,e){let n=t.req.param("project_id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??n;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=Cv(e.dal,i);if(o===null)return t.json({error:"project_not_found",message:`project not found: ${i}`},404);if(e.dal.getWorkflowByName(o.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${zW}${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:o.id,source_ref:l,payload:c}):u=await aq({dal:e.dal,project_id:o.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.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:`${Qa}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function oq(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"prompt id required"},400);let r=lq(e.dal,n);return t.json({result:r})}function Ov(t){let e=t.listProjects().map(Lv),n=t.listWebProjectsActive(es).map(el);return[...e,...n].sort(yq)}function Lv(t){return{id:`${Qa}${t.id}`,workspace_id:es,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 el(t){let e={};if(t.config_json!==null)try{let n=JSON.parse(t.config_json);n!==null&&typeof n=="object"&&(e=n)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${Qr}${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 Pf(t,e){if(!e.startsWith(Qr))return null;let n=e.slice(Qr.length),r=Number.parseInt(n,10);return!Number.isFinite(r)||String(r)!==n?null:t.getWebProject(r)}function Cv(t,e){if(e.startsWith(Qa)){let r=e.slice(Qa.length),s=Number.parseInt(r,10);if(Number.isFinite(s)&&String(s)===r)return t.getProject(s)}let n=Number.parseInt(e,10);return Number.isFinite(n)&&String(n)===e?t.getProject(n):null}async function aq(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Xu(),zw));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function lq(t,e){let n=t.getPromptDispatch(e);if(n===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let r=t.getJob(n.job_id);if(r===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:n.job_id},duration_ms:null};let s=r.run_id===null?null:t.getRun(r.run_id),i=t.getProject(n.project_id),o=_q(t,i?.team_id??null),a=pq(s),l=hq(r,a,o.length>0),c=gq(n.created_at,s),u=i===null?{totalEstimatedMs:void 0,perStep:new Map}:cq(t,i.workflow_name),d=u.totalEstimatedMs,f=$v(n.created_at),m=i?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:dq(t,s.id),_=uq(s,a,h,u.perStep,o),y=fq(h,u.perStep),g=mq(_,y,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,...Za(d,f),...g},errors_json:{error:r.last_error??"job_failed",job_id:r.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(n.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:n.text,...Za(d,f),...g},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,paused_step:a,attention_needed:o,...Za(d,f),...g},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,...Za(d,f),...g},errors_json:null,duration_ms:c}}function cq(t,e){let n={totalEstimatedMs:void 0,perStep:new Map},r=t.getWorkflowByName(e);if(r===null)return n;let s;try{s=JSON.parse(r.definition)}catch{return n}if(s===null||typeof s!="object")return n;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let 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(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let 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:o,perStep:a}}function dq(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function uq(t,e,n,r,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...n].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=r.get(i),c=l?.name??i,u=$v(a),d={id:i,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 fq(t,e){let n=[];for(let r of t){if(r.ended_at===null)continue;let s=Date.parse(r.started_at),i=Date.parse(r.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=e.get(r.state_name)?.name??r.state_name,l=r.outcome==="failed"?"failed":"done";n.push({id:r.state_name,name:a,duration_ms:o,status:l})}return n}function mq(t,e,n,r,s,i){let o={completed_steps:e,total_elapsed_ms:r};return t!==void 0&&(o.current_step=t),n!==void 0&&(o.total_estimated_ms=n),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function $v(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Za(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function pq(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let n="__paused__:";return e.startsWith(n)?e.slice(n.length):null}function _q(t,e){if(e===null)return[];let n;try{n=t.listTeamMembers(e)}catch{return[]}return n.filter(r=>r.state==="attention_needed").map(r=>({alias:r.alias,reason:r.state_reason}))}function hq(t,e,n){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||n||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function gq(t,e){let n=Date.parse(t);if(Number.isNaN(n))return null;let r=e?.ended_at??null,s=r===null?Date.now():Date.parse(r);return Number.isNaN(s)?null:Math.max(0,s-n)}function yq(t,e){let n=Date.parse(t.last_active_at??""),r=Date.parse(e.last_active_at??""),s=(Number.isNaN(r)?0:r)-(Number.isNaN(n)?0:n);return s===0?t.name.localeCompare(e.name):s}var Qa,Qr,zW,es,jf,ZW,Mv=E(()=>{"use strict";Qa="project:",Qr="web_project:",zW="prompt:",es="default",jf="Default workspace",ZW=new Date(0).toISOString()});import{Buffer as Dv}from"node:buffer";function jv(t,e,n){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let r=Number(e);if(Number.isFinite(r)&&r>0)return r}return n}function Pv(t){return Tq[t]}function Fv(t){let e=t.trim();if(e==="")return;let n=e.split(/\s+/),r=n.shift();if(!(r===void 0||r===""))return{cmd:r,args:n}}var wq,Eq,tl,Tq,Ff=E(()=>{"use strict";wq=1e4,Eq=256*1024,tl=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=jv(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,wq),this.pushByteCap=jv(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,Eq),this.timers=e.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let n=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}),r={session_id:e.session_id,pty:n,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,r),n.onData(s=>{this.onPtyData(r,s)}),n.onExit(s=>{this.onPtyExit(r,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${n.pid} cmd=${e.command}`),{pid:n.pid}}endSession(e){let n=this.sessions.get(e);if(n!==void 0)try{n.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let n=this.sessions.get(e.session_id);if(n===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{n.pty.write(e.data)}catch(r){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${r instanceof Error?r.message:String(r)}`)}}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,n){if(!e.closed){if(e.pendingOutput.push(n),e.pendingBytes+=Dv.byteLength(n,"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,n){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let r=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:r,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${n} bytes=${Dv.byteLength(r,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,n){if(e.closed)return;await this.flush(e,"pty_exit");let r=`\r
2230
2230
  [process exited with code ${n.exitCode}${n.signal!==void 0?` signal ${n.signal}`:""}]\r
2231
2231
  `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:r,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${i instanceof Error?i.message:String(i)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};Tq={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:[]},kimi:{cmd:"kimi",args:["--auto"]}}});function Wv(t,e){t.post("/mailbox/terminal/launch",n=>vq(n,e)),t.post("/mailbox/terminal/end/:session_id",n=>Sq(n,e)),t.get("/mailbox/terminal/sessions",n=>bq(n,e))}async function vq(t,e){let n=e.terminalSessionManager;if(n===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.session_id;if(typeof s!="string"||!Uv.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=r.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof r.command_line=="string"&&r.command_line.trim()!==""){if(o=Fv(r.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Pv(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=n.startSession({session_id:s,command:o.cmd,args:o.args,...typeof r.cwd=="string"&&r.cwd!==""?{cwd:r.cwd}:{}});return t.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function Sq(t,e){let n=e.terminalSessionManager;if(n===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let r=t.req.param("session_id");return r===void 0||!Uv.test(r)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(n.endSession(r),t.json({session_id:r,ended:!0}))}function bq(t,e){let n=e.terminalSessionManager;return n===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:n.listSessions()})}var Uv,qv=E(()=>{"use strict";Ff();Uv=/^[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 kq}from"node:buffer";function Aq(t){try{return kq.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function Hv(t,e,n){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let r=Number(e);if(Number.isFinite(r)&&r>0)return r}return n}function Bv(t){return xq[t]}function Xv(t){let e=t.trim();if(e==="")return;let n=[],r=0;for(;r<e.length;){let i=e[r];if(i===" "||i===" "){r+=1;continue}if(i==='"'){let a=r+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;n.push(l),r=a+1;continue}let o=r;for(;o<e.length&&e[o]!==" "&&e[o]!==" ";)o+=1;n.push(e.slice(r,o)),r=o}if(n.length===0)return;let s=n.shift();if(!(s===void 0||s===""))return{cmd:s,args:n}}var Iq,Nq,nl,xq,Uf=E(()=>{"use strict";Iq=2e3,Nq=64*1024,nl=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Hv(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,Iq),this.pushByteCap=Hv(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,Nq),this.timers=e.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let n=this.opts.adapterFactory(e.provider),r={session_id:e.session_id,provider:e.provider,adapter:n,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,r);let s=this.makeAdapterContext(r);try{let i=await n.start(e,s);return r.child=i,this.wireChildExit(r,i),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(e.session_id),i}}async endSession(e){let n=this.sessions.get(e);if(n!==void 0){n.generation+=1;try{await n.adapter.stop()}catch{}if(n.child!==void 0)try{n.child.kill("SIGTERM")}catch{}await this.flush(n,"session_end"),n.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let n=this.sessions.get(e.session_id);if(n===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let r=e.user_input??"";if(r!=="")try{await n.adapter.sendTurn(r)}catch(s){let i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${i}`),this.appendEvent(n,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}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 n=this.sessions.get(e);n!==void 0&&(n.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 n=e.generation,r=this;return{generation:n,currentGeneration(){return e.generation},emit(s){n===e.generation&&(e.closed||r.appendEvent(e,s))},...r.opts.log!==void 0?{log:r.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,n){e.pendingEvents.push(n);let r=Aq(n);if(e.pendingBytes+=r,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,n){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let r=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:r,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${n} events=${r.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(e,n){let r=e.generation;n.on("exit",(s,i)=>{r===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),n.on("error",s=>{r===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};xq={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"]},kimi:{cmd:"kimi",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function Gv(t,e){t.post("/mailbox/chat/launch",n=>Rq(n,e)),t.post("/mailbox/chat/end/:session_id",n=>Oq(n,e)),t.get("/mailbox/chat/sessions",n=>Lq(n,e))}async function Rq(t,e){let n=e.persistentSessionManager;if(n===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.session_id;if(typeof s!="string"||!Jv.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=r.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof r.command_line=="string"&&r.command_line.trim()!==""){if(o=Xv(r.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Bv(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await n.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof r.cwd=="string"&&r.cwd!==""?{cwd:r.cwd}:{}});return t.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?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 Oq(t,e){let n=e.persistentSessionManager;if(n===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let r=t.req.param("session_id");return r===void 0||!Jv.test(r)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await n.endSession(r),t.json({session_id:r,ended:!0}))}function Lq(t,e){let n=e.persistentSessionManager;return n===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:n.listSessions()})}var Jv,Kv=E(()=>{"use strict";Uf();Jv=/^[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 Cq}from"node:fs";function Yv(t){let e=t.artifacts.find(n=>n.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Vv(e.content);if(e?.path===void 0||e.path===null)return[];try{let n=Cq(e.path,{encoding:"utf8"});return Vv(n)}catch{return[]}}function Vv(t){let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);return e.length===0?[]:e.map(n=>{let r=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(n);return r===null?{role:"transcript",text:n}:{role:r[1].toLowerCase(),text:r[2]}})}var zv=E(()=>{"use strict"});function Zv(t,e,n){let r=t.getRun(e);if(r===null)return{err:`run ${e}: not found`};if(n!==void 0){let l=t.findTeamMemberByAlias(r.team_id,n);return l===null?{err:`run ${e}: team has no member alias "${n}"`}: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(r.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 o=t.listTeamMembers(r.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=o[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function rl(t,e){let n=t.query(`SELECT id, kind FROM attention
2232
2232
  WHERE run_id = ?
2233
2233
  AND acknowledged_at IS NULL
2234
2234
  AND requires_user = 1
2235
- ORDER BY id DESC LIMIT 1`,e);return n.length===0?null:{kind:n[0].kind,attention_id:n[0].id}}var sl=E(()=>{"use strict"});function lS(t,e){t.all("/runtime/*",n=>$q(n.req.raw,e))}async function $q(t,e){try{return Response.json(await Mq(t,e))}catch(n){if(n instanceof me)return Response.json({error:n.message},{status:n.status});let r=n instanceof Error?n.message:String(n);return Response.json({error:r},{status:500})}}async function Mq(t,e){let n=new URL(t.url),r=qq(e),s=n.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&n.pathname==="/runtime/workspaces")return Wf(t),[{id:r.id,name:r.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return il(t,r.id,s[2]),Dq(e.dal,r);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){il(t,r.id,s[2]);let i=eS(e.dal,s[4]);return Qv(e.dal,r,i)}if(t.method==="GET"&&n.pathname==="/runtime/lead-teams")return Wf(t),e.dal.listTeams().map(i=>Wq(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=tS(e.dal,nS(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new me(400,"runtime lead chat body does not match route team");return sS(t,r.id,o.context),rS(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=tS(e.dal,nS(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new me(400,"runtime lead message body does not match route team");sS(t,r.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new me(400,"runtime lead message requires draft.body");return rS(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){il(t,r.id,s[2]);let i=eS(e.dal,s[4]),o=await t.json();if(o.workspaceId!==r.id||o.projectId!==i.name)throw new me(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new me(400,"runtime workflow message requires draft.body");return Fq(e.dal,i,a),Qv(e.dal,r,i)}if(t.method==="GET"&&n.pathname==="/runtime/templates")return pi(t,r.id),e.dal.listWorkflows().map(i=>Hq(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){pi(t,r.id);let i=Xq(e.dal,s[2]);return Bq(i)}if(t.method==="GET"&&n.pathname==="/runtime/runs"){pi(t,r.id);let i=n.searchParams.get("project"),o=n.searchParams.get("template");if(i!==null&&o!==null)throw new me(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return Jq(e.dal,i,o).map(l=>oS(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){pi(t,r.id);let i=iS(e.dal,s[2]);return oS(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){pi(t,r.id);let i=iS(e.dal,s[2]),o=Kq(e.dal,i);return{runId:Jf(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new me(404,`unknown runtime request: ${t.method} ${n.pathname}`)}function Dq(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(n=>cS(t,e,n))}}function Qv(t,e,n){let r=cS(t,e,n);return{...r,managedWorkflow:{...r.managedWorkflow,instance:jq(t,n),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${n.workflow_name}`,templateId:`template:${n.workflow_name}`,runId:r.managedWorkflow.runId}},workflowMessages:Pq(t,n)}}function cS(t,e,n){let r=dS(t,n.id),s=Hf(r);return{id:n.name,workspaceId:e.id,name:n.name,...n.description===null?{}:{description:n.description},status:s,managedWorkflow:{templateId:`template:${n.workflow_name}`,templateName:n.workflow_name,runId:r===null?`project:${n.id}:no-run`:`run:${r.id}`,status:s}}}function jq(t,e){let n=dS(t,e.id),r=n?.current_state??null;return{id:n===null?`project:${e.id}:no-run`:`run:${n.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:Hf(n),currentStepIds:r===null?[]:[r],...n?.started_at===void 0?{}:{createdAt:n.started_at},...n?.ended_at===null||n?.ended_at===void 0?{}:{updatedAt:n.ended_at}}}function Pq(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(r=>({id:`attention:${r.id}`,role:"event",author:"lmctl",timestamp:r.created_at,body:r.kind}))}function Fq(t,e,n){let r=Uq(t,e.id);if(r!==null){let s=rl(t,r.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,n);if(!i.resumed)throw new me(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Yt(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new me(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,n,!0);if(!o.resumed)throw new me(409,`interactive resume failed: ${o.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:n}),priority:0})}function dS(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 Uq(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 Hf(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 eS(t,e){let n=t.findProjectByName(e);if(n===null)throw new me(404,`project not found: ${e}`);return n}function tS(t,e){let n=t.listTeams().find(r=>r.name===e);if(n===void 0)throw new me(404,`team not found: ${e}`);return n}function nS(t){return t.startsWith("team:")?t.slice(5):t}function Wq(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function rS(t,e,n){let r=new Date().toISOString(),s=n===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:r,body:n},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:r,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??aS}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function qq(t){let e=t.workspaceName??"default";return{id:e,name:e}}function Wf(t){if(t.headers.get("x-lmctl-workspace-id")!==aS)throw new me(400,"runtime request requires global-admin workspace identity")}function il(t,e,n){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new me(400,"runtime request requires workspace identity");if(n!==e||r!==e)throw new me(400,"runtime workspace identity does not match route")}function pi(t,e){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new me(400,"runtime request requires workspace identity");if(n!==e)throw new me(400,"runtime workspace identity does not match server workspace")}function sS(t,e,n){if(n?.scope==="workspace"){if(n.workspaceId===void 0)throw new me(400,"workspace manager context requires workspace identity");il(t,e,n.workspaceId);return}Wf(t)}function Bf(t){return`${ts}${Xf(t.name)}`}function Xf(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Jf(t){return`${qf}${t.id}`}function Hq(t){let e=ol(t.definition);return{id:Bf(t),name:t.name,...e.description===null?{}:{description:e.description}}}function Bq(t){let e=ol(t.definition);return{id:Bf(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ol(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 n=e,r=typeof n.description=="string"?n.description:null,s=[],i=new Map;if(n.schema_version==="lmctl/v3"&&Array.isArray(n.steps)){let o=typeof n.entry_step_id=="string"?n.entry_step_id:null;for(let a of n.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:r,graph:e,stepIds:s,nameToId:i}}function Xq(t,e){if(!e.startsWith(ts))throw new me(404,`template not found: ${e}`);let n=e.slice(ts.length),r=t.listWorkflows().filter(s=>Xf(s.name)===n);if(r.length===0)throw new me(404,`template not found: ${e}`);if(r.length>1){let s=r.map(i=>i.name).join(", ");throw new me(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return r[0]}function iS(t,e){if(!e.startsWith(qf))throw new me(404,`run not found: ${e}`);let n=e.slice(qf.length);if(!/^[1-9]\d*$/.test(n))throw new me(404,`run not found: ${e}`);let r=Number.parseInt(n,10);if(!Number.isFinite(r)||r<=0||String(r)!==n)throw new me(404,`run not found: ${e}`);let s=t.getRun(r);if(s===null)throw new me(404,`run not found: ${e}`);return s}function Jq(t,e,n){if(n!==null){if(!n.startsWith(ts))return[];let s=n.slice(ts.length),i=t.listWorkflows().filter(a=>Xf(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let r=t.findProjectByName(e);return r===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",r.id)}function oS(t,e){let n=t.getWorkflow(e.workflow_id),r=Hf(e),s=Gq(n,e);return{id:Jf(e),templateId:n===null?`${ts}unknown`:Bf(n),label:n===null?`run ${e.id}`:`${n.name} #${e.id}`,status:r,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function Gq(t,e){if(e.current_state===null)return[];let n=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[n]:[ol(t.definition).nameToId.get(n)??n]}function Kq(t,e){let n=t.getWorkflow(e.workflow_id),r=n===null?{stepIds:[],nameToId:new Map}:ol(n.definition),s=c=>r.nameToId.get(c)??c,i=Jf(e),o=[];o.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(o.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=Vq(c);o.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&&o.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{}o.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";o.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return o.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),o.map((c,u)=>({id:`${i}:evt:${u+1}`,runId:i,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 Vq(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 aS,ts,qf,me,uS=E(()=>{"use strict";sl();un();aS="global-admin";ts="template:",qf="run:";me=class extends Error{status;constructor(e,n){super(n),this.status=e}}});import{mkdirSync as Yq,writeFileSync as zq}from"node:fs";import{randomUUID as fS}from"node:crypto";import{dirname as Zq,resolve as al,sep as mS}from"node:path";async function _S(t,e){let n;try{n=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let r=n.image;if(!rH(r))return t.text("missing image file",400);if(r.size>Qq)return t.text("upload too large",413);let s=Buffer.from(await r.arrayBuffer()),i=sH(s);if(i===null||!(i in pS))return t.text("unsupported upload MIME type",415);if(r.type.length>0&&r.type!==i)return t.text("upload MIME type does not match file content",415);let o=eH(e,n.project);if(typeof o=="string")return t.text(o,404);let a=o===null?al(nH()):al(o.local_path),l=al(a,"uploads",fS()),c=al(l,`${fS()}${pS[i]}`);if(!tH(c,a))return t.text("invalid upload path",400);Yq(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);zq(c,u);let d={path:c,size:s.byteLength,mime:i,project:o?.name??null};return t.json(d)}function eH(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function tH(t,e){let n=e.endsWith(mS)?e:`${e}${mS}`;return t.startsWith(n)}function nH(){return Zq(Q())}function rH(t){return typeof File<"u"&&t instanceof File}function sH(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 Qq,pS,hS=E(()=>{"use strict";qe();Qq=10*1024*1024,pS={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ll}from"node:fs";import{basename as iH,dirname as oH,extname as aH,isAbsolute as lH,join as cH,relative as dH}from"node:path";import{fileURLToPath as uH}from"node:url";import{Hono as fH}from"hono";import{serveStatic as Zt}from"@hono/node-server/serve-static";function SS(t){let e=new fH,n=[],r=t.localWebui!==void 0?Kf(t.localWebui.webuiDir):mH();if(t.localWebui!==void 0&&Av(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),r!==null){let s=pH();t.localWebui!==void 0?e.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,i=>i.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,Zt({root:r})),e.use("/vendor/*",s,Zt({root:r})),e.use("/src/*",s,Zt({root:r})),e.get("/",s,Zt({root:r,path:"index.html"})),e.get("/admin",s,Zt({root:r,path:"index.html"})),e.get("/admin/*",s,Zt({root:r,path:"index.html"})),e.get("/terminal",s,Zt({root:r,path:"index.html"})),e.get("/terminal/*",s,Zt({root:r,path:"index.html"})),e.get("/chat",s,Zt({root:r,path:"index.html"})),e.get("/chat/*",s,Zt({root:r,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("*",sE({disabled:t.authDisabled})),e.get("/login",s=>s.html(Fe("Login",`
2235
+ ORDER BY id DESC LIMIT 1`,e);return n.length===0?null:{kind:n[0].kind,attention_id:n[0].id}}var sl=E(()=>{"use strict"});function lS(t,e){t.all("/runtime/*",n=>$q(n.req.raw,e))}async function $q(t,e){try{return Response.json(await Mq(t,e))}catch(n){if(n instanceof me)return Response.json({error:n.message},{status:n.status});let r=n instanceof Error?n.message:String(n);return Response.json({error:r},{status:500})}}async function Mq(t,e){let n=new URL(t.url),r=qq(e),s=n.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&n.pathname==="/runtime/workspaces")return Wf(t),[{id:r.id,name:r.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return il(t,r.id,s[2]),Dq(e.dal,r);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){il(t,r.id,s[2]);let i=eS(e.dal,s[4]);return Qv(e.dal,r,i)}if(t.method==="GET"&&n.pathname==="/runtime/lead-teams")return Wf(t),e.dal.listTeams().map(i=>Wq(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=tS(e.dal,nS(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new me(400,"runtime lead chat body does not match route team");return sS(t,r.id,o.context),rS(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=tS(e.dal,nS(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new me(400,"runtime lead message body does not match route team");sS(t,r.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new me(400,"runtime lead message requires draft.body");return rS(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){il(t,r.id,s[2]);let i=eS(e.dal,s[4]),o=await t.json();if(o.workspaceId!==r.id||o.projectId!==i.name)throw new me(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new me(400,"runtime workflow message requires draft.body");return Fq(e.dal,i,a),Qv(e.dal,r,i)}if(t.method==="GET"&&n.pathname==="/runtime/templates")return pi(t,r.id),e.dal.listWorkflows().map(i=>Hq(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){pi(t,r.id);let i=Xq(e.dal,s[2]);return Bq(i)}if(t.method==="GET"&&n.pathname==="/runtime/runs"){pi(t,r.id);let i=n.searchParams.get("project"),o=n.searchParams.get("template");if(i!==null&&o!==null)throw new me(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return Jq(e.dal,i,o).map(l=>oS(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){pi(t,r.id);let i=iS(e.dal,s[2]);return oS(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){pi(t,r.id);let i=iS(e.dal,s[2]),o=Kq(e.dal,i);return{runId:Jf(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new me(404,`unknown runtime request: ${t.method} ${n.pathname}`)}function Dq(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(n=>cS(t,e,n))}}function Qv(t,e,n){let r=cS(t,e,n);return{...r,managedWorkflow:{...r.managedWorkflow,instance:jq(t,n),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${n.workflow_name}`,templateId:`template:${n.workflow_name}`,runId:r.managedWorkflow.runId}},workflowMessages:Pq(t,n)}}function cS(t,e,n){let r=dS(t,n.id),s=Hf(r);return{id:n.name,workspaceId:e.id,name:n.name,...n.description===null?{}:{description:n.description},status:s,managedWorkflow:{templateId:`template:${n.workflow_name}`,templateName:n.workflow_name,runId:r===null?`project:${n.id}:no-run`:`run:${r.id}`,status:s}}}function jq(t,e){let n=dS(t,e.id),r=n?.current_state??null;return{id:n===null?`project:${e.id}:no-run`:`run:${n.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:Hf(n),currentStepIds:r===null?[]:[r],...n?.started_at===void 0?{}:{createdAt:n.started_at},...n?.ended_at===null||n?.ended_at===void 0?{}:{updatedAt:n.ended_at}}}function Pq(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(r=>({id:`attention:${r.id}`,role:"event",author:"lmctl",timestamp:r.created_at,body:r.kind}))}function Fq(t,e,n){let r=Uq(t,e.id);if(r!==null){let s=rl(t,r.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,n);if(!i.resumed)throw new me(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Yt(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new me(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,n,!0);if(!o.resumed)throw new me(409,`interactive resume failed: ${o.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:n}),priority:0})}function dS(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 Uq(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 Hf(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 eS(t,e){let n=t.findProjectByName(e);if(n===null)throw new me(404,`project not found: ${e}`);return n}function tS(t,e){let n=t.listTeams().find(r=>r.name===e);if(n===void 0)throw new me(404,`team not found: ${e}`);return n}function nS(t){return t.startsWith("team:")?t.slice(5):t}function Wq(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function rS(t,e,n){let r=new Date().toISOString(),s=n===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:r,body:n},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:r,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??aS}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function qq(t){let e=t.workspaceName??"default";return{id:e,name:e}}function Wf(t){if(t.headers.get("x-lmctl-workspace-id")!==aS)throw new me(400,"runtime request requires global-admin workspace identity")}function il(t,e,n){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new me(400,"runtime request requires workspace identity");if(n!==e||r!==e)throw new me(400,"runtime workspace identity does not match route")}function pi(t,e){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new me(400,"runtime request requires workspace identity");if(n!==e)throw new me(400,"runtime workspace identity does not match server workspace")}function sS(t,e,n){if(n?.scope==="workspace"){if(n.workspaceId===void 0)throw new me(400,"workspace manager context requires workspace identity");il(t,e,n.workspaceId);return}Wf(t)}function Bf(t){return`${ts}${Xf(t.name)}`}function Xf(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Jf(t){return`${qf}${t.id}`}function Hq(t){let e=ol(t.definition);return{id:Bf(t),name:t.name,...e.description===null?{}:{description:e.description}}}function Bq(t){let e=ol(t.definition);return{id:Bf(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ol(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 n=e,r=typeof n.description=="string"?n.description:null,s=[],i=new Map;if(n.schema_version==="lmctl/v3"&&Array.isArray(n.steps)){let o=typeof n.entry_step_id=="string"?n.entry_step_id:null;for(let a of n.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:r,graph:e,stepIds:s,nameToId:i}}function Xq(t,e){if(!e.startsWith(ts))throw new me(404,`template not found: ${e}`);let n=e.slice(ts.length),r=t.listWorkflows().filter(s=>Xf(s.name)===n);if(r.length===0)throw new me(404,`template not found: ${e}`);if(r.length>1){let s=r.map(i=>i.name).join(", ");throw new me(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return r[0]}function iS(t,e){if(!e.startsWith(qf))throw new me(404,`run not found: ${e}`);let n=e.slice(qf.length);if(!/^[1-9]\d*$/.test(n))throw new me(404,`run not found: ${e}`);let r=Number.parseInt(n,10);if(!Number.isFinite(r)||r<=0||String(r)!==n)throw new me(404,`run not found: ${e}`);let s=t.getRun(r);if(s===null)throw new me(404,`run not found: ${e}`);return s}function Jq(t,e,n){if(n!==null){if(!n.startsWith(ts))return[];let s=n.slice(ts.length),i=t.listWorkflows().filter(a=>Xf(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let r=t.findProjectByName(e);return r===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",r.id)}function oS(t,e){let n=t.getWorkflow(e.workflow_id),r=Hf(e),s=Gq(n,e);return{id:Jf(e),templateId:n===null?`${ts}unknown`:Bf(n),label:n===null?`run ${e.id}`:`${n.name} #${e.id}`,status:r,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function Gq(t,e){if(e.current_state===null)return[];let n=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[n]:[ol(t.definition).nameToId.get(n)??n]}function Kq(t,e){let n=t.getWorkflow(e.workflow_id),r=n===null?{stepIds:[],nameToId:new Map}:ol(n.definition),s=c=>r.nameToId.get(c)??c,i=Jf(e),o=[];o.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(o.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=Vq(c);o.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&&o.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{}o.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";o.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return o.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),o.map((c,u)=>({id:`${i}:evt:${u+1}`,runId:i,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 Vq(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 aS,ts,qf,me,uS=E(()=>{"use strict";sl();un();aS="global-admin";ts="template:",qf="run:";me=class extends Error{status;constructor(e,n){super(n),this.status=e}}});import{mkdirSync as Yq,writeFileSync as zq}from"node:fs";import{randomUUID as fS}from"node:crypto";import{dirname as Zq,resolve as al,sep as mS}from"node:path";async function _S(t,e){let n;try{n=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let r=n.image;if(!rH(r))return t.text("missing image file",400);if(r.size>Qq)return t.text("upload too large",413);let s=Buffer.from(await r.arrayBuffer()),i=sH(s);if(i===null||!(i in pS))return t.text("unsupported upload MIME type",415);if(r.type.length>0&&r.type!==i)return t.text("upload MIME type does not match file content",415);let o=eH(e,n.project);if(typeof o=="string")return t.text(o,404);let a=o===null?al(nH()):al(o.local_path),l=al(a,"uploads",fS()),c=al(l,`${fS()}${pS[i]}`);if(!tH(c,a))return t.text("invalid upload path",400);Yq(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);zq(c,u);let d={path:c,size:s.byteLength,mime:i,project:o?.name??null};return t.json(d)}function eH(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function tH(t,e){let n=e.endsWith(mS)?e:`${e}${mS}`;return t.startsWith(n)}function nH(){return Zq(Q())}function rH(t){return typeof File<"u"&&t instanceof File}function sH(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 Qq,pS,hS=E(()=>{"use strict";He();Qq=10*1024*1024,pS={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ll}from"node:fs";import{basename as iH,dirname as oH,extname as aH,isAbsolute as lH,join as cH,relative as dH}from"node:path";import{fileURLToPath as uH}from"node:url";import{Hono as fH}from"hono";import{serveStatic as Zt}from"@hono/node-server/serve-static";function SS(t){let e=new fH,n=[],r=t.localWebui!==void 0?Kf(t.localWebui.webuiDir):mH();if(t.localWebui!==void 0&&Av(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),r!==null){let s=pH();t.localWebui!==void 0?e.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,i=>i.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,Zt({root:r})),e.use("/vendor/*",s,Zt({root:r})),e.use("/src/*",s,Zt({root:r})),e.get("/",s,Zt({root:r,path:"index.html"})),e.get("/admin",s,Zt({root:r,path:"index.html"})),e.get("/admin/*",s,Zt({root:r,path:"index.html"})),e.get("/terminal",s,Zt({root:r,path:"index.html"})),e.get("/terminal/*",s,Zt({root:r,path:"index.html"})),e.get("/chat",s,Zt({root:r,path:"index.html"})),e.get("/chat/*",s,Zt({root:r,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("*",sE({disabled:t.authDisabled})),e.get("/login",s=>s.html(Ue("Login",`
2236
2236
  <h1>Login</h1>
2237
2237
  <form method="post" action="/login">
2238
2238
  <label>Token <input name="token" type="password"></label>
2239
2239
  <button type="submit">Login</button>
2240
2240
  </form>
2241
- `))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return oE(o)?(zu(s,o),s.redirect("/",302)):s.html(Fe("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(aE(s),s.redirect("/login",302))),mv(e,{dal:t.dal}),lS(e,{dal:t.dal}),Rv(e,{dal:t.dal}),Wv(e,{terminalSessionManager:t.terminalSessionManager}),Gv(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=Vs(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)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 Tu(t.dal,i,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return H(s,{team:i,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>`)}),pE(e,{dal:t.dal}),TE(e,{dal:t.dal}),e.get("/api/status",s=>H(s,Zo(t.dal),TH)),e.get("/api/projects",s=>H(s,Qo(t.dal),vH)),e.get("/api/teams",s=>H(s,sw(t.dal),kH)),e.get("/api/workflows",s=>H(s,ea(t.dal),IH)),e.get("/api/workflows/verify",s=>{let i=zT();return s.req.header("accept")?.includes("text/plain")?s.text(QT(i)):s.json(i)}),e.get("/api/jobs",s=>H(s,iw(t.dal,{status:s.req.query("status")}),NH)),e.post("/api/uploads",s=>_S(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=ta(t.dal,ie(s,"id"));return i===null?s.notFound():H(s,i,ye)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=t.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=t.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=t.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:u,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return H(s,d,ye)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Ha(),cv)),o=ta(t.dal,ie(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():H(s,i,ye)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():H(s,t.dal.listProjectWorkflows(i.id),SH)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await ns(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(u!==null)try{qr(u)}catch{return s.text("invalid condition",400)}let d=gH(o.parameters_override??o.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return H(s,m,ye)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ie(s,"id"));return i===null?s.notFound():H(s,i,ye)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ie(s,"id"))?H(s,{removed:!0},ye):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!0);return i===null?s.notFound():H(s,i,ye)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!1);return i===null?s.notFound():H(s,i,ye)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=yS(s.req.query("status"),yH);if(typeof o=="string")return s.text(o,400);let a=yS(s.req.query("severity"),kS);return typeof a=="string"?s.text(a,400):H(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),bH)}),e.post("/api/projects/:name/issues",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await ns(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=wH(o.severity);if(typeof c=="object")return s.text(c.error,400);let u=EH(o.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return H(s,d,ye)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ie(s,"id"));return i===null?s.notFound():H(s,i,ye)}),e.post("/api/issues/:id/claim",async s=>{let i=ie(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await ns(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(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):H(s,c,ye)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await ns(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):H(s,l,ye)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await ns(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return H(s,t.dal.closeIssue(ie(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),ye)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await ns(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return H(s,t.dal.reopenIssue(ie(s,"id"),a),ye)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return H(s,{...i,owner:a,repo:l},ye)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ie(s,"run_id"),o=s.req.query("kind"),a=or(t.dal,i,o);return H(s,a,ye)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ie(s,"run_id"),o=s.req.param("kind"),a=or(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):H(s,l,ye);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=_H(l.path);if(hH(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=iH(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return H(s,l,ye)}return H(s,l,ye)}),e.get("/api/runs",s=>H(s,Ur(t.dal,{limit:Gf(s,"limit")??100}),AH)),e.get("/api/runs/:id",s=>{let i=ir(t.dal,ie(s,"id"));return i===null?s.notFound():H(s,i,xH)}),e.get("/api/runs/:id/where",s=>{let i=Wr(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(ra(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=sa(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(ia(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(ie(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(cl(t.daemon),H(s,o,wS)):H(s,o,wS,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=ie(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(o=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"&&(o=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(cl(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=>gS(s,t.dal,i=>H(s,i,OH))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=cw(t.dal,ie(s,"id"),ie(s,"step_id"));return i===null?s.notFound():bS(s)?s.html(`<pre>${S(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>gS(s,t.dal,i=>{let o=Yv(i);return H(s,o,a=>Ee(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>H(s,dw(t.dal,{type:s.req.query("type")}),LH)),e.get("/api/external-signals",s=>H(s,uw(t.dal,{unhandled:s.req.query("unhandled")==="true"}),CH)),e.get("/api/attentions",s=>H(s,Cn(t.dal,{unacked:s.req.query("unacked")==="true"}),$H)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(ie(s,"id"));return i===null?s.notFound():H(s,i,o=>`<p>acknowledged attention ${S(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=na(t.dal,l);return H(s,c,u=>`<h1>Escalations</h1>${Ee(["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 i=Yt(t.dal,ie(s,"id"));return i===null?s.notFound():H(s,i,ye)}),e.post("/api/escalations/:id/respond",async s=>{let i=ie(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=Yt(t.dal,i);if(c===null)return s.notFound();let u=Cn(t.dal).find(m=>m.id===i);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);cl(t.daemon);let p=Cn(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(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,o,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(i);return cl(t.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=ow(t.dal,{status:o,pr_url:i});return H(s,a,MH)}),e.get("/api/submitted-prs/:id",s=>{let i=ie(s,"id"),o=aw(t.dal,i);return o===null?s.notFound():H(s,o,DH)}),e.get("/api/sessions",s=>H(s,t.dal.latestSessionSizes(),ES)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=Vs(s.req.param("team_name"));return H(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),ES)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=Vs(s.req.param("team_name"));try{let o=await zy(t.dal,i,s.req.param("alias"));return H(s,o,a=>TS("compacted",a.row))}catch(o){if(o instanceof Ks)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=Vs(s.req.param("team_name")),o=await Tu(t.dal,i,s.req.param("alias"));return H(s,o,a=>TS(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>H(s,n,vS)),e.post("/api/intake/scan",async s=>(n=await Ta(t.dal),H(s,n,vS))),e.get("/api/stats/run-throughput",s=>H(s,pw(t.dal),jH)),e.get("/api/daemon/state",s=>H(s,t.daemon?.state??null,PH)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return H(s,{disabled:!0},ye);let i=await t.daemon.runCycle();return H(s,{state:t.daemon.state,result:i},ye)}),e.get("/metrics/:project_id",s=>{let i=ie(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=Au(t.dal,i),l=xu(t.dal,{project_id:i});return s.html(Fe(`Metrics \u2014 ${o.name}`,FH(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Gf(s,"since_days");return s.json(Au(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Gf(s,"since_days");return s.json(xu(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(ie(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function gS(t,e,n){let r=Nu(e,ie(t,"id"),ie(t,"step_id"));return r===null?t.notFound():n(r)}function cl(t){t!==void 0&&t.runCycle().catch(()=>{})}function H(t,e,n,r=200){return bS(t)?r===200?t.html(n(e)):t.html(n(e),400):new Response(JSON.stringify(e),{status:r,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function bS(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function mH(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ll(`${t}/index.html`)?Kf(t):null;let e="src/serve/webui-dist";if(ll(`${e}/index.html`))return e;let n="dist/serve/webui-dist";if(ll(`${n}/index.html`))return n;let r=cH(oH(uH(import.meta.url)),"webui-dist");return ll(`${r}/index.html`)?Kf(r):null}function Kf(t){if(!lH(t))return t;let e=dH(process.cwd(),t);return e.length===0?".":e}function pH(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ie(t,e){return Number(t.req.param(e))}function Gf(t,e){let n=t.req.query(e);if(n===void 0)return;let r=Number(n);return Number.isInteger(r)&&r>0?r:void 0}function _H(t){switch(aH(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 hH(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function ns(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 gH(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 yS(t,e){if(t===void 0||t.length===0)return;let n=t.split(",").map(r=>r.trim()).filter(r=>r.length>0);if(n.length!==0){for(let r of n)if(!e.includes(r))return`invalid value: ${r}`;return n}}function wH(t){if(t!=null)return typeof t=="string"&&kS.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function EH(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(n=>typeof n=="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 TH(t){return`<h1>Status</h1><div class="grid">
2241
+ `))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return oE(o)?(zu(s,o),s.redirect("/",302)):s.html(Ue("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(aE(s),s.redirect("/login",302))),mv(e,{dal:t.dal}),lS(e,{dal:t.dal}),Rv(e,{dal:t.dal}),Wv(e,{terminalSessionManager:t.terminalSessionManager}),Gv(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=Vs(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)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 Tu(t.dal,i,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:i,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>`)}),pE(e,{dal:t.dal}),TE(e,{dal:t.dal}),e.get("/api/status",s=>B(s,Zo(t.dal),TH)),e.get("/api/projects",s=>B(s,Qo(t.dal),vH)),e.get("/api/teams",s=>B(s,sw(t.dal),kH)),e.get("/api/workflows",s=>B(s,ea(t.dal),IH)),e.get("/api/workflows/verify",s=>{let i=zT();return s.req.header("accept")?.includes("text/plain")?s.text(QT(i)):s.json(i)}),e.get("/api/jobs",s=>B(s,iw(t.dal,{status:s.req.query("status")}),NH)),e.post("/api/uploads",s=>_S(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=ta(t.dal,ie(s,"id"));return i===null?s.notFound():B(s,i,ye)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=t.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=t.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=t.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:u,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return B(s,d,ye)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Ha(),cv)),o=ta(t.dal,ie(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():B(s,i,ye)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():B(s,t.dal.listProjectWorkflows(i.id),SH)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await ns(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(u!==null)try{qr(u)}catch{return s.text("invalid condition",400)}let d=gH(o.parameters_override??o.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return B(s,m,ye)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ie(s,"id"));return i===null?s.notFound():B(s,i,ye)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ie(s,"id"))?B(s,{removed:!0},ye):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!0);return i===null?s.notFound():B(s,i,ye)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!1);return i===null?s.notFound():B(s,i,ye)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=yS(s.req.query("status"),yH);if(typeof o=="string")return s.text(o,400);let a=yS(s.req.query("severity"),kS);return typeof a=="string"?s.text(a,400):B(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),bH)}),e.post("/api/projects/:name/issues",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await ns(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=wH(o.severity);if(typeof c=="object")return s.text(c.error,400);let u=EH(o.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return B(s,d,ye)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ie(s,"id"));return i===null?s.notFound():B(s,i,ye)}),e.post("/api/issues/:id/claim",async s=>{let i=ie(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await ns(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(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):B(s,c,ye)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await ns(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):B(s,l,ye)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await ns(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return B(s,t.dal.closeIssue(ie(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),ye)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await ns(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return B(s,t.dal.reopenIssue(ie(s,"id"),a),ye)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return B(s,{...i,owner:a,repo:l},ye)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ie(s,"run_id"),o=s.req.query("kind"),a=or(t.dal,i,o);return B(s,a,ye)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ie(s,"run_id"),o=s.req.param("kind"),a=or(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):B(s,l,ye);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=_H(l.path);if(hH(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=iH(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,ye)}return B(s,l,ye)}),e.get("/api/runs",s=>B(s,Ur(t.dal,{limit:Gf(s,"limit")??100}),AH)),e.get("/api/runs/:id",s=>{let i=ir(t.dal,ie(s,"id"));return i===null?s.notFound():B(s,i,xH)}),e.get("/api/runs/:id/where",s=>{let i=Wr(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(ra(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=sa(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(ia(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(ie(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(cl(t.daemon),B(s,o,wS)):B(s,o,wS,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=ie(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(o=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"&&(o=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(cl(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=>gS(s,t.dal,i=>B(s,i,OH))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=cw(t.dal,ie(s,"id"),ie(s,"step_id"));return i===null?s.notFound():bS(s)?s.html(`<pre>${S(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>gS(s,t.dal,i=>{let o=Yv(i);return B(s,o,a=>Ee(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>B(s,dw(t.dal,{type:s.req.query("type")}),LH)),e.get("/api/external-signals",s=>B(s,uw(t.dal,{unhandled:s.req.query("unhandled")==="true"}),CH)),e.get("/api/attentions",s=>B(s,Cn(t.dal,{unacked:s.req.query("unacked")==="true"}),$H)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(ie(s,"id"));return i===null?s.notFound():B(s,i,o=>`<p>acknowledged attention ${S(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=na(t.dal,l);return B(s,c,u=>`<h1>Escalations</h1>${Ee(["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 i=Yt(t.dal,ie(s,"id"));return i===null?s.notFound():B(s,i,ye)}),e.post("/api/escalations/:id/respond",async s=>{let i=ie(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=Yt(t.dal,i);if(c===null)return s.notFound();let u=Cn(t.dal).find(m=>m.id===i);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);cl(t.daemon);let p=Cn(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(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,o,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(i);return cl(t.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=ow(t.dal,{status:o,pr_url:i});return B(s,a,MH)}),e.get("/api/submitted-prs/:id",s=>{let i=ie(s,"id"),o=aw(t.dal,i);return o===null?s.notFound():B(s,o,DH)}),e.get("/api/sessions",s=>B(s,t.dal.latestSessionSizes(),ES)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=Vs(s.req.param("team_name"));return B(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),ES)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=Vs(s.req.param("team_name"));try{let o=await zy(t.dal,i,s.req.param("alias"));return B(s,o,a=>TS("compacted",a.row))}catch(o){if(o instanceof Ks)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=Vs(s.req.param("team_name")),o=await Tu(t.dal,i,s.req.param("alias"));return B(s,o,a=>TS(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>B(s,n,vS)),e.post("/api/intake/scan",async s=>(n=await Ta(t.dal),B(s,n,vS))),e.get("/api/stats/run-throughput",s=>B(s,pw(t.dal),jH)),e.get("/api/daemon/state",s=>B(s,t.daemon?.state??null,PH)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return B(s,{disabled:!0},ye);let i=await t.daemon.runCycle();return B(s,{state:t.daemon.state,result:i},ye)}),e.get("/metrics/:project_id",s=>{let i=ie(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=Au(t.dal,i),l=xu(t.dal,{project_id:i});return s.html(Ue(`Metrics \u2014 ${o.name}`,FH(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Gf(s,"since_days");return s.json(Au(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Gf(s,"since_days");return s.json(xu(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(ie(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function gS(t,e,n){let r=Nu(e,ie(t,"id"),ie(t,"step_id"));return r===null?t.notFound():n(r)}function cl(t){t!==void 0&&t.runCycle().catch(()=>{})}function B(t,e,n,r=200){return bS(t)?r===200?t.html(n(e)):t.html(n(e),400):new Response(JSON.stringify(e),{status:r,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function bS(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function mH(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ll(`${t}/index.html`)?Kf(t):null;let e="src/serve/webui-dist";if(ll(`${e}/index.html`))return e;let n="dist/serve/webui-dist";if(ll(`${n}/index.html`))return n;let r=cH(oH(uH(import.meta.url)),"webui-dist");return ll(`${r}/index.html`)?Kf(r):null}function Kf(t){if(!lH(t))return t;let e=dH(process.cwd(),t);return e.length===0?".":e}function pH(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ie(t,e){return Number(t.req.param(e))}function Gf(t,e){let n=t.req.query(e);if(n===void 0)return;let r=Number(n);return Number.isInteger(r)&&r>0?r:void 0}function _H(t){switch(aH(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 hH(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function ns(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 gH(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 yS(t,e){if(t===void 0||t.length===0)return;let n=t.split(",").map(r=>r.trim()).filter(r=>r.length>0);if(n.length!==0){for(let r of n)if(!e.includes(r))return`invalid value: ${r}`;return n}}function wH(t){if(t!=null)return typeof t=="string"&&kS.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function EH(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(n=>typeof n=="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 TH(t){return`<h1>Status</h1><div class="grid">
2242
2242
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
2243
2243
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
2244
2244
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
@@ -2291,30 +2291,30 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2291
2291
  FROM tracked_invocation
2292
2292
  WHERE target_teamfile = ?
2293
2293
  AND target_alias = ?
2294
- AND status = 'running'`,e,n),s=0;for(let i of r)rs(t,i)!==null&&(s+=1);return s}var hi=E(()=>{"use strict";ft()});import{randomUUID as VH}from"node:crypto";import{existsSync as nse,mkdirSync as YH,readFileSync as zH,writeFileSync as ZH}from"node:fs";import{homedir as QH}from"node:os";import{dirname as eB,join as tB}from"node:path";function dl(){return process.env.LMCTL_DEVICE_FILE??tB(QH(),".lmctl","device.json")}function mr(t=dl()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let n=JSON.parse(zH(t,"utf8"));return typeof n.device_id!="string"||n.device_id===""?null:{device_id:n.device_id,created_at:typeof n.created_at=="string"?n.created_at:""}}catch{return null}}function gi(t=dl()){let e=mr(t);if(e!==null&&e.created_at!=="env")return e;let n={device_id:VH(),created_at:new Date().toISOString()};return YH(eB(t),{recursive:!0}),ZH(t,`${JSON.stringify(n,null,2)}
2294
+ AND status = 'running'`,e,n),s=0;for(let i of r)rs(t,i)!==null&&(s+=1);return s}var hi=E(()=>{"use strict";ut()});import{randomUUID as VH}from"node:crypto";import{existsSync as nse,mkdirSync as YH,readFileSync as zH,writeFileSync as ZH}from"node:fs";import{homedir as QH}from"node:os";import{dirname as eB,join as tB}from"node:path";function dl(){return process.env.LMCTL_DEVICE_FILE??tB(QH(),".lmctl","device.json")}function mr(t=dl()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let n=JSON.parse(zH(t,"utf8"));return typeof n.device_id!="string"||n.device_id===""?null:{device_id:n.device_id,created_at:typeof n.created_at=="string"?n.created_at:""}}catch{return null}}function gi(t=dl()){let e=mr(t);if(e!==null&&e.created_at!=="env")return e;let n={device_id:VH(),created_at:new Date().toISOString()};return YH(eB(t),{recursive:!0}),ZH(t,`${JSON.stringify(n,null,2)}
2295
2295
  `,{encoding:"utf8",mode:384}),n}var ul=E(()=>{"use strict"});function FS(t){if(t.length===0||!t.startsWith("---"))throw new Qt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
2296
2296
  `);if(e[0]!=="---")throw new Qt("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){r=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Qt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!nB.has(c))throw new Qt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${fl.join(", ")}`);n[c]=u}if(r===-1)throw new Qt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of fl)if(n[o]===void 0)throw new Qt(`missing required frontmatter key "${o}" \u2014 required: ${fl.join(", ")}`);let s=0;for(let o=0;o<=r;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=n.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:n.title,description:n.description,members:i,bodyOffset:s}}var fl,nB,Qt,US=E(()=>{"use strict";fl=["title","description","members"],nB=new Set(fl),Qt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as rB,writeFileSync as lse,renameSync as cse,existsSync as qS}from"node:fs";import{basename as sB,resolve as ss,dirname as Yf}from"node:path";function oB(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],i=r[2]!==void 0?r[2]:r[3];e[s]=i}return e}function aB(t){return/^\s*_MEMBER_\s+\S/.test(t)}function lB(t){return/^\s*_SESSION_\s+\S/.test(t)}function cB(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Zf(t){let e=sB(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function $e(t){let e=rB(t,"utf-8"),n=Yf(ss(t)),r=Qf(e,Zf(t),{baseDir:n,sourcePath:ss(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=ss(n,s.sessiondir));return r}function Qf(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2297
2297
  `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=FS(i)}catch(l){if(l instanceof Qt)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
2298
2298
  `);for(let l=0;l<a.length;l++){let c=a[l],u=l+1;if(lB(c))throw new Error(`line ${u}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(cB(c)||!aB(c))continue;let d=oB(c);for(let p of Object.keys(d))if(!WS.includes(p))throw new Error(`line ${u}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2299
- allowed keys: ${WS.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${r.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),r.push(m)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:o}}function em(t,e){let n=[];for(let i of t.parseErrors)n.push({field:"session",message:i});let r=t.members.filter(i=>i.alias.toLowerCase()===zf.toLowerCase());r.length>1&&n.push({field:zf,message:`${r.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&n.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?ss(e,i.teamfile):ss(i.teamfile);if(!qS(a))n.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=$e(a),c=Et(l);c?c.session||n.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else iB.has(i.provider)||n.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&n.push({field:i.alias,message:"sessiondir is empty"})}return n}function Et(t){return t.members.find(e=>e.alias.toLowerCase()===zf.toLowerCase())}function tm(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=ss(e,t.teamfile),o=n??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!qS(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=$e(i),l=Et(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return tm(l,Yf(i),o,r);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Yf(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function ml(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var zf,iB,WS,Dt=E(()=>{"use strict";US();zf="Lead",iB=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","ClaudeMock"]);WS=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});async function $(t,e){if(t.dal!==void 0)return e(t.dal);let n=Be({path:Q()});try{return await e(n)}finally{n.close()}}function Y(t,e,n=["--json"]){let r=new Set(e),s=new Set(n),i=[],o={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!r.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function M(t,e){let n=t.flags[e];return typeof n=="string"?n:void 0}function B(t,e){return t.flags[e]===!0}function X(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
2299
+ allowed keys: ${WS.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${r.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),r.push(m)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:o}}function em(t,e){let n=[];for(let i of t.parseErrors)n.push({field:"session",message:i});let r=t.members.filter(i=>i.alias.toLowerCase()===zf.toLowerCase());r.length>1&&n.push({field:zf,message:`${r.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&n.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?ss(e,i.teamfile):ss(i.teamfile);if(!qS(a))n.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=$e(a),c=wt(l);c?c.session||n.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else iB.has(i.provider)||n.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&n.push({field:i.alias,message:"sessiondir is empty"})}return n}function wt(t){return t.members.find(e=>e.alias.toLowerCase()===zf.toLowerCase())}function tm(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=ss(e,t.teamfile),o=n??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!qS(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=$e(i),l=wt(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return tm(l,Yf(i),o,r);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Yf(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function ml(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var zf,iB,WS,Dt=E(()=>{"use strict";US();zf="Lead",iB=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","ClaudeMock"]);WS=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});async function $(t,e){if(t.dal!==void 0)return e(t.dal);let n=Xe({path:Q()});try{return await e(n)}finally{n.close()}}function Y(t,e,n=["--json"]){let r=new Set(e),s=new Set(n),i=[],o={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!r.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function M(t,e){let n=t.flags[e];return typeof n=="string"?n:void 0}function X(t,e){return t.flags[e]===!0}function J(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
2300
2300
  `)}function k(t,e){return t.stderr.write(`error: ${e}
2301
- `),1}function Ue(t,e){let n=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${n}
2302
- `),2}function pl(t){if(t===void 0)return null;let e=Number.parseInt(t,10);return Number.isInteger(e)&&e>0?e:null}var Ie=E(()=>{"use strict";mt();qe()});import{createHash as dB}from"node:crypto";import{existsSync as HS,readFileSync as BS,realpathSync as uB}from"node:fs";import{dirname as fB,resolve as XS}from"node:path";function be(t,e){let n=XS(t);if(HS(n))return uB(n);if(e!==void 0){let r=pB(t,n,e);if(r!==null)return r}return n}function hl(t,e){let n=fB(e),r=Qf(t,Zf(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=XS(n,s.sessiondir));return r}function st(t,e,n=r=>{process.stderr.write(`warning: ${r}
2303
- `)}){let r=be(t,mB(e)?e:void 0);if(HS(r)){let i=BS(r,"utf8"),o=hl(i,r);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(r)===null&&_B(o)&&gB(e,r,o,i,n),o}let s=e?.getRootTeam(r)??null;throw s!==null?new Error(`teamfile missing on disk: ${r} (registered ${s.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${t}`)}function mB(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function pB(t,e,n){let r=n.getRootTeam(t)??n.getRootTeam(e);return r===null?null:r.teamfile_path}function _B(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=nm)}function rm(t,e,n){let r=be(e),s=n.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=nm);if(s.length!==0)for(let i of t.listRootTeams()){let o,a;try{if(o=be(i.teamfile_path),o===r)continue;a=BS(o,"utf8")}catch(c){if(hB(c))continue;throw c}let l=hl(a,o);for(let c of s){let u=l.members.find(d=>d.teamfile===void 0&&d.session===c.session&&(d.session?.length??0)>=nm);if(u!==void 0)throw new _l(`sessionid ownership conflict: ${r}:${c.alias} and ${o}:${u.alias} both use sessionid "${c.session}"`)}}}function hB(t){let e=t?.code;return e==="ENOENT"||e==="ENOTDIR"}function gB(t,e,n,r,s){try{rm(t,e,n)}catch(o){if(!(o instanceof _l))throw o;s(`${o.message}; skipping automatic registration`);return}let i={teamfile_path:e,name:n.name,raw_text:r,raw_sha256:dB("sha256").update(r).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(i)}var nm,_l,en=E(()=>{"use strict";Dt();nm=5,_l=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}}});import{existsSync as yB}from"node:fs";import{dirname as JS}from"node:path";function vB(t){return wB.test(t)||EB.test(t)||TB.test(t)}function GS(t){return gl.test(t)}function pr(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),n=t.slice(0,e),r=t.slice(e+1);return!n.endsWith(".lmctl")||!gl.test(r)?null:{teamfile:n,alias:r}}function De(t,e,n){if(!t.endsWith(".lmctl"))throw new ve(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!GS(e))throw new ve(`lmctl: "${e}" is not a valid alias (must match ${gl.source}).`);let r=be(t,n);if(n===void 0&&!yB(r))throw new ve(`lmctl: teamfile not found: ${t}`);let s;try{s=st(r,n)}catch(o){throw new ve(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ve(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=ml(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ve(`lmctl: alias "${e}" not found in ${t}.
2301
+ `),1}function We(t,e){let n=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${n}
2302
+ `),2}function pl(t){if(t===void 0)return null;let e=Number.parseInt(t,10);return Number.isInteger(e)&&e>0?e:null}var Ie=E(()=>{"use strict";ft();He()});import{createHash as dB}from"node:crypto";import{existsSync as HS,readFileSync as BS,realpathSync as uB}from"node:fs";import{dirname as fB,resolve as XS}from"node:path";function be(t,e){let n=XS(t);if(HS(n))return uB(n);if(e!==void 0){let r=pB(t,n,e);if(r!==null)return r}return n}function hl(t,e){let n=fB(e),r=Qf(t,Zf(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=XS(n,s.sessiondir));return r}function rt(t,e,n=r=>{process.stderr.write(`warning: ${r}
2303
+ `)}){let r=be(t,mB(e)?e:void 0);if(HS(r)){let i=BS(r,"utf8"),o=hl(i,r);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(r)===null&&_B(o)&&gB(e,r,o,i,n),o}let s=e?.getRootTeam(r)??null;throw s!==null?new Error(`teamfile missing on disk: ${r} (registered ${s.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${t}`)}function mB(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function pB(t,e,n){let r=n.getRootTeam(t)??n.getRootTeam(e);return r===null?null:r.teamfile_path}function _B(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=nm)}function rm(t,e,n){let r=be(e),s=n.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=nm);if(s.length!==0)for(let i of t.listRootTeams()){let o,a;try{if(o=be(i.teamfile_path),o===r)continue;a=BS(o,"utf8")}catch(c){if(hB(c))continue;throw c}let l=hl(a,o);for(let c of s){let u=l.members.find(d=>d.teamfile===void 0&&d.session===c.session&&(d.session?.length??0)>=nm);if(u!==void 0)throw new _l(`sessionid ownership conflict: ${r}:${c.alias} and ${o}:${u.alias} both use sessionid "${c.session}"`)}}}function hB(t){let e=t?.code;return e==="ENOENT"||e==="ENOTDIR"}function gB(t,e,n,r,s){try{rm(t,e,n)}catch(o){if(!(o instanceof _l))throw o;s(`${o.message}; skipping automatic registration`);return}let i={teamfile_path:e,name:n.name,raw_text:r,raw_sha256:dB("sha256").update(r).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(i)}var nm,_l,en=E(()=>{"use strict";Dt();nm=5,_l=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}}});import{existsSync as yB}from"node:fs";import{dirname as JS}from"node:path";function vB(t){return wB.test(t)||EB.test(t)||TB.test(t)}function GS(t){return gl.test(t)}function pr(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),n=t.slice(0,e),r=t.slice(e+1);return!n.endsWith(".lmctl")||!gl.test(r)?null:{teamfile:n,alias:r}}function je(t,e,n){if(!t.endsWith(".lmctl"))throw new ve(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!GS(e))throw new ve(`lmctl: "${e}" is not a valid alias (must match ${gl.source}).`);let r=be(t,n);if(n===void 0&&!yB(r))throw new ve(`lmctl: teamfile not found: ${t}`);let s;try{s=rt(r,n)}catch(o){throw new ve(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ve(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=ml(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ve(`lmctl: alias "${e}" not found in ${t}.
2304
2304
  Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=tm(i,JS(r));return{teamfile:r,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new ve(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
2305
- Run: lmctl seed ${t}`);return{teamfile:r,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??JS(r),isLead:Et(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function Tt(t,e){let{target:n,alias:r,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${n}" \u2014 pick one form.`};let o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(n!==void 0){let o=pr(n);if(o!==null)return r!==void 0&&r!==o.alias?{mode:"error",message:`lmctl ${t.name}: got "${n}" AND second positional "${r}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(n.endsWith(".lmctl"))return r!==void 0?GS(r)?{mode:"ai-team",teamfile:n,alias:r}:{mode:"error",message:`lmctl ${t.name}: "${r}" is not a valid alias (must match ${gl.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:n}:{mode:"error",message:`lmctl ${t.name}: alias required.
2305
+ Run: lmctl seed ${t}`);return{teamfile:r,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??JS(r),isLead:wt(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function Et(t,e){let{target:n,alias:r,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${n}" \u2014 pick one form.`};let o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(n!==void 0){let o=pr(n);if(o!==null)return r!==void 0&&r!==o.alias?{mode:"error",message:`lmctl ${t.name}: got "${n}" AND second positional "${r}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(n.endsWith(".lmctl"))return r!==void 0?GS(r)?{mode:"ai-team",teamfile:n,alias:r}:{mode:"error",message:`lmctl ${t.name}: "${r}" is not a valid alias (must match ${gl.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:n}:{mode:"error",message:`lmctl ${t.name}: alias required.
2306
2306
  Use: lmctl ${t.name} ${n}:<alias> or lmctl ${t.name} ${n} <alias>`};if(vB(n)){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: got a second positional "${r}" but "${n}" is not a teamfile path.`};if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: "${n}" is a bare sessionid, but ${t.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:n};return s.provider!==void 0&&(a.provider=s.provider),a}return r!==void 0?{mode:"error",message:`lmctl ${t.name}: got a second positional "${r}" but "${n}" is not a teamfile path.
2307
2307
  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 "${n}".
2308
2308
  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 o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${t.name}: a target is required.
2309
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ve,wB,EB,TB,gl,vt=E(()=>{"use strict";Dt();en();ve=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},wB=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,EB=/^ses_[A-Za-z0-9_-]+$/,TB=/^session_[A-Za-z0-9_-]+$/,gl=/^[A-Za-z][A-Za-z0-9_-]*$/});function Je(t){let e=pr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var yl=E(()=>{"use strict";vt()});function sm(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2309
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ve,wB,EB,TB,gl,Tt=E(()=>{"use strict";Dt();en();ve=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},wB=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,EB=/^ses_[A-Za-z0-9_-]+$/,TB=/^session_[A-Za-z0-9_-]+$/,gl=/^[A-Za-z][A-Za-z0-9_-]*$/});function Je(t){let e=pr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var yl=E(()=>{"use strict";Tt()});function sm(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2310
2310
  manually, outside a member session that lmctl started. Running lmctl this way is
2311
2311
  not officially supported.
2312
2312
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function gn(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2313
2313
  The session marker may be stale or the team may not be registered in this lmctl database.
2314
2314
  Consulted ${Ts(Q())}
2315
2315
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function KS(t){return`unknown option --from
2316
- ${sm(t)}`}function VS(t,e){let n=_r(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function _r(t,e){let n=t[Ds];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let i of e.listRootTeams()){let o;try{o=st(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===n&&r.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var yi=E(()=>{"use strict";At();qe();en()});function wl(t){return bB.has(t)}function om(){return im===null&&(im=Jt(Vt())),im}function am(t,e,n={}){if(!wl(t))return null;try{let r=om().getAdapter?.(t);if(r===void 0)return null;let s=r.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&n.isLead===!0?wo({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?SB[t]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:t,model:n.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...YS[t]??[]]}catch{return null}}function El(t,e,n={}){let r=am(t,e,n);return r===null?null:r.join(" ")}function Ne(t,e){return om().getSession(t,e)}async function tn(t){return(await om().resolveSessions(t)).map(n=>n.provider.name)}var YS,SB,bB,zS,im,St=E(()=>{"use strict";gt();Kc();YS={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:["--auto"],kimi:[],hermes:[]},SB={claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t],kimi:t=>["--model",t],hermes:t=>["--model",t]},bB=new Set(Object.keys(YS)),zS=/^[\w.:-]+$/;im=null});var ub={};oe(ub,{appendIntent:()=>sb,formatAge:()=>wi,formatDuration:()=>Sl,resolveIntentLogPath:()=>rb,runStatus:()=>MB,shortIdentity:()=>bt});import{appendFileSync as kB,existsSync as IB,mkdirSync as NB}from"node:fs";import{homedir as AB}from"node:os";import{basename as xB,dirname as nb,isAbsolute as RB,join as OB,resolve as LB}from"node:path";function rb(){return process.env.LMCTL_INTENT_LOG??OB(AB(),".lmctl","recent-intents.log")}function sb(t){try{let e=rb();NB(nb(e),{recursive:!0});let n=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});kB(e,`${n}
2317
- `)}catch{}}async function MB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(CB),0;let n=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(n!==void 0)return k(e,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=Y(t,["--since"],["--json"]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length>0)return k(e,`unknown argument: ${r.positionals[0]}`);let s=B(r,"--json"),i=t2(M(r,"--since"));if("error"in i)return k(e,i.error);try{let o=e.env??process.env;if(s){let a=await $(e,l=>eb(l,o));X(e,a)}else{let a=await $(e,async l=>GB(await eb(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return sb({verb:"status",args:t}),0}catch(o){return k(e,o instanceof Error?o.message:String(o))}}async function eb(t,e){let n=_r(e,t);if(!n.ok){if(n.reason==="not-found")throw new Error(gn("status"));return await jB(t)}return await DB(t,n.identity)}async function DB(t,e){let n=Je(e),r=t.getRootTeam(n.teamfile);if(r===null)throw new Error(gn("status"));let s=st(r.teamfile_path,t),i=cm(vl(t,{from:n.value})),o=cm(vl(t,{target_teamfile:n.teamfile,target_alias:n.alias})),a=WB([...lm(t,{from:n.value}),...lm(t,{target_teamfile:n.teamfile,target_alias:n.alias})]);return{scope:"self",identity:n.value,...ib(),team:{name:s.name,teamfile:r.teamfile_path},members:s.members.map(l=>FB(t,r.teamfile_path,l)),activity:{from_me:i.map(l=>dm(l)),to_me:o.map(l=>dm(l))},transcript_harvest:await ob(a)}}function ib(){let t=null;try{t=Wh(Uh())}catch{}return{db_path:Q(),site_name:t}}async function jB(t){let e=t.listRootTeams();return{scope:"db",identity:null,...ib(),teams:e.map(n=>PB(t,n)),activity:cm(vl(t)).map(n=>dm(n)),transcript_harvest:await ob(lm(t))}}function PB(t,e){if(!IB(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let n=0;try{n=st(e.teamfile_path,t).members.length}catch{n=0}return{name:e.name,teamfile:e.teamfile_path,member_count:n,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function FB(t,e,n){let r=n.teamfile===void 0?null:be(RB(n.teamfile)?n.teamfile:LB(nb(e),n.teamfile),t),s=kr(t,e,n.alias),i=s.busy&&s.reason==="in-flight"?UB(t,e,n.alias,s.inFlight):null;return{alias:n.alias,provider:n.provider,model:n.model??null,teamfile:e,referenced_teamfile:r,sessionid:n.session??null,sessiondir:n.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i,reclaimable:!s.busy&&s.reclaimable!==void 0?s.reclaimable:null}}function UB(t,e,n,r){let s=r.sender_alias==="operator"?"operator":`${r.sender_teamfile}:${r.sender_alias}`,o=t.db.prepare(`
2316
+ ${sm(t)}`}function VS(t,e){let n=_r(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function _r(t,e){let n=t[Ds];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let i of e.listRootTeams()){let o;try{o=rt(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===n&&r.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var yi=E(()=>{"use strict";At();He();en()});function wl(t){return bB.has(t)}function om(){return im===null&&(im=Jt(Vt())),im}function am(t,e,n={}){if(!wl(t))return null;try{let r=om().getAdapter?.(t);if(r===void 0)return null;let s=r.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&n.isLead===!0?wo({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?SB[t]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:t,model:n.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...YS[t]??[]]}catch{return null}}function El(t,e,n={}){let r=am(t,e,n);return r===null?null:r.join(" ")}function Ne(t,e){return om().getSession(t,e)}async function tn(t){return(await om().resolveSessions(t)).map(n=>n.provider.name)}var YS,SB,bB,zS,im,vt=E(()=>{"use strict";ht();Kc();YS={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:["--auto"],kimi:[],hermes:[]},SB={claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t],kimi:t=>["--model",t],hermes:t=>["--model",t]},bB=new Set(Object.keys(YS)),zS=/^[\w.:-]+$/;im=null});var ub={};oe(ub,{appendIntent:()=>sb,formatAge:()=>wi,formatDuration:()=>Sl,resolveIntentLogPath:()=>rb,runStatus:()=>MB,shortIdentity:()=>St});import{appendFileSync as kB,existsSync as IB,mkdirSync as NB}from"node:fs";import{homedir as AB}from"node:os";import{basename as xB,dirname as nb,isAbsolute as RB,join as OB,resolve as LB}from"node:path";function rb(){return process.env.LMCTL_INTENT_LOG??OB(AB(),".lmctl","recent-intents.log")}function sb(t){try{let e=rb();NB(nb(e),{recursive:!0});let n=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});kB(e,`${n}
2317
+ `)}catch{}}async function MB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(CB),0;let n=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(n!==void 0)return k(e,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=Y(t,["--since"],["--json"]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length>0)return k(e,`unknown argument: ${r.positionals[0]}`);let s=X(r,"--json"),i=t2(M(r,"--since"));if("error"in i)return k(e,i.error);try{let o=e.env??process.env;if(s){let a=await $(e,l=>eb(l,o));J(e,a)}else{let a=await $(e,async l=>GB(await eb(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return sb({verb:"status",args:t}),0}catch(o){return k(e,o instanceof Error?o.message:String(o))}}async function eb(t,e){let n=_r(e,t);if(!n.ok){if(n.reason==="not-found")throw new Error(gn("status"));return await jB(t)}return await DB(t,n.identity)}async function DB(t,e){let n=Je(e),r=t.getRootTeam(n.teamfile);if(r===null)throw new Error(gn("status"));let s=rt(r.teamfile_path,t),i=cm(vl(t,{from:n.value})),o=cm(vl(t,{target_teamfile:n.teamfile,target_alias:n.alias})),a=WB([...lm(t,{from:n.value}),...lm(t,{target_teamfile:n.teamfile,target_alias:n.alias})]);return{scope:"self",identity:n.value,...ib(),team:{name:s.name,teamfile:r.teamfile_path},members:s.members.map(l=>FB(t,r.teamfile_path,l)),activity:{from_me:i.map(l=>dm(l)),to_me:o.map(l=>dm(l))},transcript_harvest:await ob(a)}}function ib(){let t=null;try{t=Wh(Uh())}catch{}return{db_path:Q(),site_name:t}}async function jB(t){let e=t.listRootTeams();return{scope:"db",identity:null,...ib(),teams:e.map(n=>PB(t,n)),activity:cm(vl(t)).map(n=>dm(n)),transcript_harvest:await ob(lm(t))}}function PB(t,e){if(!IB(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let n=0;try{n=rt(e.teamfile_path,t).members.length}catch{n=0}return{name:e.name,teamfile:e.teamfile_path,member_count:n,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function FB(t,e,n){let r=n.teamfile===void 0?null:be(RB(n.teamfile)?n.teamfile:LB(nb(e),n.teamfile),t),s=kr(t,e,n.alias),i=s.busy&&s.reason==="in-flight"?UB(t,e,n.alias,s.inFlight):null;return{alias:n.alias,provider:n.provider,model:n.model??null,teamfile:e,referenced_teamfile:r,sessionid:n.session??null,sessiondir:n.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i,reclaimable:!s.busy&&s.reclaimable!==void 0?s.reclaimable:null}}function UB(t,e,n,r){let s=r.sender_alias==="operator"?"operator":`${r.sender_teamfile}:${r.sender_alias}`,o=t.db.prepare(`
2318
2318
  SELECT * FROM tracked_invocation
2319
2319
  WHERE kind = 'chat'
2320
2320
  AND status = 'running'
@@ -2332,7 +2332,7 @@ ${sm(t)}`}function VS(t,e){let n=_r(t,e);return n.ok?{ok:!0,identity:n.identity,
2332
2332
 
2333
2333
  `),assistantTimestamp:JB(s[s.length-1]?.timestamp)}}function JB(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function dm(t){return{id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:Xt(t),from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:tb(t.result_summary),error:tb(t.error)}}function GB(t,e){return t.scope==="self"?VB(t,e):YB(t,e)}function KB(t){if(t===null)return"idle";let e=t.holder_pid!==null?`pid ${t.holder_pid}${t.holder_host!==null?` on ${t.holder_host}`:""}`:"holder",n=t.reason==="dead-pid"?"appears dead":"stale";return`idle (reclaimable lock: ${e} ${n})`}function VB(t,e){let n=[];n.push(`identity: ${t.identity}`),n.push(`team: ${t.team.name}`),n.push(`teamfile: ${t.team.teamfile}`),n.push(""),n.push("members:"),t.members.length===0&&n.push(" none");for(let r of t.members){let s=r.model===null?"":` model=${r.model}`,i=r.sessionid===null?"":` session=${r.sessionid}`,o=r.state==="idle"?KB(r.reclaimable):`busy (${r.reason})`,a=r.handling===null?"":` handling="${r.handling.request_preview}"`;n.push(` ${r.alias}: ${o} provider=${r.provider}${s}${i}${a}`)}return n.push(""),n.push("transcript harvest:"),lb(n,t.transcript_harvest,"self"),n.push(""),n.push("activity from me:"),um(n,fm(t.activity.from_me,e.sinceIso),"from-me"),n.push(""),n.push("activity to me:"),um(n,fm(t.activity.to_me,e.sinceIso),"to-me"),n.push(""),n.push(ab(t)),n.join(`
2334
2334
  `)}function YB(t,e){let n=[];n.push("scope: db"),n.push("identity: none"),n.push(""),n.push("teams:"),t.teams.length===0&&n.push(" none");for(let r of t.teams){let s=r.name===null?"(unnamed)":r.name;n.push(` ${s}: ${r.teamfile} (${r.member_count} members)`)}return n.push(""),n.push("transcript harvest:"),lb(n,t.transcript_harvest,"db"),n.push(""),n.push("recent activity:"),um(n,fm(t.activity,e.sinceIso),"db"),n.push(""),n.push(ab(t)),n.join(`
2335
- `)}function ab(t){return Ts(t.db_path)}function um(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,Tl))zB(t,r,n);cb(t,e.length,Tl,"older")}function lb(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,Tl)){let s=n==="db"?` from ${bt(r.from_identity)} -> ${bt(r.target)}`:` -> ${bt(r.target)}`;if(r.state==="completed"){let i=r.result_preview===null?"":` "${r.result_preview}"`;t.push(` #${r.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${r.started_at}${i}`)}else t.push(` #${r.tracked_invocation_id} unreconciled${s} since ${r.started_at} (${r.reason??"unknown"})`);r.tail_hint.length>0&&t.push(` inspect: ${r.tail_hint}`)}cb(t,e.length,Tl,"more transcript harvest rows")}function fm(t,e){let n=Date.parse(e);return Number.isFinite(n)?t.filter(r=>{let s=Date.parse(r.ended_at??r.started_at);return Number.isFinite(s)&&s>=n}):t}function zB(t,e,n){let r=QB(e,n),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${db(i)}"`;t.push(` #${e.id} ${ZB(e)} ${e.kind}${r} ${s}${o}`)}function ZB(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.status.toUpperCase()}function QB(t,e){if(e==="from-me")return t.target===null?"":` -> ${bt(t.target)}`;if(e==="to-me")return` from ${bt(t.from_identity)}`;let n=t.target===null?"":` -> ${bt(t.target)}`;return` from ${bt(t.from_identity)}${n}`}function cb(t,e,n,r){let s=e-n;s>0&&t.push(` (+${s} ${r} -- use --json)`)}function tb(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function db(t){let e=t.replace(/\s+/g," ").trim();return e.length<=ZS?e:`${e.slice(0,ZS-3)}...`}function e2(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=QS?e:`${e.slice(0,QS-3)}...`}function Sl(t){let e=Math.max(0,Math.floor(t/1e3));if(e<60)return`${e}s`;let n=Math.floor(e/60);if(n<60)return`${n}m`;let r=Math.floor(n/60);return r<48?`${r}h`:`${Math.floor(r/24)}d`}function wi(t){let e=Date.parse(t);return Number.isFinite(e)?Sl(Date.now()-e):"unknown age"}function bt(t){if(t==="operator")return t;try{let e=Je(t);return`${xB(e.teamfile)}:${e.alias}`}catch{return t}}function t2(t){if(t===void 0)return{iso:new Date(Date.now()-$B).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let r=Number(e[1]),s=e[2],i=s==="s"?r:s==="m"?r*60:s==="h"?r*3600:r*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}var CB,Tl,$B,ZS,QS,bl=E(()=>{"use strict";ft();Ie();yl();qe();yi();en();Fc();St();CB=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2335
+ `)}function ab(t){return Ts(t.db_path)}function um(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,Tl))zB(t,r,n);cb(t,e.length,Tl,"older")}function lb(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,Tl)){let s=n==="db"?` from ${St(r.from_identity)} -> ${St(r.target)}`:` -> ${St(r.target)}`;if(r.state==="completed"){let i=r.result_preview===null?"":` "${r.result_preview}"`;t.push(` #${r.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${r.started_at}${i}`)}else t.push(` #${r.tracked_invocation_id} unreconciled${s} since ${r.started_at} (${r.reason??"unknown"})`);r.tail_hint.length>0&&t.push(` inspect: ${r.tail_hint}`)}cb(t,e.length,Tl,"more transcript harvest rows")}function fm(t,e){let n=Date.parse(e);return Number.isFinite(n)?t.filter(r=>{let s=Date.parse(r.ended_at??r.started_at);return Number.isFinite(s)&&s>=n}):t}function zB(t,e,n){let r=QB(e,n),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${db(i)}"`;t.push(` #${e.id} ${ZB(e)} ${e.kind}${r} ${s}${o}`)}function ZB(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.status.toUpperCase()}function QB(t,e){if(e==="from-me")return t.target===null?"":` -> ${St(t.target)}`;if(e==="to-me")return` from ${St(t.from_identity)}`;let n=t.target===null?"":` -> ${St(t.target)}`;return` from ${St(t.from_identity)}${n}`}function cb(t,e,n,r){let s=e-n;s>0&&t.push(` (+${s} ${r} -- use --json)`)}function tb(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function db(t){let e=t.replace(/\s+/g," ").trim();return e.length<=ZS?e:`${e.slice(0,ZS-3)}...`}function e2(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=QS?e:`${e.slice(0,QS-3)}...`}function Sl(t){let e=Math.max(0,Math.floor(t/1e3));if(e<60)return`${e}s`;let n=Math.floor(e/60);if(n<60)return`${n}m`;let r=Math.floor(n/60);return r<48?`${r}h`:`${Math.floor(r/24)}d`}function wi(t){let e=Date.parse(t);return Number.isFinite(e)?Sl(Date.now()-e):"unknown age"}function St(t){if(t==="operator")return t;try{let e=Je(t);return`${xB(e.teamfile)}:${e.alias}`}catch{return t}}function t2(t){if(t===void 0)return{iso:new Date(Date.now()-$B).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let r=Number(e[1]),s=e[2],i=s==="s"?r:s==="m"?r*60:s==="h"?r*3600:r*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}var CB,Tl,$B,ZS,QS,bl=E(()=>{"use strict";ut();Ie();yl();He();yi();en();Fc();vt();CB=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2336
2336
 
2337
2337
  Show this member's team, busy/idle roster, and recent tracked activity. From a
2338
2338
  plain operator shell, show a DB-wide team/activity summary.
@@ -2341,25 +2341,25 @@ Text output shows recent activity from the last 24h by default. Use --since 7d
2341
2341
  or an ISO timestamp to widen the investigation window. --json returns complete,
2342
2342
  uncapped data.
2343
2343
  `,Tl=5,$B=24*60*60*1e3,ZS=72,QS=80});var wb={};oe(wb,{runRunning:()=>hm});function s2(t){let e=t.split(`
2344
- `,1)[0];return e.length<=mb?e:`${e.slice(0,mb)}\u2026`}function mm(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function pb(t,e){let n=t.target_teamfile,r=t.target_alias;if(n===null||r===null)return pm;let s=e.get(n);if(s===void 0){try{s=$e(n)}catch{s=null}e.set(n,s)}return s===null?pm:ml(s,r)?.model??pm}function _m(t){return t.target!==null?bt(t.target):t.from_identity}function _b(t){return`${_m(t)} ${t.kind} running ${wi(t.started_at)} liveness=${t.holder_liveness} model=${t.model}`}function hb(t){return`${_m(t)} ${t.kind} DEAD -- stale ${wi(t.started_at)}, holder process confirmed dead model=${t.model}`}function gb(t){let e=`${_m(t)} ${t.kind} ${t.status} ran ${Sl(t.ran_ms)}, idle ${wi(t.ended_at)} model=${t.model}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${s2(t.error)}`),e}function yb(t){let e=new Map(t.map(i=>[i.id,i])),n=new Map,r=[];for(let i of t){let o=i.parent_invocation_id;if(o!==null&&e.has(o)){let a=n.get(o)??[];a.push(i),n.set(o,a)}else r.push(i)}let s=(i,o)=>o.started_at.localeCompare(i.started_at);r.sort(s);for(let i of n.values())i.sort(s);return{roots:r,childrenByParent:n}}function i2(t){let{roots:e,childrenByParent:n}=yb(t),r=[],s=(i,o)=>{r.push(`${" ".repeat(o+1)}${i.line}`);for(let a of n.get(i.id)??[])s(a,o+1)};for(let i of e)s(i,0);return r}function o2(t,e,n){let r=[...t.map(a=>({state:"running",...a})),...e.map(a=>({state:"dead",...a})),...n.map(a=>({state:"idle",...a}))],{roots:s,childrenByParent:i}=yb(r),o=a=>({...a,children:(i.get(a.id)??[]).map(o)});return s.map(o)}async function hm(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${r2}
2345
- `),0;let n=Y(t,[],["--json","--tree"]);if(n.error!==void 0)return k(e,n.error);let r=n.flags["--json"]===!0,s=n.flags["--tree"]===!0;return $(e,i=>{let o=Date.now(),a=i.listAllRunningTrackedInvocations(),l=new Map,c=[],u=[];for(let y of a){let g=Xt(y),w=o-new Date(y.started_at).getTime(),T={id:y.id,kind:y.kind,origin:y.origin,from_identity:y.from_identity,target:mm(y),model:pb(y,l),started_at:y.started_at,parent_invocation_id:y.parent_invocation_id};if(g==="dead"){if(rs(i,y)!==null)continue;u.push({...T,stale_for_ms:w})}else c.push({...T,running_for_ms:w,holder_liveness:g??"unknown"})}let d=new Set(a.map(mm).filter(y=>y!==null)),f=new Date(o-n2).toISOString(),m=i.listRecentlyFinishedTrackedInvocations(f),p=new Set,h=[];for(let y of m){let g=mm(y);g===null||d.has(g)||p.has(g)||(p.add(g),h.push({id:y.id,kind:y.kind,origin:y.origin,from_identity:y.from_identity,target:g,model:pb(y,l),status:y.status,started_at:y.started_at,ended_at:y.ended_at,idle_ms:o-new Date(y.ended_at).getTime(),ran_ms:new Date(y.ended_at).getTime()-new Date(y.started_at).getTime(),error:y.error,parent_invocation_id:y.parent_invocation_id}))}if(r)return s?X(e,{schema_version:fb,tree:o2(c,u,h)}):X(e,{schema_version:fb,running:c,dead:u,idle:h}),0;if(s){let y=[...c.map(w=>({id:w.id,parent_invocation_id:w.parent_invocation_id,started_at:w.started_at,line:_b(w)})),...u.map(w=>({id:w.id,parent_invocation_id:w.parent_invocation_id,started_at:w.started_at,line:hb(w)})),...h.map(w=>({id:w.id,parent_invocation_id:w.parent_invocation_id,started_at:w.started_at,line:gb(w)}))],g=i2(y);return e.stdout.write(`${g.length>0?g.join(`
2344
+ `,1)[0];return e.length<=mb?e:`${e.slice(0,mb)}\u2026`}function mm(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function pb(t,e){let n=t.target_teamfile,r=t.target_alias;if(n===null||r===null)return pm;let s=e.get(n);if(s===void 0){try{s=$e(n)}catch{s=null}e.set(n,s)}return s===null?pm:ml(s,r)?.model??pm}function _m(t){return t.target!==null?St(t.target):t.from_identity}function _b(t){return`${_m(t)} ${t.kind} running ${wi(t.started_at)} liveness=${t.holder_liveness} model=${t.model}`}function hb(t){return`${_m(t)} ${t.kind} DEAD -- stale ${wi(t.started_at)}, holder process confirmed dead model=${t.model}`}function gb(t){let e=`${_m(t)} ${t.kind} ${t.status} ran ${Sl(t.ran_ms)}, idle ${wi(t.ended_at)} model=${t.model}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${s2(t.error)}`),e}function yb(t){let e=new Map(t.map(i=>[i.id,i])),n=new Map,r=[];for(let i of t){let o=i.parent_invocation_id;if(o!==null&&e.has(o)){let a=n.get(o)??[];a.push(i),n.set(o,a)}else r.push(i)}let s=(i,o)=>o.started_at.localeCompare(i.started_at);r.sort(s);for(let i of n.values())i.sort(s);return{roots:r,childrenByParent:n}}function i2(t){let{roots:e,childrenByParent:n}=yb(t),r=[],s=(i,o)=>{r.push(`${" ".repeat(o+1)}${i.line}`);for(let a of n.get(i.id)??[])s(a,o+1)};for(let i of e)s(i,0);return r}function o2(t,e,n){let r=[...t.map(a=>({state:"running",...a})),...e.map(a=>({state:"dead",...a})),...n.map(a=>({state:"idle",...a}))],{roots:s,childrenByParent:i}=yb(r),o=a=>({...a,children:(i.get(a.id)??[]).map(o)});return s.map(o)}async function hm(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${r2}
2345
+ `),0;let n=Y(t,[],["--json","--tree"]);if(n.error!==void 0)return k(e,n.error);let r=n.flags["--json"]===!0,s=n.flags["--tree"]===!0;return $(e,i=>{let o=Date.now(),a=i.listAllRunningTrackedInvocations(),l=new Map,c=[],u=[];for(let y of a){let g=Xt(y),w=o-new Date(y.started_at).getTime(),T={id:y.id,kind:y.kind,origin:y.origin,from_identity:y.from_identity,target:mm(y),model:pb(y,l),started_at:y.started_at,parent_invocation_id:y.parent_invocation_id};if(g==="dead"){if(rs(i,y)!==null)continue;u.push({...T,stale_for_ms:w})}else c.push({...T,running_for_ms:w,holder_liveness:g??"unknown"})}let d=new Set(a.map(mm).filter(y=>y!==null)),f=new Date(o-n2).toISOString(),m=i.listRecentlyFinishedTrackedInvocations(f),p=new Set,h=[];for(let y of m){let g=mm(y);g===null||d.has(g)||p.has(g)||(p.add(g),h.push({id:y.id,kind:y.kind,origin:y.origin,from_identity:y.from_identity,target:g,model:pb(y,l),status:y.status,started_at:y.started_at,ended_at:y.ended_at,idle_ms:o-new Date(y.ended_at).getTime(),ran_ms:new Date(y.ended_at).getTime()-new Date(y.started_at).getTime(),error:y.error,parent_invocation_id:y.parent_invocation_id}))}if(r)return s?J(e,{schema_version:fb,tree:o2(c,u,h)}):J(e,{schema_version:fb,running:c,dead:u,idle:h}),0;if(s){let y=[...c.map(w=>({id:w.id,parent_invocation_id:w.parent_invocation_id,started_at:w.started_at,line:_b(w)})),...u.map(w=>({id:w.id,parent_invocation_id:w.parent_invocation_id,started_at:w.started_at,line:hb(w)})),...h.map(w=>({id:w.id,parent_invocation_id:w.parent_invocation_id,started_at:w.started_at,line:gb(w)}))],g=i2(y);return e.stdout.write(`${g.length>0?g.join(`
2346
2346
  `):" none"}
2347
2347
  `),0}let _=[];_.push(`Running (${c.length}):`),c.length===0&&_.push(" none");for(let y of c)_.push(` ${_b(y)}`);_.push(""),_.push(`Dead (reclaimable) (${u.length}):`),u.length===0&&_.push(" none");for(let y of u)_.push(` ${hb(y)}`);_.push(""),_.push(`Idle, finished in the last 24h (${h.length}):`),h.length===0&&_.push(" none");for(let y of h)_.push(` ${gb(y)}`);return e.stdout.write(`${_.join(`
2348
2348
  `)}
2349
- `),0})}var n2,fb,r2,mb,pm,gm=E(()=>{"use strict";ft();hi();Dt();Ie();bl();n2=24*60*60*1e3,fb=3,r2=["usage: lmctl running [--json] [--tree]","","Shows tracked_invocation activity DB-wide across the whole fleet, split","into three sections (flat mode, the default):",' - Running: status="running" with a live (or unverifiable cross-host)'," holder -- genuinely in-flight work.",' - Dead (reclaimable): status="running" but the holder process is'," confirmed dead -- an orphaned record, not active work. Its elapsed",' time is reported as staleness, not as "running", so a dead worker'," is never mistaken for one that is genuinely still building."," - Idle: targets with nothing running or dead, showing their most"," recent finish from the last 24 hours and how long they've been"," idle since.","","--tree shows the same rows as one hierarchical dispatch-lineage view","instead: no section headers (each row already carries its own status),","indented under the session that dispatched it (who woke whom), sorted","by the most recent root session first. A node is a specific turn at a","specific time, not a team:alias identity -- the same member can appear","as multiple nodes for its different turns. Lineage is only known for","turns dispatched by a NESTED `lmctl chat`/`lmctl terminal` call made","from within another turn's own tool calls; anything else (a human's","direct dispatch, or a turn from before this feature existed) has no","recorded parent and shows as its own root.","","Every row also carries `model`: the target member's declared `model=`",'read straight from its teamfile (no session/provider query) -- "default"',"when the teamfile has no model= attribute, the alias/file can't be","resolved, or there is no target at all. This is the DECLARED value only,","not necessarily what actually ran (see `lmctl health`'s MODEL column).","","--json emits { schema_version, running, dead, idle } (flat, one array","per section, matching the three flat-mode sections -- each row carries","its own status/timing/error fields). --tree --json instead emits","{ schema_version, tree } -- an array of root nodes, each row's full",'fields plus a "state" discriminant ("running"/"dead"/"idle") and a','"children" array of the same shape, nested per the dispatch lineage.',"","Queries lmctl's own database only -- never touches native provider","session files."].join(`
2350
- `),mb=120;pm="default"});import{basename as a2}from"node:path";function c2(t){return t.replace(l2,e=>{let n=a2(e);return e.endsWith(".lmctl")?n:`.../${n}`})}function ym(t){if(Array.isArray(t))return t.map(ym);if(t===null||typeof t!="object")return t;let e={};for(let[n,r]of Object.entries(t))(n==="target"||n==="from_identity")&&typeof r=="string"?e[n]=bt(r):n==="error"&&typeof r=="string"?e[n]=c2(r):e[n]=ym(r);return e}function f2(){let t="";return{io:{stdout:{write:n=>(t+=n,!0)},stderr:{write:()=>!0}},text:()=>t}}async function Eb(t,e,n){let r=t.LMCTL_CLOUD_REPORT_APPKEY;if(!(r===void 0||r===""))try{let s=t.LMCTL_CLOUD_REPORT_URL??d2,i=gi().device_id,{io:o,text:a}=f2();await hm(["--tree","--json"],o);let l=ym(JSON.parse(a())),c=await n(s,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${r}`},body:JSON.stringify({device_id:i,payload:l})});!c.ok&&c.status!==429&&e(`running-reporter: report rejected (${c.status})`)}catch(s){e(`running-reporter: report failed: ${s instanceof Error?s.message:String(s)}`)}}function Tb(t=process.env,e=r=>process.stderr.write(`${r}
2351
- `),n=fetch){if(t.LMCTL_CLOUD_REPORT_APPKEY===void 0||t.LMCTL_CLOUD_REPORT_APPKEY==="")return null;let r=Number.parseInt(t.LMCTL_CLOUD_REPORT_INTERVAL_MS??"",10)||u2;Eb(t,e,n);let s=setInterval(()=>void Eb(t,e,n),r);return s.unref?.(),{stop:()=>clearInterval(s)}}var l2,d2,u2,vb=E(()=>{"use strict";ul();gm();bl();l2=/\/(?:[^\s"'/()]+\/)+[^\s"'/()]+/g;d2="https://lmctl.ai/api/running/report",u2=45e3});import{mkdirSync as m2,readFileSync as p2,readdirSync as _2,statSync as h2,writeFileSync as g2}from"node:fs";import{dirname as y2,join as bb,sep as Sb}from"node:path";function kl(t){return{s3:{async send(r){let s=r;switch(s._localfsTag){case kb:return w2(t,s.input);case Ib:return E2(t,s.input);case Nb:return T2(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Tm,GetObjectCommand:Em,PutObjectCommand:wm}}}function w2(t,e){let n=Ab(t,e.Key);return m2(y2(n),{recursive:!0}),g2(n,e.Body),{}}function E2(t,e){let n=Ab(t,e.Key),r;try{r=p2(n)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=r.toString("utf-8");return{Body:{transformToString:async()=>s}}}function T2(t,e){let n=e.Prefix??"";xb(n);let s=v2(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(n)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(u=>u.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function Ab(t,e){return xb(e),bb(t,e)}function xb(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function v2(t){let e=[],n=(r,s)=>{let i;try{i=_2(r,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=bb(r,o.name);if(o.isDirectory())n(l,a);else if(o.isFile()){let c=Sb==="/"?a:a.split(Sb).join("/");e.push({key:c,lastModified:h2(l).mtime})}}};return n(t,""),e}var kb,Ib,Nb,wm,Em,Tm,vm=E(()=>{"use strict";kb="localfs-put",Ib="localfs-get",Nb="localfs-list",wm=class{input;_localfsTag=kb;constructor(e){this.input=e}},Em=class{input;_localfsTag=Ib;constructor(e){this.input=e}},Tm=class{input;_localfsTag=Nb;constructor(e){this.input=e}}});function Rb(){return{put:0,get:0,list:0}}function Sm(t,e=S2){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function bm(t){let e=new Date(t),n=e.getUTCFullYear(),r=String(e.getUTCMonth()+1).padStart(2,"0");return`${n}-${r}`}var S2,Il,km=E(()=>{"use strict";S2={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Il=class{counts=Rb();record(e,n=1){this.counts[e]+=n}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Rb(),e}estimateCostUsd(e){return Sm(this.counts,e)}}});function Ob(t){let e=t.now??Date.now,n=t.timers??b2,r=null,s=null;async function i(){let l=e(),c=bm(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=Sm(m);if(r!==c&&p>=t.ceilingUsd){r=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 o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=n.setInterval(()=>{o()},t.intervalMs);return{stop(){n.clearInterval(a)},flushNow(){return o()},isOverQuota(){return r!==null&&r===bm(e())}}}var b2,Lb=E(()=>{"use strict";km();b2={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Im=E(()=>{"use strict";Ka();Ya();Ya()});function k2(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 i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}let n=e.request;if(typeof n!="object"||n===null)return null;let r=n;return typeof r.method!="string"||r.method===""||typeof r.path!="string"||r.path===""?null:{message_id:e.message_id,request:r}}function I2(t){return t.reply_to!==void 0&&t.response!==void 0}function N2(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Cb(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let n=new Error("Aborted");return n.name="AbortError",n}}var Nl,Ei,$b=E(()=>{"use strict";Im();Nl=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Ei=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,n){if(this.stopped)throw new Nl("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let r=e.method;if(typeof r!="string"||r==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=hn(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=n?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let c=n?.abortSignal,u;if(c!==void 0){if(c.aborted){l(Cb(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Cb(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:i,payload:o}).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 n=new Nl;for(let r of e){r.abortListener!==void 0&&r.abortSignal!==void 0&&r.abortSignal.removeEventListener("abort",r.abortListener);try{r.reject(n)}catch{}}}async handleIncoming(e,n){let r=k2(e);if(r===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(I2(r)){let l=this.pending.get(r.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${r.reply_to}`);return}this.pending.delete(r.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(r.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${r.message_id}`);return}let s=n?.conversation_id??N2(e)??r.message_id,i;try{i=await this.requestHandler(r.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:hn(this.now(),this.random),reply_to:r.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${r.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function Nm(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 Mb=E(()=>{"use strict"});function Am(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 n of e.events)if(typeof n!="object"||n===null||Array.isArray(n)||typeof n.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var Db=E(()=>{"use strict"});function Rm(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 n of e.workflows){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let r=n;if(typeof r.teamfile_path!="string"||r.teamfile_path===""||r.name!==null&&typeof r.name!="string"||typeof r.registered_at!="string"||r.registered_at===""||r.last_seeded_at!==null&&typeof r.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 n=e.entry;if(typeof n.id!="number"||typeof n.root_teamfile!="string"||n.root_teamfile===""||n.sender_teamfile!==null&&(typeof n.sender_teamfile!="string"||n.sender_teamfile==="")||n.sender_alias!==null&&(typeof n.sender_alias!="string"||n.sender_alias==="")||typeof n.receiver_teamfile!="string"||n.receiver_teamfile===""||typeof n.receiver_alias!="string"||n.receiver_alias===""||typeof n.message!="string"||n.response!==null&&typeof n.response!="string"||typeof n.status!="string"||n.status===""||typeof n.created_at!="string"||n.created_at==="")return!1}return!0}var xm,jb=E(()=>{"use strict";xm="daemon:events"});function Fb(t){return{kind:"prompt",prompt_id:t.prompt_id??hn(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Om(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 Pb,Lm=E(()=>{"use strict";Im();Pb="prompt:root"});function Ti(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(Wb(e[1]));return typeof n.sub=="string"&&n.sub!==""?n.sub:null}catch{return null}}function A2(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(Wb(e[1]));return typeof n.exp=="number"&&Number.isFinite(n.exp)?n.exp:null}catch{return null}}function Ub(t,e=60){if(typeof t!="string"||t==="")return!0;let n=A2(t);return n===null?!0:Date.now()/1e3>=n-e}function Wb(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.padEnd(Math.ceil(e.length/4)*4,"="),r=globalThis.Buffer;return r!==void 0?r.from(n,"base64").toString("utf8"):atob(n)}var Cm=E(()=>{"use strict"});async function Al(t){let e=t.fetchImpl??fetch,n=`https://cognito-idp.${t.region}.amazonaws.com/`,r=await e(n,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":x2},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await r.text();if(!r.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${r.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var x2,$m=E(()=>{"use strict";x2="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as qb,mkdirSync as Hb,readFileSync as Bb,writeFileSync as Xb}from"node:fs";import{homedir as Jb}from"node:os";import{dirname as Gb,join as Kb}from"node:path";function vi(){return process.env.LMCTL_DEVICE_AUTH_PATH??Kb(Jb(),".lmctl","device-auth.json")}function Vb(){return process.env.LMCTL_TOKEN_PATH??Kb(Jb(),".lmctl","cli-tokens.json")}function Mm(t=vi()){try{let e=JSON.parse(Bb(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 Yb(t,e=vi()){Hb(Gb(e),{recursive:!0,mode:448}),Xb(e,JSON.stringify(t,null,2));try{qb(e,384)}catch{}}function Dm(t,e=Vb()){let n={};try{n=JSON.parse(Bb(e,"utf8"))}catch{}let r={...n.cognito??{}};r.idToken=t.idToken,t.accessToken!==void 0&&(r.accessToken=t.accessToken),t.refreshToken!==void 0&&(r.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(r.expiresAt=t.expiresAt);let s={...n,cognito:r};Hb(Gb(e),{recursive:!0,mode:448}),Xb(e,JSON.stringify(s,null,2));try{qb(e,384)}catch{}}async function zb(t){let e=t.deviceAuthPath??vi(),n=Mm(e);if(n===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let r=await Al({region:t.region,clientId:t.clientId,refreshToken:n.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Dm({idToken:r.idToken,...r.accessToken!==void 0?{accessToken:r.accessToken}:{},refreshToken:n.refreshToken,...r.expiresAt!==void 0?{expiresAt:r.expiresAt}:{}},t.cliTokensPath??Vb()),{idToken:r.idToken,userId:n.userId}}var jm=E(()=>{"use strict";$m()});import{existsSync as R2,realpathSync as O2}from"node:fs";import{dirname as L2}from"node:path";function Pm(t){C2(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function C2(t){let e=t.payload.root_teamfile;try{e=O2(t.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return is({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"root_unavailable"}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let i=`prompt root is not registered: ${e}`;return is({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unregistered"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let n=M2(e);if("error"in n)return is({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:n.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=br(t.store,{receiver_teamfile:e,receiver_alias:n.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:F2(t.env??process.env)});if(!r.acquired){let i=P2(n.alias,r.current);return is({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=no(i=>t.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:nh(t.env??process.env)});try{let o=await(t.chat??dn)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:n.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=o.status==="stalled",l=!a&&o.text.trim()==="",c=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return u==="ok"?await D2(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,response:o.text,status:u,error_detail:null,log:t.log}):is({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:u,response:u==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return is({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{t.store.releaseAgentInflight(r.lease,r.leaseId)}catch(i){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function is(t){C({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:$2(t.message)})}function $2(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function M2(t){if(!R2(t))return{error:`prompt root missing/unreadable: ${t}`};let e=$e(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let n=Et(e);return n===void 0?{error:`prompt root has no Lead: ${t}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??L2(t)}}async function D2(t,e){let n=ek(e.message),r=e.response===null?null:ek(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:n.text,response:r?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.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 ek(t){return t.length<=Zb?{text:t,truncated:!1}:{text:t.slice(0,Zb),truncated:!0}}function j2(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function P2(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:j2(t,e)}function F2(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Qb;let n=Number(e);return!Number.isFinite(n)||n<=0?Qb:n}var Zb,Qb,tk=E(()=>{"use strict";gt();Dt();ae();ft();Zb=256*1024,Qb=30*60*1e3});import{chmodSync as ak,existsSync as U2,mkdirSync as lk,readFileSync as Ll,writeFileSync as ck}from"node:fs";import{dirname as Fm,resolve as xl,join as dk}from"node:path";import{fileURLToPath as W2}from"node:url";import{homedir as uk}from"node:os";import{CognitoIdentityClient as q2,GetIdCommand as H2}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as nk}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as B2,ListObjectsV2Command as X2,PutObjectCommand as J2,S3Client as rk}from"@aws-sdk/client-s3";function bi(t={}){let e=t.env??process.env,n=t.tfstatePath!==void 0?[t.tfstatePath]:z2(t.selfUrl),r={},s;for(let N of n)if(U2(N)){r=Y2(N),s=N;break}let i=(...N)=>{for(let b of N)if(typeof b=="string"&&b!=="")return b},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??G2,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??K2,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??V2,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??Cl,d=[];o===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:n,...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=Ol(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),_=Ol(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),y=Ol(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),g=Ol(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=i(e.LMCTL_MAILBOX_KEY),T=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},..._!==void 0?{heartbeatIdleMs:_}:{},...y!==void 0?{backoffReadIntervalMs:y}:{},...g!==void 0?{chatLogPollIntervalMs:g}:{},...w!==void 0?{mailboxKey:w}:{},...T!==void 0?{tokenPath:T}:{}},f}function Y2(t){try{let e=Ll(t,"utf8"),r=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(r))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function z2(t){let e=Fm(W2(t??import.meta.url));return[xl(e,"..","..","..","..","infra","terraform","terraform.tfstate"),xl(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),xl(e,"..","..","..","infra","terraform","terraform.tfstate"),xl(e,"..","..","infra","terraform","terraform.tfstate")]}function Ol(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function Z2(t){let e=Q2(t.intervalMs)??fk,n=Math.max(1,Math.trunc(t.limit??500)),r=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,i,o=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return i=d.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(r()).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||o)){o=!0;try{if(i===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(i,n);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:r(),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(r()).toISOString()}),i=Math.max(i,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{o=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function Q2(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function mk(t){let e=t.tokenPath??dk(uk(),".lmctl","cli-tokens.json"),n=ik(t.tokenPath);if(Ub(n.cognito?.idToken)&&Mm()!==null)try{await zb({region:t.region,clientId:t.cognitoClientId??Cl,cliTokensPath:e}),n=ik(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let O=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${O}`)}if(n.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 r=n.cognito.idToken;if(typeof r!="string"||r==="")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}`,i=n.cognito.identityId,o=!1;i===void 0||i===""?i=await ok({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=nk({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new rk({region:t.region,credentials:a}),c={ListObjectsV2Command:X2,GetObjectCommand:B2,PutObjectCommand:J2},u=Ti(r),d=u??i,f=t.deviceId,m=Zr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let x=p.loadMailboxCursor(d,m);if(x!==null)h=x.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let O=!1,W=0;for(;!O&&W<2;){W+=1;try{let I=Ja(m,"web"),A=0,D;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...D!==void 0?{ContinuationToken:D}:{}}));for(let q of J.Contents??[]){let F=Ga(q.Key??"",m,"web");F!==void 0&&F>A&&(A=F)}D=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(D!==void 0);h=A,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${A} for user_id=${d}`),O=!0}catch(I){let A=I instanceof Error?I.message:String(I);if(o&&W===1&&nX(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${A}); clearing + refreshing`),tX(e),o=!1,i=await ok({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}),a=nk({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new rk({region:t.region,credentials:a}),m=Zr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${A}`);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 _=null,y=t.terminalSessionManager,g=t.persistentSessionManager,w=t.promptTriggerStore,T=new Il,N=new fr({bucket:t.mailboxBucket,identityId:i,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>T.record(x),onMessage:async x=>{if(y!==void 0&&Nm(x.payload)){y.onInbound(x.payload);return}if(g!==void 0&&Am(x.payload)){await g.onInbound(x.payload);return}if(!Rm(x.payload)){if(w!==void 0&&Om(x.payload)){Pm({store:w,payload:x.payload,log:t.log});return}_!==null&&await _.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:x,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}:{}});_=new Ei({client:N,...t.log!==void 0?{log:t.log}:{}}),y!==void 0&&y.setPublish(async x=>N.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),g!==void 0&&g.setPublish(async x=>N.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let b=x=>N.putMessage({conversation_id:xm,payload:x});N.start();let R=t.chatLogTailStore===void 0?void 0:Z2({store:t.chatLogTailStore,publishDaemonEvent:b,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??fk,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let K=t.deviceId??i,j=`${d}/usage/`,U;return U=t.usageStore===void 0?void 0:Ob({meter:T,store:t.usageStore,userId:d,deviceId:K,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:O,ceilingUsd:W})=>{t.log?.(`[usage] month ${x} cost $${O.toFixed(4)} >= ceiling $${W} \u2014 blocking mailbox`),N.stop().catch(()=>{}),U?.stop()},publishOwnRollup:async(x,O)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${j}${K}-${x}.json`,Body:JSON.stringify({...O,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let O={put:0,get:0,list:0},W;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:j,MaxKeys:1e3,...W!==void 0?{ContinuationToken:W}:{}}));for(let A of I.Contents??[]){let D=A.Key??"";if(D.endsWith(`-${x}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:D}));if(J.Body===void 0)continue;let q=JSON.parse(await J.Body.transformToString("utf-8"));O.put+=q.put??0,O.get+=q.get??0,O.list+=q.list??0}catch{}}W=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(W!==void 0);return O},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:N,fetchClient:_,publishDaemonEvent:b,async stop(){R?.stop(),U!==void 0&&(await U.flushNow().catch(()=>{}),U.stop()),await _.stop().catch(()=>{}),await N.stop().catch(()=>{})}}}async function pk(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:kl(t.rootDir),n=Zr({identityId:Si,userId:Si,deviceId:sk}),r=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new fr({bucket:"local",identityId:Si,userId:Si,deviceId:sk,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Nm(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&Am(c.payload)){await i.onInbound(c.payload);return}if(!Rm(c.payload)){if(o!==void 0&&Om(c.payload)){Pm({store:o,payload:c.payload,log:t.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Rl,readIntervalMs:t.readIntervalMs??Rl,heartbeatIdleMs:t.heartbeatIdleMs??Rl,backoffReadIntervalMs:t.backoffReadIntervalMs??Rl});r=new Ei({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})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:xm,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${n} (local-fs ${t.rootDir})`),{identityId:Si,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function ik(t){let e=t??dk(uk(),".lmctl","cli-tokens.json");try{let n=Ll(e,"utf8");return JSON.parse(n)}catch{return{}}}function eX(t,e){if(e===void 0||e==="")return;let n={};try{let s=Ll(t,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:e}};lk(Fm(t),{recursive:!0,mode:448}),ck(t,JSON.stringify(r,null,2));try{ak(t,384)}catch{}}function tX(t){let e={};try{let r=Ll(t,"utf8");e=JSON.parse(r)}catch{return}if(e.cognito===void 0)return;let n={...e,cognito:{...e.cognito}};delete n.cognito.identityId,lk(Fm(t),{recursive:!0,mode:448}),ck(t,JSON.stringify(n,null,2));try{ak(t,384)}catch{}}async function ok(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new q2({region:t.region}).send(new H2({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{eX(t.tokenPath,n.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${t.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function nX(t){if(t===null||typeof t!="object")return!1;let e=t,n=[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 n)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let r=typeof e.message=="string"?e.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var fk,Rl,Cl,G2,K2,V2,Si,sk,Um=E(()=>{"use strict";za();vm();km();Lb();$b();Mb();Db();jb();Lm();Ka();Cm();jm();tk();fk=3e3,Rl=1e3,Cl="79u5jhkk46qofog661c9i0bdcs",G2="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",K2="us-east-1_4iUdFggDn",V2="lmctl-next-preview-mailbox-254332045686";Si="local",sk="local"});import{spawn as Bm}from"node:child_process";import{createInterface as _k}from"node:readline";var Wm,qm,Hm,hk,gk=E(()=>{"use strict";vo();ae();js();Wm=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,n){this.ctx=n;let r=Bm(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=_k({input:r.stdout}),this.rl.on("line",s=>{n.generation===n.currentGeneration()&&this.handleLine(s)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),n.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return r}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 n=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(n);this.ctx?.turnMap.delete(n),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(r){throw this.ctx?.turnMap.delete(n),r}}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,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:n});try{this.child.stdin.write(o+`
2349
+ `),0})}var n2,fb,r2,mb,pm,gm=E(()=>{"use strict";ut();hi();Dt();Ie();bl();n2=24*60*60*1e3,fb=3,r2=["usage: lmctl running [--json] [--tree]","","Shows tracked_invocation activity DB-wide across the whole fleet, split","into three sections (flat mode, the default):",' - Running: status="running" with a live (or unverifiable cross-host)'," holder -- genuinely in-flight work.",' - Dead (reclaimable): status="running" but the holder process is'," confirmed dead -- an orphaned record, not active work. Its elapsed",' time is reported as staleness, not as "running", so a dead worker'," is never mistaken for one that is genuinely still building."," - Idle: targets with nothing running or dead, showing their most"," recent finish from the last 24 hours and how long they've been"," idle since.","","--tree shows the same rows as one hierarchical dispatch-lineage view","instead: no section headers (each row already carries its own status),","indented under the session that dispatched it (who woke whom), sorted","by the most recent root session first. A node is a specific turn at a","specific time, not a team:alias identity -- the same member can appear","as multiple nodes for its different turns. Lineage is only known for","turns dispatched by a NESTED `lmctl chat`/`lmctl terminal` call made","from within another turn's own tool calls; anything else (a human's","direct dispatch, or a turn from before this feature existed) has no","recorded parent and shows as its own root.","","Every row also carries `model`: the target member's declared `model=`",'read straight from its teamfile (no session/provider query) -- "default"',"when the teamfile has no model= attribute, the alias/file can't be","resolved, or there is no target at all. This is the DECLARED value only,","not necessarily what actually ran (see `lmctl health`'s MODEL column).","","--json emits { schema_version, running, dead, idle } (flat, one array","per section, matching the three flat-mode sections -- each row carries","its own status/timing/error fields). --tree --json instead emits","{ schema_version, tree } -- an array of root nodes, each row's full",'fields plus a "state" discriminant ("running"/"dead"/"idle") and a','"children" array of the same shape, nested per the dispatch lineage.',"","Queries lmctl's own database only -- never touches native provider","session files."].join(`
2350
+ `),mb=120;pm="default"});import{basename as a2}from"node:path";function c2(t){return t.replace(l2,e=>{let n=a2(e);return e.endsWith(".lmctl")?n:`.../${n}`})}function ym(t){if(Array.isArray(t))return t.map(ym);if(t===null||typeof t!="object")return t;let e={};for(let[n,r]of Object.entries(t))(n==="target"||n==="from_identity")&&typeof r=="string"?e[n]=St(r):n==="error"&&typeof r=="string"?e[n]=c2(r):e[n]=ym(r);return e}function f2(){let t="";return{io:{stdout:{write:n=>(t+=n,!0)},stderr:{write:()=>!0}},text:()=>t}}async function Eb(t,e,n){let r=t.LMCTL_CLOUD_REPORT_APPKEY;if(!(r===void 0||r===""))try{let s=t.LMCTL_CLOUD_REPORT_URL??d2,i=gi().device_id,{io:o,text:a}=f2();await hm(["--tree","--json"],o);let l=ym(JSON.parse(a())),c=await n(s,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${r}`},body:JSON.stringify({device_id:i,payload:l})});!c.ok&&c.status!==429&&e(`running-reporter: report rejected (${c.status})`)}catch(s){e(`running-reporter: report failed: ${s instanceof Error?s.message:String(s)}`)}}function Tb(t=process.env,e=r=>process.stderr.write(`${r}
2351
+ `),n=fetch){if(t.LMCTL_CLOUD_REPORT_APPKEY===void 0||t.LMCTL_CLOUD_REPORT_APPKEY==="")return null;let r=Number.parseInt(t.LMCTL_CLOUD_REPORT_INTERVAL_MS??"",10)||u2;Eb(t,e,n);let s=setInterval(()=>void Eb(t,e,n),r);return s.unref?.(),{stop:()=>clearInterval(s)}}var l2,d2,u2,vb=E(()=>{"use strict";ul();gm();bl();l2=/\/(?:[^\s"'/()]+\/)+[^\s"'/()]+/g;d2="https://lmctl.ai/api/running/report",u2=45e3});import{mkdirSync as m2,readFileSync as p2,readdirSync as _2,statSync as h2,writeFileSync as g2}from"node:fs";import{dirname as y2,join as bb,sep as Sb}from"node:path";function kl(t){return{s3:{async send(r){let s=r;switch(s._localfsTag){case kb:return w2(t,s.input);case Ib:return E2(t,s.input);case Nb:return T2(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Tm,GetObjectCommand:Em,PutObjectCommand:wm}}}function w2(t,e){let n=Ab(t,e.Key);return m2(y2(n),{recursive:!0}),g2(n,e.Body),{}}function E2(t,e){let n=Ab(t,e.Key),r;try{r=p2(n)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=r.toString("utf-8");return{Body:{transformToString:async()=>s}}}function T2(t,e){let n=e.Prefix??"";xb(n);let s=v2(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(n)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(u=>u.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function Ab(t,e){return xb(e),bb(t,e)}function xb(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function v2(t){let e=[],n=(r,s)=>{let i;try{i=_2(r,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=bb(r,o.name);if(o.isDirectory())n(l,a);else if(o.isFile()){let c=Sb==="/"?a:a.split(Sb).join("/");e.push({key:c,lastModified:h2(l).mtime})}}};return n(t,""),e}var kb,Ib,Nb,wm,Em,Tm,vm=E(()=>{"use strict";kb="localfs-put",Ib="localfs-get",Nb="localfs-list",wm=class{input;_localfsTag=kb;constructor(e){this.input=e}},Em=class{input;_localfsTag=Ib;constructor(e){this.input=e}},Tm=class{input;_localfsTag=Nb;constructor(e){this.input=e}}});function Rb(){return{put:0,get:0,list:0}}function Sm(t,e=S2){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function bm(t){let e=new Date(t),n=e.getUTCFullYear(),r=String(e.getUTCMonth()+1).padStart(2,"0");return`${n}-${r}`}var S2,Il,km=E(()=>{"use strict";S2={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Il=class{counts=Rb();record(e,n=1){this.counts[e]+=n}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Rb(),e}estimateCostUsd(e){return Sm(this.counts,e)}}});function Ob(t){let e=t.now??Date.now,n=t.timers??b2,r=null,s=null;async function i(){let l=e(),c=bm(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=Sm(m);if(r!==c&&p>=t.ceilingUsd){r=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 o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=n.setInterval(()=>{o()},t.intervalMs);return{stop(){n.clearInterval(a)},flushNow(){return o()},isOverQuota(){return r!==null&&r===bm(e())}}}var b2,Lb=E(()=>{"use strict";km();b2={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Im=E(()=>{"use strict";Ka();Ya();Ya()});function k2(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 i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}let n=e.request;if(typeof n!="object"||n===null)return null;let r=n;return typeof r.method!="string"||r.method===""||typeof r.path!="string"||r.path===""?null:{message_id:e.message_id,request:r}}function I2(t){return t.reply_to!==void 0&&t.response!==void 0}function N2(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Cb(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let n=new Error("Aborted");return n.name="AbortError",n}}var Nl,Ei,$b=E(()=>{"use strict";Im();Nl=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Ei=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,n){if(this.stopped)throw new Nl("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let r=e.method;if(typeof r!="string"||r==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=hn(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=n?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let c=n?.abortSignal,u;if(c!==void 0){if(c.aborted){l(Cb(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Cb(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:i,payload:o}).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 n=new Nl;for(let r of e){r.abortListener!==void 0&&r.abortSignal!==void 0&&r.abortSignal.removeEventListener("abort",r.abortListener);try{r.reject(n)}catch{}}}async handleIncoming(e,n){let r=k2(e);if(r===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(I2(r)){let l=this.pending.get(r.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${r.reply_to}`);return}this.pending.delete(r.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(r.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${r.message_id}`);return}let s=n?.conversation_id??N2(e)??r.message_id,i;try{i=await this.requestHandler(r.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:hn(this.now(),this.random),reply_to:r.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${r.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function Nm(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 Mb=E(()=>{"use strict"});function Am(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 n of e.events)if(typeof n!="object"||n===null||Array.isArray(n)||typeof n.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var Db=E(()=>{"use strict"});function Rm(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 n of e.workflows){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let r=n;if(typeof r.teamfile_path!="string"||r.teamfile_path===""||r.name!==null&&typeof r.name!="string"||typeof r.registered_at!="string"||r.registered_at===""||r.last_seeded_at!==null&&typeof r.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 n=e.entry;if(typeof n.id!="number"||typeof n.root_teamfile!="string"||n.root_teamfile===""||n.sender_teamfile!==null&&(typeof n.sender_teamfile!="string"||n.sender_teamfile==="")||n.sender_alias!==null&&(typeof n.sender_alias!="string"||n.sender_alias==="")||typeof n.receiver_teamfile!="string"||n.receiver_teamfile===""||typeof n.receiver_alias!="string"||n.receiver_alias===""||typeof n.message!="string"||n.response!==null&&typeof n.response!="string"||typeof n.status!="string"||n.status===""||typeof n.created_at!="string"||n.created_at==="")return!1}return!0}var xm,jb=E(()=>{"use strict";xm="daemon:events"});function Fb(t){return{kind:"prompt",prompt_id:t.prompt_id??hn(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Om(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 Pb,Lm=E(()=>{"use strict";Im();Pb="prompt:root"});function Ti(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(Wb(e[1]));return typeof n.sub=="string"&&n.sub!==""?n.sub:null}catch{return null}}function A2(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(Wb(e[1]));return typeof n.exp=="number"&&Number.isFinite(n.exp)?n.exp:null}catch{return null}}function Ub(t,e=60){if(typeof t!="string"||t==="")return!0;let n=A2(t);return n===null?!0:Date.now()/1e3>=n-e}function Wb(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.padEnd(Math.ceil(e.length/4)*4,"="),r=globalThis.Buffer;return r!==void 0?r.from(n,"base64").toString("utf8"):atob(n)}var Cm=E(()=>{"use strict"});async function Al(t){let e=t.fetchImpl??fetch,n=`https://cognito-idp.${t.region}.amazonaws.com/`,r=await e(n,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":x2},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await r.text();if(!r.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${r.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var x2,$m=E(()=>{"use strict";x2="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as qb,mkdirSync as Hb,readFileSync as Bb,writeFileSync as Xb}from"node:fs";import{homedir as Jb}from"node:os";import{dirname as Gb,join as Kb}from"node:path";function vi(){return process.env.LMCTL_DEVICE_AUTH_PATH??Kb(Jb(),".lmctl","device-auth.json")}function Vb(){return process.env.LMCTL_TOKEN_PATH??Kb(Jb(),".lmctl","cli-tokens.json")}function Mm(t=vi()){try{let e=JSON.parse(Bb(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 Yb(t,e=vi()){Hb(Gb(e),{recursive:!0,mode:448}),Xb(e,JSON.stringify(t,null,2));try{qb(e,384)}catch{}}function Dm(t,e=Vb()){let n={};try{n=JSON.parse(Bb(e,"utf8"))}catch{}let r={...n.cognito??{}};r.idToken=t.idToken,t.accessToken!==void 0&&(r.accessToken=t.accessToken),t.refreshToken!==void 0&&(r.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(r.expiresAt=t.expiresAt);let s={...n,cognito:r};Hb(Gb(e),{recursive:!0,mode:448}),Xb(e,JSON.stringify(s,null,2));try{qb(e,384)}catch{}}async function zb(t){let e=t.deviceAuthPath??vi(),n=Mm(e);if(n===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let r=await Al({region:t.region,clientId:t.clientId,refreshToken:n.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Dm({idToken:r.idToken,...r.accessToken!==void 0?{accessToken:r.accessToken}:{},refreshToken:n.refreshToken,...r.expiresAt!==void 0?{expiresAt:r.expiresAt}:{}},t.cliTokensPath??Vb()),{idToken:r.idToken,userId:n.userId}}var jm=E(()=>{"use strict";$m()});import{existsSync as R2,realpathSync as O2}from"node:fs";import{dirname as L2}from"node:path";function Pm(t){C2(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function C2(t){let e=t.payload.root_teamfile;try{e=O2(t.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return is({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"root_unavailable"}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let i=`prompt root is not registered: ${e}`;return is({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unregistered"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let n=M2(e);if("error"in n)return is({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:n.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=br(t.store,{receiver_teamfile:e,receiver_alias:n.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:F2(t.env??process.env)});if(!r.acquired){let i=P2(n.alias,r.current);return is({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=no(i=>t.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:nh(t.env??process.env)});try{let o=await(t.chat??dn)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:n.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=o.status==="stalled",l=!a&&o.text.trim()==="",c=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return u==="ok"?await D2(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,response:o.text,status:u,error_detail:null,log:t.log}):is({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:u,response:u==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return is({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{t.store.releaseAgentInflight(r.lease,r.leaseId)}catch(i){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function is(t){C({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:$2(t.message)})}function $2(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function M2(t){if(!R2(t))return{error:`prompt root missing/unreadable: ${t}`};let e=$e(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let n=wt(e);return n===void 0?{error:`prompt root has no Lead: ${t}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??L2(t)}}async function D2(t,e){let n=ek(e.message),r=e.response===null?null:ek(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:n.text,response:r?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.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 ek(t){return t.length<=Zb?{text:t,truncated:!1}:{text:t.slice(0,Zb),truncated:!0}}function j2(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function P2(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:j2(t,e)}function F2(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Qb;let n=Number(e);return!Number.isFinite(n)||n<=0?Qb:n}var Zb,Qb,tk=E(()=>{"use strict";ht();Dt();ae();ut();Zb=256*1024,Qb=30*60*1e3});import{chmodSync as ak,existsSync as U2,mkdirSync as lk,readFileSync as Ll,writeFileSync as ck}from"node:fs";import{dirname as Fm,resolve as xl,join as dk}from"node:path";import{fileURLToPath as W2}from"node:url";import{homedir as uk}from"node:os";import{CognitoIdentityClient as q2,GetIdCommand as H2}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as nk}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as B2,ListObjectsV2Command as X2,PutObjectCommand as J2,S3Client as rk}from"@aws-sdk/client-s3";function bi(t={}){let e=t.env??process.env,n=t.tfstatePath!==void 0?[t.tfstatePath]:z2(t.selfUrl),r={},s;for(let N of n)if(U2(N)){r=Y2(N),s=N;break}let i=(...N)=>{for(let b of N)if(typeof b=="string"&&b!=="")return b},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??G2,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??K2,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??V2,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??Cl,d=[];o===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:n,...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=Ol(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),_=Ol(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),y=Ol(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),g=Ol(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=i(e.LMCTL_MAILBOX_KEY),T=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},..._!==void 0?{heartbeatIdleMs:_}:{},...y!==void 0?{backoffReadIntervalMs:y}:{},...g!==void 0?{chatLogPollIntervalMs:g}:{},...w!==void 0?{mailboxKey:w}:{},...T!==void 0?{tokenPath:T}:{}},f}function Y2(t){try{let e=Ll(t,"utf8"),r=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(r))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function z2(t){let e=Fm(W2(t??import.meta.url));return[xl(e,"..","..","..","..","infra","terraform","terraform.tfstate"),xl(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),xl(e,"..","..","..","infra","terraform","terraform.tfstate"),xl(e,"..","..","infra","terraform","terraform.tfstate")]}function Ol(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function Z2(t){let e=Q2(t.intervalMs)??fk,n=Math.max(1,Math.trunc(t.limit??500)),r=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,i,o=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return i=d.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(r()).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||o)){o=!0;try{if(i===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(i,n);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:r(),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(r()).toISOString()}),i=Math.max(i,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{o=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function Q2(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function mk(t){let e=t.tokenPath??dk(uk(),".lmctl","cli-tokens.json"),n=ik(t.tokenPath);if(Ub(n.cognito?.idToken)&&Mm()!==null)try{await zb({region:t.region,clientId:t.cognitoClientId??Cl,cliTokensPath:e}),n=ik(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let O=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${O}`)}if(n.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 r=n.cognito.idToken;if(typeof r!="string"||r==="")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}`,i=n.cognito.identityId,o=!1;i===void 0||i===""?i=await ok({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=nk({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new rk({region:t.region,credentials:a}),c={ListObjectsV2Command:X2,GetObjectCommand:B2,PutObjectCommand:J2},u=Ti(r),d=u??i,f=t.deviceId,m=Zr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let x=p.loadMailboxCursor(d,m);if(x!==null)h=x.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let O=!1,W=0;for(;!O&&W<2;){W+=1;try{let I=Ja(m,"web"),A=0,D;do{let G=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...D!==void 0?{ContinuationToken:D}:{}}));for(let q of G.Contents??[]){let F=Ga(q.Key??"",m,"web");F!==void 0&&F>A&&(A=F)}D=G.IsTruncated===!0?G.NextContinuationToken:void 0}while(D!==void 0);h=A,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${A} for user_id=${d}`),O=!0}catch(I){let A=I instanceof Error?I.message:String(I);if(o&&W===1&&nX(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${A}); clearing + refreshing`),tX(e),o=!1,i=await ok({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}),a=nk({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new rk({region:t.region,credentials:a}),m=Zr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${A}`);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 _=null,y=t.terminalSessionManager,g=t.persistentSessionManager,w=t.promptTriggerStore,T=new Il,N=new fr({bucket:t.mailboxBucket,identityId:i,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>T.record(x),onMessage:async x=>{if(y!==void 0&&Nm(x.payload)){y.onInbound(x.payload);return}if(g!==void 0&&Am(x.payload)){await g.onInbound(x.payload);return}if(!Rm(x.payload)){if(w!==void 0&&Om(x.payload)){Pm({store:w,payload:x.payload,log:t.log});return}_!==null&&await _.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:x,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}:{}});_=new Ei({client:N,...t.log!==void 0?{log:t.log}:{}}),y!==void 0&&y.setPublish(async x=>N.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),g!==void 0&&g.setPublish(async x=>N.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let b=x=>N.putMessage({conversation_id:xm,payload:x});N.start();let R=t.chatLogTailStore===void 0?void 0:Z2({store:t.chatLogTailStore,publishDaemonEvent:b,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??fk,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let K=t.deviceId??i,j=`${d}/usage/`,U;return U=t.usageStore===void 0?void 0:Ob({meter:T,store:t.usageStore,userId:d,deviceId:K,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:O,ceilingUsd:W})=>{t.log?.(`[usage] month ${x} cost $${O.toFixed(4)} >= ceiling $${W} \u2014 blocking mailbox`),N.stop().catch(()=>{}),U?.stop()},publishOwnRollup:async(x,O)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${j}${K}-${x}.json`,Body:JSON.stringify({...O,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let O={put:0,get:0,list:0},W;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:j,MaxKeys:1e3,...W!==void 0?{ContinuationToken:W}:{}}));for(let A of I.Contents??[]){let D=A.Key??"";if(D.endsWith(`-${x}.json`))try{let G=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:D}));if(G.Body===void 0)continue;let q=JSON.parse(await G.Body.transformToString("utf-8"));O.put+=q.put??0,O.get+=q.get??0,O.list+=q.list??0}catch{}}W=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(W!==void 0);return O},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:N,fetchClient:_,publishDaemonEvent:b,async stop(){R?.stop(),U!==void 0&&(await U.flushNow().catch(()=>{}),U.stop()),await _.stop().catch(()=>{}),await N.stop().catch(()=>{})}}}async function pk(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:kl(t.rootDir),n=Zr({identityId:Si,userId:Si,deviceId:sk}),r=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new fr({bucket:"local",identityId:Si,userId:Si,deviceId:sk,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Nm(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&Am(c.payload)){await i.onInbound(c.payload);return}if(!Rm(c.payload)){if(o!==void 0&&Om(c.payload)){Pm({store:o,payload:c.payload,log:t.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Rl,readIntervalMs:t.readIntervalMs??Rl,heartbeatIdleMs:t.heartbeatIdleMs??Rl,backoffReadIntervalMs:t.backoffReadIntervalMs??Rl});r=new Ei({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})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:xm,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${n} (local-fs ${t.rootDir})`),{identityId:Si,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function ik(t){let e=t??dk(uk(),".lmctl","cli-tokens.json");try{let n=Ll(e,"utf8");return JSON.parse(n)}catch{return{}}}function eX(t,e){if(e===void 0||e==="")return;let n={};try{let s=Ll(t,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:e}};lk(Fm(t),{recursive:!0,mode:448}),ck(t,JSON.stringify(r,null,2));try{ak(t,384)}catch{}}function tX(t){let e={};try{let r=Ll(t,"utf8");e=JSON.parse(r)}catch{return}if(e.cognito===void 0)return;let n={...e,cognito:{...e.cognito}};delete n.cognito.identityId,lk(Fm(t),{recursive:!0,mode:448}),ck(t,JSON.stringify(n,null,2));try{ak(t,384)}catch{}}async function ok(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new q2({region:t.region}).send(new H2({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{eX(t.tokenPath,n.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${t.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function nX(t){if(t===null||typeof t!="object")return!1;let e=t,n=[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 n)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let r=typeof e.message=="string"?e.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var fk,Rl,Cl,G2,K2,V2,Si,sk,Um=E(()=>{"use strict";za();vm();km();Lb();$b();Mb();Db();jb();Lm();Ka();Cm();jm();tk();fk=3e3,Rl=1e3,Cl="79u5jhkk46qofog661c9i0bdcs",G2="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",K2="us-east-1_4iUdFggDn",V2="lmctl-next-preview-mailbox-254332045686";Si="local",sk="local"});import{spawn as Bm}from"node:child_process";import{createInterface as _k}from"node:readline";var Wm,qm,Hm,hk,gk=E(()=>{"use strict";vo();ae();js();Wm=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,n){this.ctx=n;let r=Bm(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=_k({input:r.stdout}),this.rl.on("line",s=>{n.generation===n.currentGeneration()&&this.handleLine(s)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),n.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return r}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 n=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(n);this.ctx?.turnMap.delete(n),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(r){throw this.ctx?.turnMap.delete(n),r}}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,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:n});try{this.child.stdin.write(o+`
2352
2352
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,n){if(this.child?.stdin===null||this.child===void 0)return;let r=JSON.stringify({jsonrpc:"2.0",method:e,params:n});try{this.child.stdin.write(r+`
2353
2353
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let n;try{n=JSON.parse(e)}catch{return}if(typeof n.id=="number"&&this.pending.has(n.id)){let o=this.pending.get(n.id);if(this.pending.delete(n.id),n.error!==void 0){let a=n.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(n.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(n);return}let r=typeof n.method=="string"?n.method:void 0;if(r===void 0)return;let s=n.params??{},i=this.normalizeNotification(r,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(e,n){if(e==="thread/started"){let r=n.thread;return typeof r?.id=="string"&&(this.threadId=r.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:n}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:n.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof n.delta=="string"?n.delta:""}};if(e==="item/started"||e==="item/completed"){let r=n.item;return r?.type!==void 0&&r.type!=="agentMessage"&&r.type!=="userMessage"?{event_type:"tool_call",payload:{name:r.name??r.type,status:e==="item/started"?"started":"completed",item:r}}:{event_type:"notification",payload:{method:e,params:n}}}if(e==="turn/completed"){let r=n.turn;return typeof r?.id=="string"&&this.ctx?.turnMap.delete(r.id),{event_type:"turn_complete",payload:n}}if(e==="error"){let r=n.error;return{event_type:"error",payload:{message:typeof r?.message=="string"?r.message:JSON.stringify(n),raw:n}}}return{event_type:"notification",payload:{method:e,params:n}}}},qm=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,n){this.ctx=n;let r=Bm(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=r,r.stdout.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
2354
2354
  `);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),r}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 n=`claude-${Date.now()}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});let r=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(r+`
2355
- `)}catch(s){throw this.ctx?.turnMap.delete(n),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 n;try{n=JSON.parse(e)}catch{return}let r=typeof n.type=="string"?n.type:"";if(r==="system"&&n.subtype==="init"){let s=typeof n.session_id=="string"?n.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:n}}));return}if(r==="assistant"){let i=n.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(r==="result"){let s=typeof n.session_id=="string"?n.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:n.result,session_id:s,raw:n}});return}this.ctx?.emit({event_type:"notification",payload:{method:r,params:n}})}},Hm=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,n){this.ctx=n;let r=e.cwd??process.cwd();if(e.provider==="opencode")try{To(r)}catch(i){C({event:"opencode_config_install_failed",cwd:r,error_message:i instanceof Error?i.message:String(i)})}let s=Bm(e.command,e.args,{cwd:r,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=_k({input:s.stdout}),this.rl.on("line",i=>{n.generation===n.currentGeneration()&&this.handleLine(i)}),s.stderr?.on("data",i=>{if(n.generation!==n.currentGeneration())return;let o=i instanceof Buffer?i.toString("utf8"):String(i);n.emit({event_type:"notification",payload:{source:"stderr",text:o}})});try{await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;if(this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,e.provider==="kimi"){if(this.sessionId===void 0)throw new Error("Kimi ACP session/new response missing sessionId");try{await this.rpc("session/set_config_option",{sessionId:this.sessionId,configId:"mode",value:"auto"})}catch(a){let l=a instanceof Error?a.message:String(a);throw C({event:"acp_permission_mode_failed",provider:e.provider,config_id:"mode",value:"auto",error_message:l}),new Error(`Cannot set Kimi ACP permission mode to auto: ${l}`)}}return n.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}catch(i){try{await this.stop()}catch{}try{s.kill("SIGTERM")}catch{}throw i}}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 n=`acp-${Date.now()}`;this.ctx?.turnMap.set(n,{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(n)}}async stop(){this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0);for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear(),this.child!==void 0&&await et(this.child)}async rpc(e,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:n});try{this.child.stdin.write(o+`
2355
+ `)}catch(s){throw this.ctx?.turnMap.delete(n),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 n;try{n=JSON.parse(e)}catch{return}let r=typeof n.type=="string"?n.type:"";if(r==="system"&&n.subtype==="init"){let s=typeof n.session_id=="string"?n.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:n}}));return}if(r==="assistant"){let i=n.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(r==="result"){let s=typeof n.session_id=="string"?n.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:n.result,session_id:s,raw:n}});return}this.ctx?.emit({event_type:"notification",payload:{method:r,params:n}})}},Hm=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,n){this.ctx=n;let r=e.cwd??process.cwd();if(e.provider==="opencode")try{To(r)}catch(i){C({event:"opencode_config_install_failed",cwd:r,error_message:i instanceof Error?i.message:String(i)})}let s=Bm(e.command,e.args,{cwd:r,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=_k({input:s.stdout}),this.rl.on("line",i=>{n.generation===n.currentGeneration()&&this.handleLine(i)}),s.stderr?.on("data",i=>{if(n.generation!==n.currentGeneration())return;let o=i instanceof Buffer?i.toString("utf8"):String(i);n.emit({event_type:"notification",payload:{source:"stderr",text:o}})});try{await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;if(this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,e.provider==="kimi"){if(this.sessionId===void 0)throw new Error("Kimi ACP session/new response missing sessionId");try{await this.rpc("session/set_config_option",{sessionId:this.sessionId,configId:"mode",value:"auto"})}catch(a){let l=a instanceof Error?a.message:String(a);throw C({event:"acp_permission_mode_failed",provider:e.provider,config_id:"mode",value:"auto",error_message:l}),new Error(`Cannot set Kimi ACP permission mode to auto: ${l}`)}}return n.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}catch(i){try{await this.stop()}catch{}try{s.kill("SIGTERM")}catch{}throw i}}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 n=`acp-${Date.now()}`;this.ctx?.turnMap.set(n,{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(n)}}async stop(){this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0);for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear(),this.child!==void 0&&await Qe(this.child)}async rpc(e,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:n});try{this.child.stdin.write(o+`
2356
2356
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,n){if(this.child?.stdin===null||this.child===void 0)return;let r=JSON.stringify({jsonrpc:"2.0",method:e,params:n});try{this.child.stdin.write(r+`
2357
2357
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let n;try{n=JSON.parse(e)}catch{return}if(typeof n.id=="number"&&this.pending.has(n.id)){let s=this.pending.get(n.id);if(this.pending.delete(n.id),n.error!==void 0){let i=n.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(n.error);s.reject(new Error(`acp_rpc_error: ${o}`))}else s.resolve(n);return}let r=typeof n.method=="string"?n.method:void 0;if(r!==void 0){if(typeof n.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:n.id,error:{code:-32601,message:`Method not found: ${r} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
2358
2358
  `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:r,id:n.id,params:n.params}});return}if(r==="session/update"){let s=n.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:r,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:r,params:n.params}})}}},hk=t=>{switch(t){case"codex":return new Wm;case"claude":case"qwen":return new qm;case"gemini":case"copilot":case"opencode":case"kimi":return new Hm;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{mkdirSync as rX,readFileSync as yk,rmSync as sX,writeFileSync as iX}from"node:fs";import{dirname as wk,join as oX}from"node:path";function nn(t=Q()){return oX(wk(t),"serve.pid")}function Ek(t,e){let n=nn(e);return rX(wk(n),{recursive:!0}),iX(n,`${JSON.stringify(t,null,2)}
2359
- `,"utf-8"),n}function Xm(t){let e=nn(t),n;try{n=yk(e,"utf-8")}catch{return null}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0?null:{pid:r.pid,startedAt:typeof r.startedAt=="string"?r.startedAt:"unknown",port:Number.isInteger(r.port)?r.port:0,bind:typeof r.bind=="string"?r.bind:"unknown",dbPath:typeof r.dbPath=="string"?r.dbPath:"unknown",startToken:typeof r.startToken=="string"?r.startToken:null}}catch{return null}}function os(t){sX(nn(t),{force:!0})}function $l(t){let e=aX(t),n=Xm(t);if(n===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(Q_(n.pid,n.startToken??null)){case"same":return{entry:n,running:!0,stale:!1,corrupt:!1};case"different":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:n,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function aX(t){let e=nn(t),n;try{n=yk(e,"utf-8")}catch{return!1}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0}catch{return!0}}function Tk(){return Ic(process.pid)}var vk=E(()=>{"use strict";Bt();qe()});var Dk={};oe(Dk,{_resetStdoutEpipeGuardForTests:()=>mX,bootstrapAgentRestMailbox:()=>Ok,installStdoutEpipeGuard:()=>Nk,publishRegisteredWorkflowsOnStart:()=>Rk,resolveLocalMailboxDir:()=>$k,resolveLocalWebuiDir:()=>Ck,resolveServeConfig:()=>Lk,runServe:()=>uX,runServeStatus:()=>Ak,runServeStop:()=>xk,validateServeArgs:()=>Mk});import{randomBytes as lX}from"node:crypto";import{existsSync as kk}from"node:fs";import{isIP as Sk}from"node:net";import{homedir as cX}from"node:os";import{isAbsolute as Ik,resolve as Jm}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(dX),0;let n=t[0];return n==="status"?Ak(t.slice(1),e):n==="stop"?xk(t.slice(1),e):n!=="start"?(e.stderr.write(n===void 0?bk:`error: unknown serve subcommand: ${n}
2359
+ `,"utf-8"),n}function Xm(t){let e=nn(t),n;try{n=yk(e,"utf-8")}catch{return null}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0?null:{pid:r.pid,startedAt:typeof r.startedAt=="string"?r.startedAt:"unknown",port:Number.isInteger(r.port)?r.port:0,bind:typeof r.bind=="string"?r.bind:"unknown",dbPath:typeof r.dbPath=="string"?r.dbPath:"unknown",startToken:typeof r.startToken=="string"?r.startToken:null}}catch{return null}}function os(t){sX(nn(t),{force:!0})}function $l(t){let e=aX(t),n=Xm(t);if(n===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(Q_(n.pid,n.startToken??null)){case"same":return{entry:n,running:!0,stale:!1,corrupt:!1};case"different":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:n,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function aX(t){let e=nn(t),n;try{n=yk(e,"utf-8")}catch{return!1}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0}catch{return!0}}function Tk(){return Ic(process.pid)}var vk=E(()=>{"use strict";Bt();He()});var Dk={};oe(Dk,{_resetStdoutEpipeGuardForTests:()=>mX,bootstrapAgentRestMailbox:()=>Ok,installStdoutEpipeGuard:()=>Nk,publishRegisteredWorkflowsOnStart:()=>Rk,resolveLocalMailboxDir:()=>$k,resolveLocalWebuiDir:()=>Ck,resolveServeConfig:()=>Lk,runServe:()=>uX,runServeStatus:()=>Ak,runServeStop:()=>xk,validateServeArgs:()=>Mk});import{randomBytes as lX}from"node:crypto";import{existsSync as kk}from"node:fs";import{isIP as Sk}from"node:net";import{homedir as cX}from"node:os";import{isAbsolute as Ik,resolve as Jm}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(dX),0;let n=t[0];return n==="status"?Ak(t.slice(1),e):n==="stop"?xk(t.slice(1),e):n!=="start"?(e.stderr.write(n===void 0?bk:`error: unknown serve subcommand: ${n}
2360
2360
 
2361
2361
  ${bk.replace(/^error: [^\n]*\n\n/,"")}`),2):fX(t.slice(1),e)}async function fX(t,e){let n=Mk(t,process.env);if(typeof n=="string")return e.stderr.write(`error: ${n}
2362
- `),2;let r;try{r=Be({path:Q(),allowSchemaSkew:!1})}catch(b){if(b instanceof qt)return e.stderr.write(`error: refusing to start lmctl serve: ${b.dbPath} is state.db schema v${b.dbVersion}; this build understands v${b.buildVersion}. A daemon that cannot interpret its own state store can misread rather than refuse -- quiet corruption is not recoverable the way a loud failure is, so it will not start in a degraded mode.
2362
+ `),2;let r;try{r=Xe({path:Q(),allowSchemaSkew:!1})}catch(b){if(b instanceof qt)return e.stderr.write(`error: refusing to start lmctl serve: ${b.dbPath} is state.db schema v${b.dbVersion}; this build understands v${b.buildVersion}. A daemon that cannot interpret its own state store can misread rather than refuse -- quiet corruption is not recoverable the way a loud failure is, so it will not start in a degraded mode.
2363
2363
  remedy: npm install -g @lmctl-ai/lmctl@latest, then re-run lmctl serve start.
2364
2364
  (the rest of the CLI -- e.g. \`lmctl running\`, \`lmctl health\` -- reads state.db directly and keeps working while the daemon is down.)
2365
2365
  `),1;throw b}let s={portCli:vX(t)},i;try{i=Lk({dal:r,cli:s,env:process.env,parsed:n,io:e})}catch(b){return r.close(),e.stderr.write(`error: ${b instanceof Error?b.message:String(b)}
@@ -2393,7 +2393,7 @@ remedy: npm install -g @lmctl-ai/lmctl@latest, then re-run lmctl serve start.
2393
2393
  `),0;let o=i,a=o.cycles??o.cycle_count;if(a!==void 0&&e.stdout.write(` cycles ${String(a)}
2394
2394
  `),o.enabled_features!==void 0){let l=Array.isArray(o.enabled_features)?o.enabled_features.join(", "):String(o.enabled_features);e.stdout.write(` features ${l}
2395
2395
  `)}return o.last_error!==void 0&&o.last_error!==null&&e.stdout.write(` last_error ${String(o.last_error)}
2396
- `),0}async function hX(t,e){try{let n=t.dal??Be({path:Q()}),r=t.dal===void 0,s=null;try{s=zs(n,process.env,{stdout:{write:()=>{}},stderr:{write:()=>{}}}).token}finally{r&&n.close()}let i={Accept:"application/json"};s!==null&&s.length>0&&(i.Authorization=`Bearer ${s}`);let o=e.bind==="0.0.0.0"||e.bind==="::"||e.bind===""?"127.0.0.1":e.bind,a=new URL(`http://${o.includes(":")?`[${o}]`:o}:${e.port}/api/daemon/state`),l=await fetch(a,{headers:i,signal:AbortSignal.timeout(_X)});return l.ok?await l.json():null}catch{return null}}async function xk(t,e,n={}){let r=n.timeoutMs??yX;if(t.length>0)return e.stderr.write(`error: lmctl serve stop takes no arguments; got: ${t.join(" ")}
2396
+ `),0}async function hX(t,e){try{let n=t.dal??Xe({path:Q()}),r=t.dal===void 0,s=null;try{s=zs(n,process.env,{stdout:{write:()=>{}},stderr:{write:()=>{}}}).token}finally{r&&n.close()}let i={Accept:"application/json"};s!==null&&s.length>0&&(i.Authorization=`Bearer ${s}`);let o=e.bind==="0.0.0.0"||e.bind==="::"||e.bind===""?"127.0.0.1":e.bind,a=new URL(`http://${o.includes(":")?`[${o}]`:o}:${e.port}/api/daemon/state`),l=await fetch(a,{headers:i,signal:AbortSignal.timeout(_X)});return l.ok?await l.json():null}catch{return null}}async function xk(t,e,n={}){let r=n.timeoutMs??yX;if(t.length>0)return e.stderr.write(`error: lmctl serve stop takes no arguments; got: ${t.join(" ")}
2397
2397
  `),2;let s=Q(),i=$l(s);if(i.entry===null)return i.corrupt?(os(s),e.stdout.write(`serve: not running (pidfile was unreadable); cleared it
2398
2398
  `),0):(e.stdout.write(`serve: not running (no pidfile); nothing to stop
2399
2399
  `),0);if(i.stale)return os(s),e.stdout.write(i.staleReason==="pid-reused"?`serve: not running (pid ${i.entry.pid} belongs to a different process \u2014 pid reused); cleared stale pidfile without signalling it
@@ -2414,7 +2414,7 @@ remedy: npm install -g @lmctl-ai/lmctl@latest, then re-run lmctl serve start.
2414
2414
  `)}catch(n){let r=n instanceof Error?n.message:String(n);t.io?.stderr.write(`[mailbox] WARNING: cloud mailbox auto-delivery is DISABLED; daemon continues without remote inbox relay: ${r}
2415
2415
  `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function Lk(t){let{dal:e,cli:n,env:r,parsed:s,io:i}=t,o=[],a,l=e.getConfig("api.port");if(n.portCli!==void 0)a=n.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(r.LMCTL_API_PORT!==void 0&&r.LMCTL_API_PORT.length>0){let m=Number(r.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${r.LMCTL_API_PORT}`);a=m,o.push("api.port")}else a=s.port;let c,u=e.getConfig("api.token");r.LMCTL_API_TOKEN!==void 0&&r.LMCTL_API_TOKEN.length>0?(c=r.LMCTL_API_TOKEN,u===null?o.push("api.token"):u!==c&&i.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this serve process.
2416
2416
  `)):u!==null?c=u:(c=lX(32).toString("hex"),e.setConfig("api.token",c),i.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:r.LMCTL_API_URL!==void 0&&r.LMCTL_API_URL.length>0?(d=r.LMCTL_API_URL,o.push("api.url")):(d=`http://127.0.0.1:${a}`,e.setConfig("api.url",d));for(let m of o)i.stderr.write(`note: ${EX(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
2417
- `);return{port:a,apiUrl:d,apiToken:c}}function EX(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 TX(t){let e;try{e=await import("node-pty")}catch(n){let r=n instanceof Error?n.message:String(n);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${r})`);return}return new tl({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 Ck(t,e){let n=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(n===void 0)return null;let r=Ik(n)?n:Jm(process.cwd(),n);return kk(`${r}/index.html`)?r:null}function $k(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?Ik(e)?e:Jm(process.cwd(),e):Jm(cX(),".lmctl","local-mailbox")}function vX(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let n=t[e+1];if(n!==void 0&&!n.startsWith("--")){let r=Number(n);if(Number.isInteger(r)&&r>0&&r<=65535)return r}}}function Mk(t,e=process.env){let n=bX(t);return typeof n=="string"?n:!SX(n.bind)&&!n.insecureNoAuth&&!e.LMCTL_API_TOKEN?`auth required for non-loopback --bind ${n.bind}; set LMCTL_API_TOKEN or pass --insecure-no-auth`:n}function SX(t){let e=t.trim().toLowerCase();if(e==="localhost"||e==="::1")return!0;if(e.startsWith("::ffff:")){let n=e.slice(7);return Sk(n)===4&&n.split(".")[0]==="127"}return Sk(e)===4&&e.split(".")[0]==="127"}function bX(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let n=0;n<t.length;n+=1){let r=t[n];if(r==="--port"){let s=t[++n];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;e.port=i;continue}if(r==="--bind"){let s=t[++n];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(r==="--no-daemon"){e.noDaemon=!0;continue}if(r==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(r==="--webui"){let s=t[n+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},n+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${r}`}return e}var dX,bk,Gm,_X,gX,yX,jk=E(()=>{"use strict";mt();Is();IS();Vf();DS();hi();vb();Vu();Um();vm();Ff();Uf();gk();ul();qe();Bt();Ou();vk();dX=`usage: lmctl serve <start|status|stop> [options]
2417
+ `);return{port:a,apiUrl:d,apiToken:c}}function EX(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 TX(t){let e;try{e=await import("node-pty")}catch(n){let r=n instanceof Error?n.message:String(n);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${r})`);return}return new tl({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 Ck(t,e){let n=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(n===void 0)return null;let r=Ik(n)?n:Jm(process.cwd(),n);return kk(`${r}/index.html`)?r:null}function $k(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?Ik(e)?e:Jm(process.cwd(),e):Jm(cX(),".lmctl","local-mailbox")}function vX(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let n=t[e+1];if(n!==void 0&&!n.startsWith("--")){let r=Number(n);if(Number.isInteger(r)&&r>0&&r<=65535)return r}}}function Mk(t,e=process.env){let n=bX(t);return typeof n=="string"?n:!SX(n.bind)&&!n.insecureNoAuth&&!e.LMCTL_API_TOKEN?`auth required for non-loopback --bind ${n.bind}; set LMCTL_API_TOKEN or pass --insecure-no-auth`:n}function SX(t){let e=t.trim().toLowerCase();if(e==="localhost"||e==="::1")return!0;if(e.startsWith("::ffff:")){let n=e.slice(7);return Sk(n)===4&&n.split(".")[0]==="127"}return Sk(e)===4&&e.split(".")[0]==="127"}function bX(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let n=0;n<t.length;n+=1){let r=t[n];if(r==="--port"){let s=t[++n];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;e.port=i;continue}if(r==="--bind"){let s=t[++n];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(r==="--no-daemon"){e.noDaemon=!0;continue}if(r==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(r==="--webui"){let s=t[n+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},n+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${r}`}return e}var dX,bk,Gm,_X,gX,yX,jk=E(()=>{"use strict";ft();Is();IS();Vf();DS();hi();vb();Vu();Um();vm();Ff();Uf();gk();ul();He();Bt();Ou();vk();dX=`usage: lmctl serve <start|status|stop> [options]
2418
2418
 
2419
2419
  Manage the local lmctl daemon: HTTP API, web UI, queue daemon, terminal
2420
2420
  manager, and agent services. A subcommand is REQUIRED \u2014 bare \`lmctl serve\`
@@ -2470,16 +2470,16 @@ unauthenticated daemon.
2470
2470
  lmctl serve stop
2471
2471
 
2472
2472
  Run 'lmctl serve --help' for details.
2473
- `;Gm=!1;_X=2e3;gX=100,yX=1e4});import{existsSync as kX,mkdirSync as IX,readFileSync as NX,renameSync as AX,unlinkSync as xX,writeFileSync as RX}from"node:fs";import{homedir as Fk}from"node:os";import{dirname as ki,join as ze,resolve as OX}from"node:path";function ls(t,e,n){let r=ki(OX(n)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??r,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())rn(ze(o,".mcp.json"),"mcpServers",[Un(),Wn()]),a.has("opencode")&&rn(ze(o,".opencode","opencode.json"),"mcp",[Wk(),qk()]),a.has("kimi")&&rn(ze(o,".kimi-code","mcp.json"),"mcpServers",[Un(),Wn()]);for(let o of s)MX(o)}function Uk(t=Km??Fk()){return ze(t,".copilot","mcp-config.json")}function CX(t,e){kt.mkdirSync(ki(t),{recursive:!0});let n=ze(ki(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{kt.writeFileSync(n,`${JSON.stringify(e,null,2)}
2474
- `,"utf8"),kt.renameSync(n,t)}catch(r){try{kt.unlinkSync(n)}catch{}throw r}}function $X(t,e){kt.mkdirSync(ki(t),{recursive:!0});let n=ze(ki(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{kt.writeFileSync(n,e,"utf8"),kt.renameSync(n,t)}catch(r){try{kt.unlinkSync(n)}catch{}throw r}}function rn(t,e,n){try{if(!kt.existsSync(t))return;let r=JSON.parse(kt.readFileSync(t,"utf8"));if(!as(r)||!as(r[e]))return;let s={...r[e]},i=[];for(let{name:o,shouldRemove:a}of n)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;r[e]=s,CX(t,r),C({event:"mcp_cleanup",path:t,removed:i})}catch{}}function Un(){return{name:Dl,shouldRemove:HX}}function Wk(){return{name:Dl,shouldRemove:BX}}function Wn(){return{name:Ml,shouldRemove:WX}}function qk(){return{name:Ml,shouldRemove:qX}}function MX(t){let e=Km??Fk();switch(t){case"copilot":rn(Uk(e),"mcpServers",[Un(),Wn()]);return;case"claude":rn(ze(e,".claude.json"),"mcpServers",[Un(),Wn()]);return;case"gemini":rn(ze(e,".gemini","settings.json"),"mcpServers",[Un(),Wn()]);return;case"qwen":rn(ze(e,".qwen","settings.json"),"mcpServers",[Un(),Wn()]);return;case"agy":rn(ze(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Un(),Wn()]);return;case"opencode":rn(ze(e,".config","opencode","opencode.json"),"mcp",[Wk(),qk()]);return;case"kimi":rn(ze(Km===void 0?process.env.KIMI_CODE_HOME??ze(e,".kimi-code"):ze(e,".kimi-code"),"mcp.json"),"mcpServers",[Un(),Wn()]);return;case"codex":DX(ze(e,".codex","config.toml"));return;default:return}}function DX(t){try{if(!kt.existsSync(t))return;let e=kt.readFileSync(t,"utf8"),n=jX(e);if(n===null)return;let r=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of r){let c=Hk(l);if(c===null)return;if(c!==void 0){if(Pk(c,n)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let u=FX(l);if(u===null)return;if(u!==void 0&&Pk(u,n)){i.add(u[1]);continue}s.push(l)}if(i.size===0)return;$X(t,s.join(`
2475
- `)),C({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function Pk(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function jX(t){let e=new Map,n;for(let s of t.split(/\n/)){let i=Hk(s);if(i===null)return null;if(i!==void 0){n=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=PX(a,n);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Ml&&c[1]!==Dl)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let d=Bk(l);if(d===null)return null;u.command=d}else if(c[2]==="args"){let d=UX(l);if(d===null)return null;u.args=d}e.set(c[1],u)}let r=new Set;for(let[s,i]of e.entries())s===Ml&&Jk(i.command,i.args)&&r.add(s),s===Dl&&Gk(i.command,i.args)&&r.add(s);return r}function PX(t,e){if(t.startsWith("mcp_servers"))return jl(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=jl(t);return n===null?null:[...e,...n]}function Hk(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:jl(e[1])}function FX(t){let e=t.indexOf("=");if(e<0)return;let n=t.slice(0,e).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return jl(n)}function jl(t){let e=[],n=0,r=()=>{for(;n<t.length&&/\s/.test(t[n]);)n+=1};for(;n<t.length;){if(r(),n>=t.length)return null;if(t[n]==='"'){n+=1;let s="",i=!1;for(;n<t.length;){let o=t[n];if(o==="\\"){if(n+1>=t.length)return null;s+=t[n+1],n+=2;continue}if(o==='"'){n+=1,i=!0;break}s+=o,n+=1}if(!i)return null;e.push(s)}else{let s=n;for(;n<t.length&&/[A-Za-z0-9_-]/.test(t[n]);)n+=1;if(n===s)return null;e.push(t.slice(s,n))}if(r(),n>=t.length)break;if(t[n]!==".")return null;n+=1}return e.length>0?e:null}function Bk(t){let e=Xk(t).trim();if(e.startsWith('"'))try{let n=JSON.parse(e);return typeof n=="string"?n:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function UX(t){let e=Xk(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let n=e.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>Bk(s.trim()));return r.some(s=>s===null)?null:r}function Xk(t){let e;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==void 0){if(e==='"'&&r==="\\"){n+=1;continue}r===e&&(e=void 0);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function WX(t){return as(t)?t.type==="stdio"&&typeof t.command=="string"&&Jk(t.command,t.args):!1}function qX(t){return!as(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Vk(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&Kk(t.command[0],[t.command[1],t.command[2]])}function HX(t){return as(t)?t.type==="stdio"&&Gk(t.command,t.args):!1}function BX(t){return!as(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Yk(t.command[0])&&t.command[1]==="mcp"}function Jk(t,e){return Vk(t)&&zk(e)||Kk(t,e)}function Gk(t,e){return Yk(t)&&zk(e)}function Kk(t,e){return XX(t)&&Array.isArray(e)&&e.length===2&&JX(e[0])&&e[1]==="mcp"}function Vk(t){return typeof t=="string"&&Vm(t)==="lmctl"}function Yk(t){return typeof t=="string"&&Vm(t)==="lmctl0"}function XX(t){if(typeof t!="string")return!1;let e=Vm(t).toLowerCase();return e==="node"||e==="node.exe"}function JX(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Vm(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function zk(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function as(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ml,Dl,LX,kt,Km,Ii=E(()=>{"use strict";ae();Ml="lmctl",Dl="lmctl0",LX={existsSync:kX,mkdirSync:IX,readFileSync:NX,writeFileSync:RX,renameSync:AX,unlinkSync:xX},kt=LX});function eI(t){let e=Zk(t.registry,t.fromTeamfile);if(e===void 0)return cs(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Qk(e,t.fromAlias))return cs(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let n=Zk(t.registry,t.toTeamfile);return n===void 0?cs(`target team is not registered in policy graph: ${t.toTeamfile}`):Qk(n,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?cs(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?cs(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:cs(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function Zk(t,e){return t.teams.find(n=>n.teamfile===e)}function Qk(t,e){return t.aliases.some(n=>n===e)}function cs(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var tI=E(()=>{"use strict"});import{basename as GX}from"node:path";function sI(t,e){let n=new Date(e.now.getTime()-ds()).toISOString(),r=aI(t,n).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=zX(e.sender,r),i=ZX(e.sender,r);i!==null&&i.teamfile===e.root&&!rI(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(m=>rI(m,o)),c=l.map(m=>m.at).filter(m=>m!==null).sort((m,p)=>p-m)[0]??null,u=c!==null&&e.now.getTime()-c<KX,d=Ym(e.sender,r).length;return{stop:l.length>=1&&u&&d>=VX,chain:QX(a)}}function iI(t,e){let n=new Date(e.now.getTime()-ds()).toISOString(),r=aI(t,n),s=Ym(e.sender,r);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function ds(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return nI;let n=Number(e);return!Number.isFinite(n)||n<=0?nI:n}function oI(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function YX(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 aI(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(YX).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=e).sort((n,r)=>n.at-r.at)}function zX(t,e,n={}){let r=new Map;for(let a of e)r.set(gr(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([gr(t)]);for(let a=0;a<64;a+=1){let l=r.get(gr(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&n.includePromptSender!==!0)break;let u=gr(l.sender);if(o.has(u))break;s.unshift(c),o.add(u),i=l.sender}return s}function Ym(t,e){let n=gr(t),r=new Set([n]),s=[n],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let c=gr(l.sender),u=gr(l.receiver);c!==a&&u!==a||(i.includes(l)||i.push(l),r.has(c)||(r.add(c),s.push(c)),r.has(u)||(r.add(u),s.push(u)))}}return i.sort((o,a)=>o.at-a.at)}function ZX(t,e){let n=Ym(t,e);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function rI(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function gr(t){return`${t.teamfile}\0${t.alias}`}function QX(t){return t.map(e=>`${GX(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var KX,VX,nI,zm=E(()=>{"use strict";KX=6e4,VX=2,nI=8*60*60*1e3});function eJ(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return lI;let n=Number(e);return!Number.isFinite(n)||n<=0?lI:n}async function tJ(t,e,n){try{let r=De(e,n,t),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof r.provider=="string"&&r.provider.trim()!=="")i=r.provider;else{let c=await tn(s);if(c.length!==1)return null;i=c[0]}let o=await Ne(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function cI(t,e,n,r,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??eJ(),o=await tJ(t,n,r),a=o!==null&&o>=i;return a&&C({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var lI,dI=E(()=>{"use strict";ae();St();vt();lI=36e5});function nJ(t){return t===null?null:Re(t)?"live":"dead"}function Zm(t){let e=t.nowMs??Date.now(),n=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:nJ(t.holderPid),since:t.since,idle_ms:Number.isFinite(n)?Math.max(0,e-n):null}}function rJ(t){let e=Math.floor(t/1e3),n=Math.floor(e/3600),r=Math.floor(e%3600/60),s=e%60;return n>0?`${n}h ${String(r).padStart(2,"0")}m`:r>0?`${r}m ${String(s).padStart(2,"0")}s`:`${s}s`}function Qm(t){let e=[];return t.idle_ms!==null&&e.push(`active ${rJ(t.idle_ms)}`),e.push(`since ${t.since}`),e.push(t.holder_pid===null?"holder_pid=unavailable":`holder_pid=${t.holder_pid}, ${t.holder_liveness}`),`(${e.join("; ")})`}var uI=E(()=>{"use strict";Bt()});import{randomUUID as sJ}from"node:crypto";import{hostname as fI,networkInterfaces as iJ}from"node:os";function mI(t){let e=(t.now??new Date).toISOString();return{lock_id:sJ(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??fI(),holder_ips:t.ips??dJ(),started_at:e,last_heartbeat:e}}function pI(t=process.env){return _I(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,oJ)}function lJ(t=process.env){return _I(t.LMCTL_TERMINAL_LOCK_STALE_MS,aJ)}function ep(t,e={}){let n=e.now??new Date,r=e.localHost??fI(),s=e.staleMs??lJ();if(t.holder_host===r)return(e.isProcessAlive??cJ)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?n.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function tp(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function _I(t,e){if(t===void 0||t.trim()==="")return e;let n=t.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?e:r}function cJ(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function dJ(){let t=new Set;for(let e of Object.values(iJ()))for(let n of e??[])n.internal||t.add(n.address);return[...t].sort()}var oJ,aJ,np=E(()=>{"use strict";oJ=15e3,aJ=12e4});function mJ(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=Be({path:Q()})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&Re(a.holder_pid)),pollMs:uJ,settleMs:fJ,maxHoldMs:Sn(n),onHold:()=>C({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&C({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function hI(t){let e=pJ(t.newMessage,{newMessageFrom:t.newMessageFrom??_J(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=ue(),s=0,i=0,o=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,o=Buffer.byteLength(c,"utf8"),i+=o),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),a.holdOpen=mJ(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await dn(a);return r&&Me(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:i,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:o,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs}:{status:"ok",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs}}function pJ(t,e={}){return[`--- new message (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
2476
- `)}function _J(t){return`${t.teamfile}:${t.alias}`}var sae,uJ,fJ,gI=E(()=>{"use strict";gt();ae();mt();qe();Bt();ft();sae=60*60*1e3,uJ=2e3,fJ=5e3});async function vI(t){let e=t.onEvent??(()=>{}),n=hJ(t.io,e),r=null,s=null,i=null,o,a,l=null,c=!1,u=null,d=t.prompt;try{let f=await $(n,O=>De(t.teamfile,t.alias,O)),m=f.teamfile,p=await $(n,O=>NJ(O,t.env??process.env)),h=p.sender,_=await AJ(n,{explicitRoot:t.rootFlag,sender:h,receiverTeamfile:m,operatorOrigin:p.origin==="operator"}),y=h===null?null:await xJ(n,{rootTeamfile:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias});y!==null&&!y.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${y.reason}
2477
- `});let g=t.env??process.env,w=await $(n,O=>O.getRootTeam(_)?.name??null);w!==null&&(g.LMBEE_TEAM_NAME=w),i=await EJ(n,{receiverTeamfile:m,receiverAlias:f.alias,sender:h,rootTeamfile:_,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin,parentInvocationId:pl(g.LMCTL_INVOCATION_ID)}),o=bJ(n,i),i!==null&&(g.LMCTL_INVOCATION_ID=String(i));try{ls(n,$e(m),m)}catch{}r={root_teamfile:_,sender_teamfile:h?.teamfile??null,sender_alias:h?.alias??null,receiver_teamfile:m,receiver_alias:f.alias,receiver_provider:f.provider,receiver_session_id:f.sessionid,origin:p.origin,policy:y};let T=await SI(n,m,f.alias);if(T!==null){let O=tp(T);return us(i,r,t.prompt,O,"unavailable"),u=rp(O,null),{status:"busy",message:O,teamChatLogId:null}}let N=await gJ(n,m,f.alias);if(N.busy){let O=await yJ(n,m,f.alias);return O+=await wJ(n,m,f.alias),us(i,r,t.prompt,O,"unavailable"),u=rp(O,null),{status:"busy",message:O,teamChatLogId:null}}if(h!==null&&h.teamfile!==m){let O=await $(n,W=>sI(W,{root:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(O.stop){let W=oI(O.chain);return us(i,r,t.prompt,W,"cycle"),u=Pl(W,null),{status:"error",errorKind:"cycle",message:W,teamChatLogId:null,messageId:null}}}let b=await LJ(n,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:h?.teamfile??m,sender_alias:h?.alias??"operator",...N.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!b.acquired){let O=bI(m,f.alias,b.current);return O+=` ${Qm(Zm({holderPid:b.current.holder_pid,since:b.current.started_at}))}`,us(i,r,t.prompt,O,"unavailable"),u=rp(O,null),{status:"busy",message:O,teamChatLogId:null}}s={row:b.lease,leaseId:b.leaseId},a=no(O=>$(n,W=>W.heartbeatAgentInflight(s.row,s.leaseId,O)),{intervalMs:TI,onError:O=>{ue()&&Me(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:O instanceof Error?O.message:String(O)}))}});let R=await hI({sender:h??{teamfile:m,alias:"operator"},receiver:{teamfile:m,alias:f.alias,provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir,...f.model!==void 0?{model:f.model}:{},...f.effort!==void 0?{effort:f.effort}:{},...f.isLead!==void 0?{isLead:f.isLead}:{}},newMessage:t.prompt,newMessageFrom:h===null?"operator":`${h.teamfile}:${h.alias}`,io:n,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:O=>e({kind:"delta",chunk:O}),onProgress:O=>e({kind:"progress",alias:f.alias,event:O}),onPromptBuilt:async O=>{d=O,l===null&&(l=await $J(n,{...r,message:O}),l!==null&&(t.onAccepted?.(on(l)),i!==null&&await SJ(n,i,l))),i!==null&&await vJ(n,i,O)}});d=R.prompt;let K=R.status==="stalled",j=null,U=K?`provider stalled${R.stalledAfterMs!==void 0?` after ${R.stalledAfterMs}ms`:""}`:R.status==="error"?R.error??R.receipt:r.policy?.outOfPolicy===!0?r.policy.reason:null,x=K||R.status==="error"?"error":r.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await EI(n,l,{...r,message:d,response:R.receipt,status:x,error_detail:U}),c=!0,j=l):j=await DJ(n,{...r,message:d,response:R.receipt,status:x,error_detail:U}),K){let O=U;us(i,r,d,O,"error"),u=Pl(O,j,R.receipt)}else u=kJ(R.receipt,j);return{status:K?"stalled":"ok",replyText:R.receipt,wroteDelta:R.wroteDelta,teamChatLogId:j,messageId:j===null?null:on(j),durationMs:R.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!c&&r!==null&&(await EI(n,l,{...r,message:d,response:null,status:"error",error_detail:m}),c=!0),us(i,r,d,m,"error"),u=Pl(m,l),{status:"error",errorKind:f instanceof ve?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:on(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await MJ(n,r,on(l)),s!==null&&await CJ(n,s.row,s.leaseId),i!==null&&await TJ(n,i,u??Pl("chat turn exited without a terminal outcome",null))}}function hJ(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function gJ(t,e,n){let r=await $(t,i=>(PS(i,e,n),kr(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await $(t,i=>cI(i,r,e,n));return{busy:!s,idleReclaim:s}}async function yJ(t,e,n){let r=await SI(t,e,n);if(r!==null)return tp(r);let s=await $(t,i=>i.getAgentInflight(e,n));return s!==null?bI(e,n,s):`${n} is busy; wait and retry`}async function wJ(t,e,n){let r=await $(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${Qm(Zm({holderPid:r.holder_pid,since:r.started_at}))}`}async function EJ(t,e){try{return(await $(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:IJ(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return ue()&&Me(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function TJ(t,e,n){try{await $(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){ue()&&Me(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function vJ(t,e,n){try{await $(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){ue()&&Me(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function SJ(t,e,n){try{await $(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){ue()&&Me(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function bJ(t,e){if(e===null)return;let n=setInterval(()=>{$(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{ue()&&Me(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},TI);return n.unref?.(),n}function kJ(t,e){return{status:"done",result_summary:Ni(t),error:null,team_chat_log_id:e}}function rp(t,e){return{status:"busy",result_summary:Ni(t),error:t,team_chat_log_id:e}}function Pl(t,e,n){return{status:"error",result_summary:Ni(n===void 0?t:n),error:t,team_chat_log_id:e}}function Ni(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function IJ(t,e,n){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function NJ(t,e){let n=VS(e,t);if(n.ok)return{sender:Je(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(gn("chat"))}async function AJ(t,e){if(e.explicitRoot!==void 0)return await $(t,r=>be(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await $(t,r=>iI(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function xJ(t,e){return await $(t,n=>eI({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:RJ(n,e.sender.teamfile,e.receiverTeamfile)}))}function RJ(t,e,n){return{teams:[e,n].map(s=>OJ(s,t))}}function OJ(t,e){let n=st(t,e),r=Et(n);return{teamfile:t,aliases:n.members.map(s=>s.alias),leadAlias:r?.alias??null}}async function LJ(t,e){return await $(t,n=>{let r=ue(),s=br(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:ds(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&Me(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:wI(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&Me(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:wI(s.current)})),{acquired:!1,current:s.current})})}async function SI(t,e,n){return await $(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(ep(o).live)return o;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:ep(s).live?s:null})}function wI(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function CJ(t,e,n){try{await $(t,r=>{r.releaseAgentInflight(e,n)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2473
+ `;Gm=!1;_X=2e3;gX=100,yX=1e4});import{existsSync as kX,mkdirSync as IX,readFileSync as NX,renameSync as AX,unlinkSync as xX,writeFileSync as RX}from"node:fs";import{homedir as Fk}from"node:os";import{dirname as ki,join as Ye,resolve as OX}from"node:path";function ls(t,e,n){let r=ki(OX(n)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??r,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())rn(Ye(o,".mcp.json"),"mcpServers",[Un(),Wn()]),a.has("opencode")&&rn(Ye(o,".opencode","opencode.json"),"mcp",[Wk(),qk()]),a.has("kimi")&&rn(Ye(o,".kimi-code","mcp.json"),"mcpServers",[Un(),Wn()]);for(let o of s)MX(o)}function Uk(t=Km??Fk()){return Ye(t,".copilot","mcp-config.json")}function CX(t,e){bt.mkdirSync(ki(t),{recursive:!0});let n=Ye(ki(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{bt.writeFileSync(n,`${JSON.stringify(e,null,2)}
2474
+ `,"utf8"),bt.renameSync(n,t)}catch(r){try{bt.unlinkSync(n)}catch{}throw r}}function $X(t,e){bt.mkdirSync(ki(t),{recursive:!0});let n=Ye(ki(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{bt.writeFileSync(n,e,"utf8"),bt.renameSync(n,t)}catch(r){try{bt.unlinkSync(n)}catch{}throw r}}function rn(t,e,n){try{if(!bt.existsSync(t))return;let r=JSON.parse(bt.readFileSync(t,"utf8"));if(!as(r)||!as(r[e]))return;let s={...r[e]},i=[];for(let{name:o,shouldRemove:a}of n)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;r[e]=s,CX(t,r),C({event:"mcp_cleanup",path:t,removed:i})}catch{}}function Un(){return{name:Dl,shouldRemove:HX}}function Wk(){return{name:Dl,shouldRemove:BX}}function Wn(){return{name:Ml,shouldRemove:WX}}function qk(){return{name:Ml,shouldRemove:qX}}function MX(t){let e=Km??Fk();switch(t){case"copilot":rn(Uk(e),"mcpServers",[Un(),Wn()]);return;case"claude":rn(Ye(e,".claude.json"),"mcpServers",[Un(),Wn()]);return;case"gemini":rn(Ye(e,".gemini","settings.json"),"mcpServers",[Un(),Wn()]);return;case"qwen":rn(Ye(e,".qwen","settings.json"),"mcpServers",[Un(),Wn()]);return;case"agy":rn(Ye(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Un(),Wn()]);return;case"opencode":rn(Ye(e,".config","opencode","opencode.json"),"mcp",[Wk(),qk()]);return;case"kimi":rn(Ye(Km===void 0?process.env.KIMI_CODE_HOME??Ye(e,".kimi-code"):Ye(e,".kimi-code"),"mcp.json"),"mcpServers",[Un(),Wn()]);return;case"codex":DX(Ye(e,".codex","config.toml"));return;default:return}}function DX(t){try{if(!bt.existsSync(t))return;let e=bt.readFileSync(t,"utf8"),n=jX(e);if(n===null)return;let r=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of r){let c=Hk(l);if(c===null)return;if(c!==void 0){if(Pk(c,n)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let u=FX(l);if(u===null)return;if(u!==void 0&&Pk(u,n)){i.add(u[1]);continue}s.push(l)}if(i.size===0)return;$X(t,s.join(`
2475
+ `)),C({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function Pk(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function jX(t){let e=new Map,n;for(let s of t.split(/\n/)){let i=Hk(s);if(i===null)return null;if(i!==void 0){n=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=PX(a,n);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Ml&&c[1]!==Dl)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let d=Bk(l);if(d===null)return null;u.command=d}else if(c[2]==="args"){let d=UX(l);if(d===null)return null;u.args=d}e.set(c[1],u)}let r=new Set;for(let[s,i]of e.entries())s===Ml&&Jk(i.command,i.args)&&r.add(s),s===Dl&&Gk(i.command,i.args)&&r.add(s);return r}function PX(t,e){if(t.startsWith("mcp_servers"))return jl(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=jl(t);return n===null?null:[...e,...n]}function Hk(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:jl(e[1])}function FX(t){let e=t.indexOf("=");if(e<0)return;let n=t.slice(0,e).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return jl(n)}function jl(t){let e=[],n=0,r=()=>{for(;n<t.length&&/\s/.test(t[n]);)n+=1};for(;n<t.length;){if(r(),n>=t.length)return null;if(t[n]==='"'){n+=1;let s="",i=!1;for(;n<t.length;){let o=t[n];if(o==="\\"){if(n+1>=t.length)return null;s+=t[n+1],n+=2;continue}if(o==='"'){n+=1,i=!0;break}s+=o,n+=1}if(!i)return null;e.push(s)}else{let s=n;for(;n<t.length&&/[A-Za-z0-9_-]/.test(t[n]);)n+=1;if(n===s)return null;e.push(t.slice(s,n))}if(r(),n>=t.length)break;if(t[n]!==".")return null;n+=1}return e.length>0?e:null}function Bk(t){let e=Xk(t).trim();if(e.startsWith('"'))try{let n=JSON.parse(e);return typeof n=="string"?n:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function UX(t){let e=Xk(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let n=e.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>Bk(s.trim()));return r.some(s=>s===null)?null:r}function Xk(t){let e;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==void 0){if(e==='"'&&r==="\\"){n+=1;continue}r===e&&(e=void 0);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function WX(t){return as(t)?t.type==="stdio"&&typeof t.command=="string"&&Jk(t.command,t.args):!1}function qX(t){return!as(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Vk(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&Kk(t.command[0],[t.command[1],t.command[2]])}function HX(t){return as(t)?t.type==="stdio"&&Gk(t.command,t.args):!1}function BX(t){return!as(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Yk(t.command[0])&&t.command[1]==="mcp"}function Jk(t,e){return Vk(t)&&zk(e)||Kk(t,e)}function Gk(t,e){return Yk(t)&&zk(e)}function Kk(t,e){return XX(t)&&Array.isArray(e)&&e.length===2&&JX(e[0])&&e[1]==="mcp"}function Vk(t){return typeof t=="string"&&Vm(t)==="lmctl"}function Yk(t){return typeof t=="string"&&Vm(t)==="lmctl0"}function XX(t){if(typeof t!="string")return!1;let e=Vm(t).toLowerCase();return e==="node"||e==="node.exe"}function JX(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Vm(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function zk(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function as(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ml,Dl,LX,bt,Km,Ii=E(()=>{"use strict";ae();Ml="lmctl",Dl="lmctl0",LX={existsSync:kX,mkdirSync:IX,readFileSync:NX,writeFileSync:RX,renameSync:AX,unlinkSync:xX},bt=LX});function eI(t){let e=Zk(t.registry,t.fromTeamfile);if(e===void 0)return cs(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Qk(e,t.fromAlias))return cs(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let n=Zk(t.registry,t.toTeamfile);return n===void 0?cs(`target team is not registered in policy graph: ${t.toTeamfile}`):Qk(n,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?cs(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?cs(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:cs(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function Zk(t,e){return t.teams.find(n=>n.teamfile===e)}function Qk(t,e){return t.aliases.some(n=>n===e)}function cs(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var tI=E(()=>{"use strict"});import{basename as GX}from"node:path";function sI(t,e){let n=new Date(e.now.getTime()-ds()).toISOString(),r=aI(t,n).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=zX(e.sender,r),i=ZX(e.sender,r);i!==null&&i.teamfile===e.root&&!rI(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(m=>rI(m,o)),c=l.map(m=>m.at).filter(m=>m!==null).sort((m,p)=>p-m)[0]??null,u=c!==null&&e.now.getTime()-c<KX,d=Ym(e.sender,r).length;return{stop:l.length>=1&&u&&d>=VX,chain:QX(a)}}function iI(t,e){let n=new Date(e.now.getTime()-ds()).toISOString(),r=aI(t,n),s=Ym(e.sender,r);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function ds(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return nI;let n=Number(e);return!Number.isFinite(n)||n<=0?nI:n}function oI(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function YX(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 aI(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(YX).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=e).sort((n,r)=>n.at-r.at)}function zX(t,e,n={}){let r=new Map;for(let a of e)r.set(gr(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([gr(t)]);for(let a=0;a<64;a+=1){let l=r.get(gr(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&n.includePromptSender!==!0)break;let u=gr(l.sender);if(o.has(u))break;s.unshift(c),o.add(u),i=l.sender}return s}function Ym(t,e){let n=gr(t),r=new Set([n]),s=[n],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let c=gr(l.sender),u=gr(l.receiver);c!==a&&u!==a||(i.includes(l)||i.push(l),r.has(c)||(r.add(c),s.push(c)),r.has(u)||(r.add(u),s.push(u)))}}return i.sort((o,a)=>o.at-a.at)}function ZX(t,e){let n=Ym(t,e);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function rI(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function gr(t){return`${t.teamfile}\0${t.alias}`}function QX(t){return t.map(e=>`${GX(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var KX,VX,nI,zm=E(()=>{"use strict";KX=6e4,VX=2,nI=8*60*60*1e3});function eJ(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return lI;let n=Number(e);return!Number.isFinite(n)||n<=0?lI:n}async function tJ(t,e,n){try{let r=je(e,n,t),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof r.provider=="string"&&r.provider.trim()!=="")i=r.provider;else{let c=await tn(s);if(c.length!==1)return null;i=c[0]}let o=await Ne(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function cI(t,e,n,r,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??eJ(),o=await tJ(t,n,r),a=o!==null&&o>=i;return a&&C({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var lI,dI=E(()=>{"use strict";ae();vt();Tt();lI=36e5});function nJ(t){return t===null?null:Re(t)?"live":"dead"}function Zm(t){let e=t.nowMs??Date.now(),n=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:nJ(t.holderPid),since:t.since,idle_ms:Number.isFinite(n)?Math.max(0,e-n):null}}function rJ(t){let e=Math.floor(t/1e3),n=Math.floor(e/3600),r=Math.floor(e%3600/60),s=e%60;return n>0?`${n}h ${String(r).padStart(2,"0")}m`:r>0?`${r}m ${String(s).padStart(2,"0")}s`:`${s}s`}function Qm(t){let e=[];return t.idle_ms!==null&&e.push(`active ${rJ(t.idle_ms)}`),e.push(`since ${t.since}`),e.push(t.holder_pid===null?"holder_pid=unavailable":`holder_pid=${t.holder_pid}, ${t.holder_liveness}`),`(${e.join("; ")})`}var uI=E(()=>{"use strict";Bt()});import{randomUUID as sJ}from"node:crypto";import{hostname as fI,networkInterfaces as iJ}from"node:os";function mI(t){let e=(t.now??new Date).toISOString();return{lock_id:sJ(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??fI(),holder_ips:t.ips??dJ(),started_at:e,last_heartbeat:e}}function pI(t=process.env){return _I(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,oJ)}function lJ(t=process.env){return _I(t.LMCTL_TERMINAL_LOCK_STALE_MS,aJ)}function ep(t,e={}){let n=e.now??new Date,r=e.localHost??fI(),s=e.staleMs??lJ();if(t.holder_host===r)return(e.isProcessAlive??cJ)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?n.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function tp(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function _I(t,e){if(t===void 0||t.trim()==="")return e;let n=t.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?e:r}function cJ(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function dJ(){let t=new Set;for(let e of Object.values(iJ()))for(let n of e??[])n.internal||t.add(n.address);return[...t].sort()}var oJ,aJ,np=E(()=>{"use strict";oJ=15e3,aJ=12e4});function mJ(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=Xe({path:Q()})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&Re(a.holder_pid)),pollMs:uJ,settleMs:fJ,maxHoldMs:Sn(n),onHold:()=>C({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&C({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function hI(t){let e=pJ(t.newMessage,{newMessageFrom:t.newMessageFrom??_J(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=ue(),s=0,i=0,o=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,o=Buffer.byteLength(c,"utf8"),i+=o),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),a.holdOpen=mJ(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await dn(a);return r&&Me(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:i,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:o,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs}:{status:"ok",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs}}function pJ(t,e={}){return[`--- new message (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
2476
+ `)}function _J(t){return`${t.teamfile}:${t.alias}`}var sae,uJ,fJ,gI=E(()=>{"use strict";ht();ae();ft();He();Bt();ut();sae=60*60*1e3,uJ=2e3,fJ=5e3});async function vI(t){let e=t.onEvent??(()=>{}),n=hJ(t.io,e),r=null,s=null,i=null,o,a,l=null,c=!1,u=null,d=t.prompt;try{let f=await $(n,O=>je(t.teamfile,t.alias,O)),m=f.teamfile,p=await $(n,O=>NJ(O,t.env??process.env)),h=p.sender,_=await AJ(n,{explicitRoot:t.rootFlag,sender:h,receiverTeamfile:m,operatorOrigin:p.origin==="operator"}),y=h===null?null:await xJ(n,{rootTeamfile:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias});y!==null&&!y.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${y.reason}
2477
+ `});let g=t.env??process.env,w=await $(n,O=>O.getRootTeam(_)?.name??null);w!==null&&(g.LMBEE_TEAM_NAME=w),i=await EJ(n,{receiverTeamfile:m,receiverAlias:f.alias,sender:h,rootTeamfile:_,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin,parentInvocationId:pl(g.LMCTL_INVOCATION_ID)}),o=bJ(n,i),i!==null&&(g.LMCTL_INVOCATION_ID=String(i));try{ls(n,$e(m),m)}catch{}r={root_teamfile:_,sender_teamfile:h?.teamfile??null,sender_alias:h?.alias??null,receiver_teamfile:m,receiver_alias:f.alias,receiver_provider:f.provider,receiver_session_id:f.sessionid,origin:p.origin,policy:y};let T=await SI(n,m,f.alias);if(T!==null){let O=tp(T);return us(i,r,t.prompt,O,"unavailable"),u=rp(O,null),{status:"busy",message:O,teamChatLogId:null}}let N=await gJ(n,m,f.alias);if(N.busy){let O=await yJ(n,m,f.alias);return O+=await wJ(n,m,f.alias),us(i,r,t.prompt,O,"unavailable"),u=rp(O,null),{status:"busy",message:O,teamChatLogId:null}}if(h!==null&&h.teamfile!==m){let O=await $(n,W=>sI(W,{root:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(O.stop){let W=oI(O.chain);return us(i,r,t.prompt,W,"cycle"),u=Pl(W,null),{status:"error",errorKind:"cycle",message:W,teamChatLogId:null,messageId:null}}}let b=await LJ(n,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:h?.teamfile??m,sender_alias:h?.alias??"operator",...N.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!b.acquired){let O=bI(m,f.alias,b.current);return O+=` ${Qm(Zm({holderPid:b.current.holder_pid,since:b.current.started_at}))}`,us(i,r,t.prompt,O,"unavailable"),u=rp(O,null),{status:"busy",message:O,teamChatLogId:null}}s={row:b.lease,leaseId:b.leaseId},a=no(O=>$(n,W=>W.heartbeatAgentInflight(s.row,s.leaseId,O)),{intervalMs:TI,onError:O=>{ue()&&Me(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:O instanceof Error?O.message:String(O)}))}});let R=await hI({sender:h??{teamfile:m,alias:"operator"},receiver:{teamfile:m,alias:f.alias,provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir,...f.model!==void 0?{model:f.model}:{},...f.effort!==void 0?{effort:f.effort}:{},...f.isLead!==void 0?{isLead:f.isLead}:{}},newMessage:t.prompt,newMessageFrom:h===null?"operator":`${h.teamfile}:${h.alias}`,io:n,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:O=>e({kind:"delta",chunk:O}),onProgress:O=>e({kind:"progress",alias:f.alias,event:O}),onPromptBuilt:async O=>{d=O,l===null&&(l=await $J(n,{...r,message:O}),l!==null&&(t.onAccepted?.(on(l)),i!==null&&await SJ(n,i,l))),i!==null&&await vJ(n,i,O)}});d=R.prompt;let K=R.status==="stalled",j=null,U=K?`provider stalled${R.stalledAfterMs!==void 0?` after ${R.stalledAfterMs}ms`:""}`:R.status==="error"?R.error??R.receipt:r.policy?.outOfPolicy===!0?r.policy.reason:null,x=K||R.status==="error"?"error":r.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await EI(n,l,{...r,message:d,response:R.receipt,status:x,error_detail:U}),c=!0,j=l):j=await DJ(n,{...r,message:d,response:R.receipt,status:x,error_detail:U}),K){let O=U;us(i,r,d,O,"error"),u=Pl(O,j,R.receipt)}else u=kJ(R.receipt,j);return{status:K?"stalled":"ok",replyText:R.receipt,wroteDelta:R.wroteDelta,teamChatLogId:j,messageId:j===null?null:on(j),durationMs:R.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!c&&r!==null&&(await EI(n,l,{...r,message:d,response:null,status:"error",error_detail:m}),c=!0),us(i,r,d,m,"error"),u=Pl(m,l),{status:"error",errorKind:f instanceof ve?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:on(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await MJ(n,r,on(l)),s!==null&&await CJ(n,s.row,s.leaseId),i!==null&&await TJ(n,i,u??Pl("chat turn exited without a terminal outcome",null))}}function hJ(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function gJ(t,e,n){let r=await $(t,i=>(PS(i,e,n),kr(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await $(t,i=>cI(i,r,e,n));return{busy:!s,idleReclaim:s}}async function yJ(t,e,n){let r=await SI(t,e,n);if(r!==null)return tp(r);let s=await $(t,i=>i.getAgentInflight(e,n));return s!==null?bI(e,n,s):`${n} is busy; wait and retry`}async function wJ(t,e,n){let r=await $(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${Qm(Zm({holderPid:r.holder_pid,since:r.started_at}))}`}async function EJ(t,e){try{return(await $(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:IJ(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return ue()&&Me(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function TJ(t,e,n){try{await $(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){ue()&&Me(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function vJ(t,e,n){try{await $(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){ue()&&Me(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function SJ(t,e,n){try{await $(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){ue()&&Me(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function bJ(t,e){if(e===null)return;let n=setInterval(()=>{$(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{ue()&&Me(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},TI);return n.unref?.(),n}function kJ(t,e){return{status:"done",result_summary:Ni(t),error:null,team_chat_log_id:e}}function rp(t,e){return{status:"busy",result_summary:Ni(t),error:t,team_chat_log_id:e}}function Pl(t,e,n){return{status:"error",result_summary:Ni(n===void 0?t:n),error:t,team_chat_log_id:e}}function Ni(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function IJ(t,e,n){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function NJ(t,e){let n=VS(e,t);if(n.ok)return{sender:Je(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(gn("chat"))}async function AJ(t,e){if(e.explicitRoot!==void 0)return await $(t,r=>be(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await $(t,r=>iI(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function xJ(t,e){return await $(t,n=>eI({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:RJ(n,e.sender.teamfile,e.receiverTeamfile)}))}function RJ(t,e,n){return{teams:[e,n].map(s=>OJ(s,t))}}function OJ(t,e){let n=rt(t,e),r=wt(n);return{teamfile:t,aliases:n.members.map(s=>s.alias),leadAlias:r?.alias??null}}async function LJ(t,e){return await $(t,n=>{let r=ue(),s=br(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:ds(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&Me(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:wI(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&Me(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:wI(s.current)})),{acquired:!1,current:s.current})})}async function SI(t,e,n){return await $(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(ep(o).live)return o;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:ep(s).live?s:null})}function wI(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function CJ(t,e,n){try{await $(t,r=>{r.releaseAgentInflight(e,n)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2478
2478
  `)}}function bI(t,e,n){return`${e} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function $J(t,e){let n=Ai(e.message);try{return await $(t,r=>r.beginTeamChatLog({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,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,created_at:new Date().toISOString()}))}catch(r){return t.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
2479
2479
  `),null}}async function EI(t,e,n){let r=Ai(n.message),s=n.response===null?null:Ai(n.response);try{await $(t,i=>i.finishTeamChatLog(e,{root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,receiver_provider:n.receiver_provider,receiver_session_id:n.receiver_session_id,provider_prompt:n.message,message:r.text,response:s?.text??null,origin:n.origin,status:n.status,error_detail:n.error_detail,truncated:r.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(i){t.stderr.write(`warning: failed to finish chat log ${e}: ${i instanceof Error?i.message:String(i)}
2480
2480
  `)}}async function MJ(t,e,n){if(e!==null)try{await $(t,r=>{r.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,n)})}catch(r){t.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
2481
2481
  `)}}async function DJ(t,e){let n=Ai(e.message),r=e.response===null?null:Ai(e.response);try{return await $(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,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:r?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2482
- `),null}}function us(t,e,n,r,s){t!==null||e===null||C({event:"chat_attempt_error",reason:s,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,origin:e.origin,error_detail:r,message_preview:Ni(n)})}function Ai(t){return t.length<=yI?{text:t,truncated:!1}:{text:t.slice(0,yI),truncated:!0}}var yI,TI,kI=E(()=>{"use strict";vt();Dt();Ii();tI();en();zm();ae();Ie();ft();hi();dI();uI();np();yi();yl();gI();Ls();yI=256*1024,TI=3e4});var OI={};oe(OI,{parseIdleTimeoutMs:()=>xI,resolvePromptInput:()=>AI,runChat:()=>FJ});import{readFileSync as jJ}from"node:fs";async function FJ(t,e={stdout:process.stdout,stderr:process.stderr}){let n=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${II}
2482
+ `),null}}function us(t,e,n,r,s){t!==null||e===null||C({event:"chat_attempt_error",reason:s,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,origin:e.origin,error_detail:r,message_preview:Ni(n)})}function Ai(t){return t.length<=yI?{text:t,truncated:!1}:{text:t.slice(0,yI),truncated:!0}}var yI,TI,kI=E(()=>{"use strict";Tt();Dt();Ii();tI();en();zm();ae();Ie();ut();hi();dI();uI();np();yi();yl();gI();Ls();yI=256*1024,TI=3e4});var OI={};oe(OI,{parseIdleTimeoutMs:()=>xI,resolvePromptInput:()=>AI,runChat:()=>FJ});import{readFileSync as jJ}from"node:fs";async function FJ(t,e={stdout:process.stdout,stderr:process.stderr}){let n=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${II}
2483
2483
  `),t.length===0?2:0;let r=UJ(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2484
2484
  ${II}
2485
2485
  `),2;if(r.promptFile!==void 0){let d=await AI(r.promptFile,e);if(typeof d!="string")return e.stderr.write(`error: ${d.error}
@@ -2493,7 +2493,7 @@ ${II}
2493
2493
  `),1;let _=f.resumeInteractive(h.step_id,r.prompt,r.done===!0);return _.resumed===!0?(e.stdout.write(`run ${d}: interactive resumed (step ${h.step_id}${r.done===!0?", done":""})
2494
2494
  `),0):(e.stderr.write(`error: run ${d}: resumeInteractive failed (${_.reason})
2495
2495
  `),1)}return e.stderr.write(`error: run ${d}: pending attention kind "${p.kind}" is not operator-answerable
2496
- `),1})}let s=Tt(PJ,{target:r.target,alias:r.alias,flags:{session:r.sessionFlag,provider:r.providerFlag}});if(s.mode==="error")return e.stderr.write(`error: ${s.message}
2496
+ `),1})}let s=Et(PJ,{target:r.target,alias:r.alias,flags:{session:r.sessionFlag,provider:r.providerFlag}});if(s.mode==="error")return e.stderr.write(`error: ${s.message}
2497
2497
  `),2;if(s.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
2498
2498
  `),2;let i;if(s.mode==="ai-team"){if(s.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
2499
2499
  `),2;let d=await vI({teamfile:s.teamfile,alias:s.alias,prompt:r.prompt,permissionMode:r.permissionMode,...r.idleTimeoutMs!==void 0?{idleTimeoutMs:r.idleTimeoutMs}:{},...r.rootFlag!==void 0?{rootFlag:r.rootFlag}:{},env:n,io:e,onEvent:f=>{r.json===!0&&f.kind==="delta"||HJ(e,f,r.verbose===!0)},...r.json===!0?{onAccepted:f=>{e.stdout.write(`${JSON.stringify({status:"accepted",message_id:f})}
@@ -2517,7 +2517,7 @@ ${II}
2517
2517
  `),1}}function NI(t){return`${t}'s turn has finished and exited; resubmit \`lmctl chat\` to continue (no persistent session is left running)`}function UJ(t){let e=[],n="yolo",r,s,i,o,a,l,c=!1,u=!1,d=!1;for(let _=0;_<t.length;_+=1){let y=t[_];if(y==="--permission-mode"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --permission-mode";if(g!=="plan"&&g!=="yolo")return`--permission-mode must be one of plan|yolo (got "${g}")`;n=g;continue}if(y==="--idle-timeout"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --idle-timeout";let w=xI(g);if(typeof w=="string")return w;r=w;continue}if(y==="--session"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --session";s=g;continue}if(y==="--provider"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --provider";i=g;continue}if(y==="--from"||y.startsWith("--from="))return KS("chat");if(y.startsWith("I_am="))return`unknown argument: ${y}`;if(y==="--root"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --root";o=g;continue}if(y==="--prompt-file"){let g=t[++_];if(g===void 0||g!=="-"&&g.startsWith("--"))return"missing value for --prompt-file";a=g;continue}if(y==="--force"||y.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(y==="--json"){u=!0;continue}if(y==="--verbose"){d=!0;continue}if(y==="--run"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --run";l=g;continue}if(y==="--done"){c=!0;continue}if(y.startsWith("--"))return`unknown flag: ${y}`;e.push(y)}if(l!==void 0){if(s!==void 0)return"--run is mutually exclusive with --session";if(i!==void 0)return"--run is mutually exclusive with --provider";if(o!==void 0)return"--run is mutually exclusive with --root";if(a!==void 0&&e.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&e.length===0)return"a prompt (answer) is required with --run";if(e.length>1)return`--run takes exactly one positional (the answer); got ${e.length}`;let _={prompt:a!==void 0?"":e[0],permissionMode:n,runFlag:l,done:c,json:u,verbose:d};return a!==void 0&&(_.promptFile=a),_}let f,m,p;if(a!==void 0){if(e.length===0){if(s===void 0)return"expected <teamfile>:<alias> --prompt-file <path> | <teamfile> <alias> --prompt-file <path> | --session <id> --prompt-file <path>"}else if(e.length===1)f=e[0];else if(e.length===2)f=e[0],m=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";p=""}else{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>"';p=e[0]}else if(e.length===2)f=e[0],p=e[1];else if(e.length===3)f=e[0],m=e[1],p=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`}if(c)return"--done requires --run";let h={prompt:p,permissionMode:n};return f!==void 0&&(h.target=f),m!==void 0&&(h.alias=m),r!==void 0&&(h.idleTimeoutMs=r),s!==void 0&&(h.sessionFlag=s),i!==void 0&&(h.providerFlag=i),o!==void 0&&(h.rootFlag=o),a!==void 0&&(h.promptFile=a),u&&(h.json=u),d&&(h.verbose=d),h}async function AI(t,e,n=process.stdin){let r;try{r=t==="-"?await WJ(n):jJ(t,"utf8")}catch(i){let o=i instanceof Error?i.message:String(i);return{error:`--prompt-file ${t}: ${o}`}}let s=r.endsWith(`\r
2518
2518
  `)?r.slice(0,-2):r.endsWith(`
2519
2519
  `)?r.slice(0,-1):r;return s.length===0?{error:`--prompt-file ${t}: file is empty; a prompt is required`}:s}async function WJ(t){let e=[];for await(let n of t)e.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(e).toString("utf8")}function xI(t){if(t==="0")return 0;if(/^\d+$/.test(t)){let i=Number(t);return i>0&&i<1e3?`--idle-timeout ${t} means ${t}ms, not ${t}s \u2014 that's not enough time for any real provider call to make progress. Use an explicit unit, e.g. --idle-timeout ${t}s.`:i}let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms >= 1000, or 0)`;let n=Number(e[1]),r=e[2];return n*(r==="s"?1e3:r==="m"?6e4:r==="h"?36e5:864e5)}function RI(t,e,n,r=!1){if(n.kind!=="tool_use"&&n.kind!=="tool_result"&&n.kind!=="api_retry")return;let s=n.kind==="tool_use"?`[${e}] tool_use ${n.tool??"tool"}${n.summary?`: ${n.summary}`:""}`:n.kind==="tool_result"?`[${e}] tool_result${n.status?` ${n.status}`:""}${n.summary?`: ${n.summary}`:""}`:`[${e}] api_retry${n.summary?`: ${n.summary}`:""}`;C({event:"chat_progress",alias:e,progress_kind:n.kind,line:s}),r&&t.stderr.write(`${s}
2520
- `)}function qJ(t,e){return t.slice(-e)}function HJ(t,e,n=!1){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?RI(t,e.alias,e.event,n):t.stderr.write(e.message)}var PJ,II,LI=E(()=>{"use strict";gt();Ie();vt();kI();yi();ae();sl();un();PJ={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},II=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2520
+ `)}function qJ(t,e){return t.slice(-e)}function HJ(t,e,n=!1){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?RI(t,e.alias,e.event,n):t.stderr.write(e.message)}var PJ,II,LI=E(()=>{"use strict";ht();Ie();Tt();kI();yi();ae();sl();un();PJ={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},II=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2521
2521
  lmctl chat <teamfile> <alias> "<prompt>"
2522
2522
  lmctl chat <sessionid> "<prompt>" --provider <name>
2523
2523
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -2549,8 +2549,8 @@ Safe input (no shell involved) \u2014 use for anything non-trivial:
2549
2549
  where unconditional narration would bleed into unrelated output).
2550
2550
 
2551
2551
  Send a prompt to a team member or raw provider session, or answer a paused run.`});function xi(t,e){if(t===void 0)return{date:void 0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let s=Number(n[1]),i=n[2],o=i==="s"?s:i==="m"?s*60:i==="h"?s*3600:s*86400;return{date:new Date(Date.now()-o*1e3)}}let r=Date.parse(t);return Number.isFinite(r)?{date:new Date(r)}:{error:`invalid ${e} "${t}" (expected ISO8601 or duration like 24h)`}}var sp=E(()=>{"use strict"});var FI={};oe(FI,{buildSessionInspection:()=>Oi,deriveToolCalls:()=>Fl,runSession:()=>YJ});async function YJ(t,e,n=GJ){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${DI}
2552
- `),0;let r=Y(t,["--session","--provider","--since","--until","--limit"],[]);if(r.error!==void 0)return dt(e,r.error,!0);let s=xi(M(r,"--since"),"--since");if("error"in s)return dt(e,s.error,!0);let i=xi(M(r,"--until"),"--until");if("error"in i)return dt(e,i.error,!0);let o=M(r,"--limit"),a;if(o!==void 0&&(a=Number.parseInt(o,10),!Number.isFinite(a)||a<1||String(a)!==o))return dt(e,`invalid --limit "${o}" (expected a positive integer)`,!0);let l=Tt(BJ,{target:r.positionals[0],alias:r.positionals[1],flags:{session:M(r,"--session"),provider:M(r,"--provider")}});if(l.mode==="error")return dt(e,l.message,!0);if(l.mode==="managed")return dt(e,"session does not support managed-mode targets",!0);let c,u,d,f;try{if(l.mode==="ai-team"){f=l.teamfile;let y=l.alias??await n.resolveLeadAlias(l.teamfile,e),g=await n.resolveTeamTarget(l.teamfile,y,e);c=g.provider,u=g.sessionid,d=g.alias}else if(u=l.sessionid,l.provider!==void 0)c=l.provider;else{let y=await tn(u);if(y.length===0)return dt(e,`session "${u}" not found in any provider store`,!0);if(y.length>1)return dt(e,`session "${u}" matches multiple providers (${y.join(", ")}); pass --provider`,!0);c=y[0]}}catch(y){return y instanceof ve?dt(e,y.message,!0):dt(e,ip(y))}let m;try{m=await n.loadSession(u,c)}catch(y){return dt(e,`failed to load session: ${ip(y)}`)}if(m===null)return dt(e,`session not found: ${u} (provider=${c})`);let p=s.date?.getTime(),h=i.date?.getTime(),_=[];if(f!==void 0&&d!==void 0)try{_=await n.listInvocations(f,d,{sinceMs:p,untilMs:h},e)}catch(y){return dt(e,`failed to load invocation history: ${ip(y)}`)}return X(e,Oi(m,d,{invocations:_,sinceMs:p,untilMs:h,limit:a})),0}function Oi(t,e,n={}){let r=aG(t.messages),s=lG(r,JJ),i=nG(t,r!==null),o=Fl(t),a=e?.toLowerCase()==="lead",l=o.filter(p=>p.kind==="file_write").length,c=o.filter(p=>p.kind==="file_edit").length,u=Ri[t.provider],d=e===void 0?u==="none"?"none":"partial":u,f=zJ(t.messages,n.sinceMs,n.untilMs).filter(p=>p.role==="user"||p.role==="assistant").slice(-Math.max(1,Math.trunc(n.limit??XJ))).map(p=>({role:p.role,content:p.content,model:p.model??null,timestamp:p.timestamp.toISOString()})),m=n.invocations??[];return{schema_version:MI,provider:t.provider,sessionId:t.sessionId,modifiedAt:t.modifiedAt.toISOString(),lastPrompt:s.text,lastPromptTruncated:s.truncated,handled:i.value,handledSignal:i.signal,tokens:rG(t),toolCalls:o,messages:f,invocations:m,authorship:{alias:e??null,isLeadAlias:a,selfFileWriteCount:l,selfFileEditCount:c,flag:a&&l+c>0?"lead_self_authoring":null},coverage:{toolCalls:Ri[t.provider],resultPairing:jI[t.provider],backgroundTaskCorrelation:ZJ(t.provider),authorship:d,tokens:KJ[t.provider],handled:i.coverage}}}function zJ(t,e,n){return e===void 0&&n===void 0?t:t.filter(r=>{let s=r.timestamp.getTime();return!(e!==void 0&&s<e||n!==void 0&&s>n)})}function ZJ(t){return t==="claude"||t==="kimi"||t==="agy"?"full":t==="copilot"?"partial":"none"}function Fl(t){if(Ri[t.provider]==="none")return[];let e=VJ[t.provider]??{},n=new Set,r=[];for(let s=0;s<t.messages.length;s+=1){let i=t.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=e[i.toolName],a=i.toolInputData??cG(i.toolInput),l=o===void 0?void 0:QJ(o,a),c=tG(t.messages,s,i.toolCallId,n,t.provider==="agy"),u=c===void 0?void 0:t.messages[c];c!==void 0&&n.add(c);let d=o===void 0?[]:eG(o,a),f=d.length>0?d:[{kind:o?.kind??"other",value:l}];for(let m of f)r.push({kind:m.kind,name:i.toolName,...m.kind==="shell"?{command:m.value??null}:{},...m.kind==="file_read"||m.kind==="file_write"||m.kind==="file_edit"||m.kind==="network"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:u?.timestamp.toISOString()??null,result:u===void 0?null:u.toolDetailedContent??u.content})}return r}function QJ(t,e){if(e!==void 0)for(let n of[t.inputKey,...t.fallbackInputKeys??[]]){let r=op(e[n]);if(r!==void 0)return r}}function eG(t,e){if(t.multi===void 0||e===void 0)return[];let n=e[t.multi.pathsKey],r=e[t.multi.kindsKey];if(!Array.isArray(n)||!Array.isArray(r))return[];let s=[];for(let i=0;i<Math.min(n.length,r.length);i+=1){let o=op(n[i]),a=op(r[i]),l=a===void 0?void 0:t.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function tG(t,e,n,r,s){if(n===void 0)return;let i=s?0:e+1;for(let o=i;o<t.length;o+=1){let a=t[o];if(!r.has(o)&&a.role==="tool_result"&&a.toolCallId===n)return o}}function nG(t,e){if(!e)return{value:null,signal:"unavailable",coverage:"unavailable"};if(t.turnStatus!==void 0){let s=t.provider==="claude"?"native_stop_reason":t.turnStatus==="complete"?"native_task_complete":t.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:t.turnStatus==="complete",signal:s,coverage:"native"}}let n=PI(t.messages,"user");return{value:n>=0&&t.messages.slice(n+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function rG(t){let e=t.lastTokenUsage,n=iG(t),r=oG(t.provider);return{lastTurn:sG(e),aggregate:{input:n,output:t.totalOutputTokens??null,cacheRead:t.totalCachedInputTokens??null,cacheWrite:t.totalCacheWriteInputTokens??null},normalization:r}}function sG(t){return{input:t?.inputTokens??null,output:t?.outputTokens??null,cacheRead:t?.cachedInputTokens??null,cacheWrite:t?.cacheWriteInputTokens??null}}function iG(t){return t.totalInputTokens===void 0?null:t.provider==="claude"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)-(t.totalCacheWriteInputTokens??0)):t.provider==="gemini"||t.provider==="qwen"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)):t.totalInputTokens}function oG(t){switch(t){case"claude":return{id:"claude-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent"};case"gemini":return{id:"gemini-input-excludes-cache",note:"input excludes cached prompt tokens; cacheRead reports the cached subset"};case"kimi":return{id:"kimi-splits-other",note:"input is Kimi inputOther; cacheRead and cacheWrite are separate counters"};case"codex":return{id:"codex-upstream-passthrough",note:"input and cacheRead preserve Codex upstream token_count semantics"};case"opencode":case"lmplayer":return{id:"opencode-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent per-turn DB rows"};case"copilot":return{id:"copilot-shutdown-aggregate",note:"aggregate input/cache come from session.shutdown modelMetrics (absent on live sessions); lastTurn reports output only"};case"qwen":return{id:"qwen-gemini-usage-metadata",note:"input excludes cachedContentTokenCount (Gemini usageMetadata semantics: prompt includes the cached subset); output includes thoughts; no cache-write counter exists upstream"};case"dsh":return{id:"dsh-independent-counters",note:"input excludes cacheRead (verified against real sessions); reasoning is a separate counter; no cache-write counter exists upstream"};case"hermes":return{id:"hermes-session-aggregate",note:"counters are session aggregates from the sessions row (not per-turn); input excludes cacheRead; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function aG(t){let e=PI(t,"user");return e<0?null:t[e].content}function PI(t,e){for(let n=t.length-1;n>=0;n-=1)if(t[n].role===e)return n;return-1}function lG(t,e){if(t===null)return{text:null,truncated:!1};let n=Buffer.from(t,"utf8");if(n.length<=e)return{text:t,truncated:!1};let r=e;for(;r>0&&(n[r]&192)===128;)r-=1;return{text:n.subarray(0,r).toString("utf8"),truncated:!0}}function cG(t){if(t!==void 0)try{let e=JSON.parse(t);return dG(e)?e:void 0}catch{return}}function dG(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function op(t){return typeof t=="string"?t:void 0}function dt(t,e,n=!1){return X(t,{schema_version:MI,error:e,...n?{usage:DI}:{}}),1}function ip(t){return t instanceof Error?t.message:String(t)}var MI,BJ,XJ,JJ,DI,GJ,Ri,jI,CI,KJ,$I,VJ,Ul=E(()=>{"use strict";St();Ie();vt();Dt();en();sp();MI=2,BJ={name:"session",allowsBareTeamfile:!0,supportsRaw:!0},XJ=500,JJ=32*1024,DI=["usage: lmctl session [target] [alias] [--since <duration|ISO8601>] [--until <duration|ISO8601>]"," lmctl session --session <id> --provider <name> [--since ...] [--until ...] [--limit N]","","Inspect one native provider session through a versioned JSON contract:","conversation messages, classified tool calls (shell/file/network), token","usage, and lmctl's own dispatch history (tracked_invocation) for the","same target. A bare <teamfile> with no alias inspects that team's Lead.","--since/--until bound `messages` by timestamp and `invocations` by","start time (duration like 24h, or an absolute ISO8601 timestamp).","--limit caps `messages` to the most recent N (default 500)."].join(`
2553
- `),GJ={loadSession:Ne,resolveTeamTarget:(t,e,n)=>$(n,r=>De(t,e,r)),resolveLeadAlias:async(t,e)=>{let n=await $(e,i=>be(t,i)),r=$e(n),s=Et(r);if(s===void 0)throw new Error(`${t} has no Lead member; pass <tf>:<alias>`);return s.alias},listInvocations:(t,e,n,r)=>$(r,s=>s.listTrackedInvocationsForTarget(t,e,n).map(i=>({id:i.id,kind:i.kind,origin:i.origin,status:i.status,from_identity:i.from_identity,command:i.command,started_at:i.started_at,ended_at:i.ended_at,exit_code:i.exit_code,error:i.error})))},Ri={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",dsh:"full",hermes:"full",ClaudeMock:"none"},jI={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",dsh:"full",hermes:"full",ClaudeMock:"none"},CI={none:0,heuristic:1,partial:2,full:3};for(let t of Object.keys(Ri))if(CI[jI[t]]>CI[Ri[t]])throw new Error(`invalid session coverage for ${t}: result pairing exceeds tool-call coverage`);KJ={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",dsh:"partial",hermes:"partial",ClaudeMock:"none"},$I={bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"filePath",fallbackInputKeys:["path","file"]},write:{kind:"file_write",inputKey:"filePath",fallbackInputKeys:["path","file"]},edit:{kind:"file_edit",inputKey:"filePath",fallbackInputKeys:["path","file"]}},VJ={claude:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"file_path"},Write:{kind:"file_write",inputKey:"file_path"},Edit:{kind:"file_edit",inputKey:"file_path"},WebFetch:{kind:"network",inputKey:"url"},WebSearch:{kind:"network",inputKey:"query"}},codex:{exec_command:{kind:"shell",inputKey:"cmd"},apply_patch:{kind:"file_edit",inputKey:"path",multi:{pathsKey:"paths",kindsKey:"kinds",kindByValue:{Add:"file_write",Update:"file_edit",Move:"file_edit",Delete:"file_edit"}}}},copilot:{bash:{kind:"shell",inputKey:"command"}},opencode:$I,lmplayer:$I,kimi:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"path"},Write:{kind:"file_write",inputKey:"path"},Edit:{kind:"file_edit",inputKey:"path"}},qwen:{run_shell_command:{kind:"shell",inputKey:"command"},read_file:{kind:"file_read",inputKey:"file_path"}},dsh:{bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"file_path"},write:{kind:"file_write",inputKey:"file_path"}},hermes:{terminal:{kind:"shell",inputKey:"command"},read_file:{kind:"file_read",inputKey:"path"},write_file:{kind:"file_write",inputKey:"path"},patch:{kind:"file_edit",inputKey:"path"},search_files:{kind:"file_read",inputKey:"path"},skill_view:{kind:"file_read",inputKey:"name"},execute_code:{kind:"shell",inputKey:"code"},process_manage:{kind:"shell",inputKey:"action"}},agy:{run_command:{kind:"shell",inputKey:"CommandLine"},view_file:{kind:"file_read",inputKey:"AbsolutePath"},write_to_file:{kind:"file_write",inputKey:"TargetFile"},replace_file_content:{kind:"file_edit",inputKey:"TargetFile"},multi_replace_file_content:{kind:"file_edit",inputKey:"TargetFile"}}}});function ap(t){let e;try{e=TG(t)}catch{return[{kind:"mutate",note:"shell command could not be parsed"}]}let n=[],r="",s=!1;for(let i=0;i<e.length;i+=1){let a=e[i].command;if(a.argv.length===0&&a.redirects.length===0)continue;let l=BI(a.argv),c=l===a.argv?a:{...a,argv:l},u=Li(c.argv[0]?.text??"");if(u==="cd"){let f=c.argv[1];f===void 0?s=!0:f.literal?r=KI(r,f.text):s=!0;continue}if(uG.has(c.argv[0]?.text??"")){n.push({kind:"mutate",note:`compound shell construct not analyzed: ${Ge(t)}`});break}let d=bG(c);if(d!==null){let f=d.literal?ap(d.text):[{kind:"mutate",note:"sh -c script involves expansion; not analyzed"}];n.push(...f.map(m=>qI(m,r,s)));continue}n.push(...gG(c,u,GI(e,i)).map(f=>qI(f,r,s)))}return n}function gG(t,e,n){let r=[],s=t.redirects.filter(o=>o.fd===1||o.fd==="&"),i=t.redirects.filter(o=>o.fd===2);for(let o of i){let a=WI(o);a!=="ignored"&&r.push(a===null?{kind:"mutate",note:`stderr redirect target not literal: ${Ge(t.raw)}`}:{kind:"mutate",path:a,note:"file receives command stderr; content not reconstructable"})}if(s.length>0){let o=XI(t,e,n);for(let a of s){let l=WI(a);l!=="ignored"&&(l===null?r.push({kind:"mutate",note:`redirect target not literal: ${Ge(t.raw)}`}):o===null||t.hasSubstitution?r.push({kind:"mutate",path:l,note:`content not reconstructable from: ${Ge(t.raw)}`}):r.push({kind:a.op===">>"?"append":"write",path:l,content:o}))}return r}if(r.push(...wG(t,e,n)),r.length===0&&yG(t,e)){let o=t.argv.slice(1).map(a=>a.text).filter(a=>a.length>0);o.length>0&&r.push({kind:"opaque",tokens:o,command:Ge(t.raw)})}return r}function yG(t,e){return e===""||hG.has(e)?!1:pG.has(e)?e==="find"?t.argv.some(n=>n.text==="-delete"||n.text==="-exec"||n.text==="-execdir"||n.text==="-ok"):!1:!0}function BI(t){let e=0;for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1;for(;e<t.length&&mG.has(Li(t[e].text));){let n=Li(t[e].text);for(e+=1;e<t.length&&t[e].text.startsWith("-");)e+=1;if(n==="timeout"&&e<t.length&&/^\d/.test(t[e].text)&&(e+=1),n==="env")for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1}return e===0?t:t.slice(e)}function XI(t,e,n){if(t.hasSubstitution)return null;let r=t.argv.slice(1);if(e==="echo"){let s=!0,i=0;for(;i<r.length&&/^-[neE]+$/.test(r[i].text);){let a=r[i].text;if(a.includes("n")&&(s=!1),a.includes("e"))return null;i+=1}let o=r.slice(i);return o.every(a=>a.literal)?o.map(a=>a.text).join(" ")+(s?`
2552
+ `),0;let r=Y(t,["--session","--provider","--since","--until","--limit"],[]);if(r.error!==void 0)return ct(e,r.error,!0);let s=xi(M(r,"--since"),"--since");if("error"in s)return ct(e,s.error,!0);let i=xi(M(r,"--until"),"--until");if("error"in i)return ct(e,i.error,!0);let o=M(r,"--limit"),a;if(o!==void 0&&(a=Number.parseInt(o,10),!Number.isFinite(a)||a<1||String(a)!==o))return ct(e,`invalid --limit "${o}" (expected a positive integer)`,!0);let l=Et(BJ,{target:r.positionals[0],alias:r.positionals[1],flags:{session:M(r,"--session"),provider:M(r,"--provider")}});if(l.mode==="error")return ct(e,l.message,!0);if(l.mode==="managed")return ct(e,"session does not support managed-mode targets",!0);let c,u,d,f;try{if(l.mode==="ai-team"){f=l.teamfile;let y=l.alias??await n.resolveLeadAlias(l.teamfile,e),g=await n.resolveTeamTarget(l.teamfile,y,e);c=g.provider,u=g.sessionid,d=g.alias}else if(u=l.sessionid,l.provider!==void 0)c=l.provider;else{let y=await tn(u);if(y.length===0)return ct(e,`session "${u}" not found in any provider store`,!0);if(y.length>1)return ct(e,`session "${u}" matches multiple providers (${y.join(", ")}); pass --provider`,!0);c=y[0]}}catch(y){return y instanceof ve?ct(e,y.message,!0):ct(e,ip(y))}let m;try{m=await n.loadSession(u,c)}catch(y){return ct(e,`failed to load session: ${ip(y)}`)}if(m===null)return ct(e,`session not found: ${u} (provider=${c})`);let p=s.date?.getTime(),h=i.date?.getTime(),_=[];if(f!==void 0&&d!==void 0)try{_=await n.listInvocations(f,d,{sinceMs:p,untilMs:h},e)}catch(y){return ct(e,`failed to load invocation history: ${ip(y)}`)}return J(e,Oi(m,d,{invocations:_,sinceMs:p,untilMs:h,limit:a})),0}function Oi(t,e,n={}){let r=aG(t.messages),s=lG(r,JJ),i=nG(t,r!==null),o=Fl(t),a=e?.toLowerCase()==="lead",l=o.filter(p=>p.kind==="file_write").length,c=o.filter(p=>p.kind==="file_edit").length,u=Ri[t.provider],d=e===void 0?u==="none"?"none":"partial":u,f=zJ(t.messages,n.sinceMs,n.untilMs).filter(p=>p.role==="user"||p.role==="assistant").slice(-Math.max(1,Math.trunc(n.limit??XJ))).map(p=>({role:p.role,content:p.content,model:p.model??null,timestamp:p.timestamp.toISOString()})),m=n.invocations??[];return{schema_version:MI,provider:t.provider,sessionId:t.sessionId,modifiedAt:t.modifiedAt.toISOString(),lastPrompt:s.text,lastPromptTruncated:s.truncated,handled:i.value,handledSignal:i.signal,tokens:rG(t),toolCalls:o,messages:f,invocations:m,authorship:{alias:e??null,isLeadAlias:a,selfFileWriteCount:l,selfFileEditCount:c,flag:a&&l+c>0?"lead_self_authoring":null},coverage:{toolCalls:Ri[t.provider],resultPairing:jI[t.provider],backgroundTaskCorrelation:ZJ(t.provider),authorship:d,tokens:KJ[t.provider],handled:i.coverage}}}function zJ(t,e,n){return e===void 0&&n===void 0?t:t.filter(r=>{let s=r.timestamp.getTime();return!(e!==void 0&&s<e||n!==void 0&&s>n)})}function ZJ(t){return t==="claude"||t==="kimi"||t==="agy"?"full":t==="copilot"?"partial":"none"}function Fl(t){if(Ri[t.provider]==="none")return[];let e=VJ[t.provider]??{},n=new Set,r=[];for(let s=0;s<t.messages.length;s+=1){let i=t.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=e[i.toolName],a=i.toolInputData??cG(i.toolInput),l=o===void 0?void 0:QJ(o,a),c=tG(t.messages,s,i.toolCallId,n,t.provider==="agy"),u=c===void 0?void 0:t.messages[c];c!==void 0&&n.add(c);let d=o===void 0?[]:eG(o,a),f=d.length>0?d:[{kind:o?.kind??"other",value:l}];for(let m of f)r.push({kind:m.kind,name:i.toolName,...m.kind==="shell"?{command:m.value??null}:{},...m.kind==="file_read"||m.kind==="file_write"||m.kind==="file_edit"||m.kind==="network"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:u?.timestamp.toISOString()??null,result:u===void 0?null:u.toolDetailedContent??u.content})}return r}function QJ(t,e){if(e!==void 0)for(let n of[t.inputKey,...t.fallbackInputKeys??[]]){let r=op(e[n]);if(r!==void 0)return r}}function eG(t,e){if(t.multi===void 0||e===void 0)return[];let n=e[t.multi.pathsKey],r=e[t.multi.kindsKey];if(!Array.isArray(n)||!Array.isArray(r))return[];let s=[];for(let i=0;i<Math.min(n.length,r.length);i+=1){let o=op(n[i]),a=op(r[i]),l=a===void 0?void 0:t.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function tG(t,e,n,r,s){if(n===void 0)return;let i=s?0:e+1;for(let o=i;o<t.length;o+=1){let a=t[o];if(!r.has(o)&&a.role==="tool_result"&&a.toolCallId===n)return o}}function nG(t,e){if(!e)return{value:null,signal:"unavailable",coverage:"unavailable"};if(t.turnStatus!==void 0){let s=t.provider==="claude"?"native_stop_reason":t.turnStatus==="complete"?"native_task_complete":t.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:t.turnStatus==="complete",signal:s,coverage:"native"}}let n=PI(t.messages,"user");return{value:n>=0&&t.messages.slice(n+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function rG(t){let e=t.lastTokenUsage,n=iG(t),r=oG(t.provider);return{lastTurn:sG(e),aggregate:{input:n,output:t.totalOutputTokens??null,cacheRead:t.totalCachedInputTokens??null,cacheWrite:t.totalCacheWriteInputTokens??null},normalization:r}}function sG(t){return{input:t?.inputTokens??null,output:t?.outputTokens??null,cacheRead:t?.cachedInputTokens??null,cacheWrite:t?.cacheWriteInputTokens??null}}function iG(t){return t.totalInputTokens===void 0?null:t.provider==="claude"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)-(t.totalCacheWriteInputTokens??0)):t.provider==="gemini"||t.provider==="qwen"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)):t.totalInputTokens}function oG(t){switch(t){case"claude":return{id:"claude-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent"};case"gemini":return{id:"gemini-input-excludes-cache",note:"input excludes cached prompt tokens; cacheRead reports the cached subset"};case"kimi":return{id:"kimi-splits-other",note:"input is Kimi inputOther; cacheRead and cacheWrite are separate counters"};case"codex":return{id:"codex-upstream-passthrough",note:"input and cacheRead preserve Codex upstream token_count semantics"};case"opencode":case"lmplayer":return{id:"opencode-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent per-turn DB rows"};case"copilot":return{id:"copilot-shutdown-aggregate",note:"aggregate input/cache come from session.shutdown modelMetrics (absent on live sessions); lastTurn reports output only"};case"qwen":return{id:"qwen-gemini-usage-metadata",note:"input excludes cachedContentTokenCount (Gemini usageMetadata semantics: prompt includes the cached subset); output includes thoughts; no cache-write counter exists upstream"};case"dsh":return{id:"dsh-independent-counters",note:"input excludes cacheRead (verified against real sessions); reasoning is a separate counter; no cache-write counter exists upstream"};case"hermes":return{id:"hermes-session-aggregate",note:"counters are session aggregates from the sessions row (not per-turn); input excludes cacheRead; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function aG(t){let e=PI(t,"user");return e<0?null:t[e].content}function PI(t,e){for(let n=t.length-1;n>=0;n-=1)if(t[n].role===e)return n;return-1}function lG(t,e){if(t===null)return{text:null,truncated:!1};let n=Buffer.from(t,"utf8");if(n.length<=e)return{text:t,truncated:!1};let r=e;for(;r>0&&(n[r]&192)===128;)r-=1;return{text:n.subarray(0,r).toString("utf8"),truncated:!0}}function cG(t){if(t!==void 0)try{let e=JSON.parse(t);return dG(e)?e:void 0}catch{return}}function dG(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function op(t){return typeof t=="string"?t:void 0}function ct(t,e,n=!1){return J(t,{schema_version:MI,error:e,...n?{usage:DI}:{}}),1}function ip(t){return t instanceof Error?t.message:String(t)}var MI,BJ,XJ,JJ,DI,GJ,Ri,jI,CI,KJ,$I,VJ,Ul=E(()=>{"use strict";vt();Ie();Tt();Dt();en();sp();MI=2,BJ={name:"session",allowsBareTeamfile:!0,supportsRaw:!0},XJ=500,JJ=32*1024,DI=["usage: lmctl session [target] [alias] [--since <duration|ISO8601>] [--until <duration|ISO8601>]"," lmctl session --session <id> --provider <name> [--since ...] [--until ...] [--limit N]","","Inspect one native provider session through a versioned JSON contract:","conversation messages, classified tool calls (shell/file/network), token","usage, and lmctl's own dispatch history (tracked_invocation) for the","same target. A bare <teamfile> with no alias inspects that team's Lead.","--since/--until bound `messages` by timestamp and `invocations` by","start time (duration like 24h, or an absolute ISO8601 timestamp).","--limit caps `messages` to the most recent N (default 500)."].join(`
2553
+ `),GJ={loadSession:Ne,resolveTeamTarget:(t,e,n)=>$(n,r=>je(t,e,r)),resolveLeadAlias:async(t,e)=>{let n=await $(e,i=>be(t,i)),r=$e(n),s=wt(r);if(s===void 0)throw new Error(`${t} has no Lead member; pass <tf>:<alias>`);return s.alias},listInvocations:(t,e,n,r)=>$(r,s=>s.listTrackedInvocationsForTarget(t,e,n).map(i=>({id:i.id,kind:i.kind,origin:i.origin,status:i.status,from_identity:i.from_identity,command:i.command,started_at:i.started_at,ended_at:i.ended_at,exit_code:i.exit_code,error:i.error})))},Ri={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",dsh:"full",hermes:"full",ClaudeMock:"none"},jI={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",dsh:"full",hermes:"full",ClaudeMock:"none"},CI={none:0,heuristic:1,partial:2,full:3};for(let t of Object.keys(Ri))if(CI[jI[t]]>CI[Ri[t]])throw new Error(`invalid session coverage for ${t}: result pairing exceeds tool-call coverage`);KJ={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",dsh:"partial",hermes:"partial",ClaudeMock:"none"},$I={bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"filePath",fallbackInputKeys:["path","file"]},write:{kind:"file_write",inputKey:"filePath",fallbackInputKeys:["path","file"]},edit:{kind:"file_edit",inputKey:"filePath",fallbackInputKeys:["path","file"]}},VJ={claude:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"file_path"},Write:{kind:"file_write",inputKey:"file_path"},Edit:{kind:"file_edit",inputKey:"file_path"},WebFetch:{kind:"network",inputKey:"url"},WebSearch:{kind:"network",inputKey:"query"}},codex:{exec_command:{kind:"shell",inputKey:"cmd"},apply_patch:{kind:"file_edit",inputKey:"path",multi:{pathsKey:"paths",kindsKey:"kinds",kindByValue:{Add:"file_write",Update:"file_edit",Move:"file_edit",Delete:"file_edit"}}}},copilot:{bash:{kind:"shell",inputKey:"command"}},opencode:$I,lmplayer:$I,kimi:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"path"},Write:{kind:"file_write",inputKey:"path"},Edit:{kind:"file_edit",inputKey:"path"}},qwen:{run_shell_command:{kind:"shell",inputKey:"command"},read_file:{kind:"file_read",inputKey:"file_path"}},dsh:{bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"file_path"},write:{kind:"file_write",inputKey:"file_path"}},hermes:{terminal:{kind:"shell",inputKey:"command"},read_file:{kind:"file_read",inputKey:"path"},write_file:{kind:"file_write",inputKey:"path"},patch:{kind:"file_edit",inputKey:"path"},search_files:{kind:"file_read",inputKey:"path"},skill_view:{kind:"file_read",inputKey:"name"},execute_code:{kind:"shell",inputKey:"code"},process_manage:{kind:"shell",inputKey:"action"}},agy:{run_command:{kind:"shell",inputKey:"CommandLine"},view_file:{kind:"file_read",inputKey:"AbsolutePath"},write_to_file:{kind:"file_write",inputKey:"TargetFile"},replace_file_content:{kind:"file_edit",inputKey:"TargetFile"},multi_replace_file_content:{kind:"file_edit",inputKey:"TargetFile"}}}});function ap(t){let e;try{e=TG(t)}catch{return[{kind:"mutate",note:"shell command could not be parsed"}]}let n=[],r="",s=!1;for(let i=0;i<e.length;i+=1){let a=e[i].command;if(a.argv.length===0&&a.redirects.length===0)continue;let l=BI(a.argv),c=l===a.argv?a:{...a,argv:l},u=Li(c.argv[0]?.text??"");if(u==="cd"){let f=c.argv[1];f===void 0?s=!0:f.literal?r=KI(r,f.text):s=!0;continue}if(uG.has(c.argv[0]?.text??"")){n.push({kind:"mutate",note:`compound shell construct not analyzed: ${Ge(t)}`});break}let d=bG(c);if(d!==null){let f=d.literal?ap(d.text):[{kind:"mutate",note:"sh -c script involves expansion; not analyzed"}];n.push(...f.map(m=>qI(m,r,s)));continue}n.push(...gG(c,u,GI(e,i)).map(f=>qI(f,r,s)))}return n}function gG(t,e,n){let r=[],s=t.redirects.filter(o=>o.fd===1||o.fd==="&"),i=t.redirects.filter(o=>o.fd===2);for(let o of i){let a=WI(o);a!=="ignored"&&r.push(a===null?{kind:"mutate",note:`stderr redirect target not literal: ${Ge(t.raw)}`}:{kind:"mutate",path:a,note:"file receives command stderr; content not reconstructable"})}if(s.length>0){let o=XI(t,e,n);for(let a of s){let l=WI(a);l!=="ignored"&&(l===null?r.push({kind:"mutate",note:`redirect target not literal: ${Ge(t.raw)}`}):o===null||t.hasSubstitution?r.push({kind:"mutate",path:l,note:`content not reconstructable from: ${Ge(t.raw)}`}):r.push({kind:a.op===">>"?"append":"write",path:l,content:o}))}return r}if(r.push(...wG(t,e,n)),r.length===0&&yG(t,e)){let o=t.argv.slice(1).map(a=>a.text).filter(a=>a.length>0);o.length>0&&r.push({kind:"opaque",tokens:o,command:Ge(t.raw)})}return r}function yG(t,e){return e===""||hG.has(e)?!1:pG.has(e)?e==="find"?t.argv.some(n=>n.text==="-delete"||n.text==="-exec"||n.text==="-execdir"||n.text==="-ok"):!1:!0}function BI(t){let e=0;for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1;for(;e<t.length&&mG.has(Li(t[e].text));){let n=Li(t[e].text);for(e+=1;e<t.length&&t[e].text.startsWith("-");)e+=1;if(n==="timeout"&&e<t.length&&/^\d/.test(t[e].text)&&(e+=1),n==="env")for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1}return e===0?t:t.slice(e)}function XI(t,e,n){if(t.hasSubstitution)return null;let r=t.argv.slice(1);if(e==="echo"){let s=!0,i=0;for(;i<r.length&&/^-[neE]+$/.test(r[i].text);){let a=r[i].text;if(a.includes("n")&&(s=!1),a.includes("e"))return null;i+=1}let o=r.slice(i);return o.every(a=>a.literal)?o.map(a=>a.text).join(" ")+(s?`
2554
2554
  `:""):null}if(e==="printf"){if(r.length===0||!r.every(i=>i.literal))return null;let s=r[0].text;return r.length===1?/[%\\]/.test(s)?null:s:s==="%s\\n"||s===`%s
2555
2555
  `?r.slice(1).map(i=>`${i.text}
2556
2556
  `).join(""):null}return e==="cat"?r.filter(i=>!i.text.startsWith("-")).length>0?null:t.heredoc!==void 0?t.heredoc.safe?t.heredoc.body:null:n!==null?n:null:e===""?"":null}function wG(t,e,n){let r=t.argv.slice(1),s=r.filter(o=>!o.text.startsWith("-")),i=r.filter(o=>o.text.startsWith("-")).map(o=>o.text).join(" ");switch(e){case"tee":{let o=i.includes("a"),a=[],l=t.heredoc!==void 0?t.heredoc.safe?t.heredoc.body:null:n;for(let c of s)c.literal?l===null||t.hasSubstitution?a.push({kind:"mutate",path:c.text,note:`tee content not reconstructable from: ${Ge(t.raw)}`}):a.push({kind:o?"append":"write",path:c.text,content:l}):a.push({kind:"mutate",note:`tee target not literal: ${Ge(t.raw)}`});return a}case"rm":{let o=/r/i.test(i);return s.map(a=>a.literal?{kind:"delete",path:a.text,recursive:o}:{kind:"mutate",note:`rm target not literal (recovery may resurrect files deleted by: ${Ge(t.raw)})`})}case"mv":case"cp":{let o=/[rR]/.test(i);if(s.length!==2||s.some(c=>!c.literal)||e==="cp"&&o)return[{kind:"mutate",note:`${e} form not analyzed: ${Ge(t.raw)}`}];let[a,l]=[s[0].text,s[1].text];return[e==="mv"?{kind:"move",from:a,to:l}:{kind:"copy",from:a,to:l}]}case"touch":return s.map(o=>o.literal?{kind:"touch",path:o.text}:{kind:"mutate",note:`touch target not literal: ${Ge(t.raw)}`});case"truncate":{let o=r.some((a,l)=>a.text==="-s"&&r[l+1]?.text==="0")||r.some(a=>a.text==="-s0");return s.map(a=>a.literal&&o?{kind:"write",path:a.text,content:""}:{kind:"mutate",...a.literal?{path:a.text}:{},note:`truncate form not analyzed: ${Ge(t.raw)}`})}case"sed":case"perl":{if(!(r.some(l=>l.text==="-i"||l.text.startsWith("-i."))||/^-[a-hj-z]*i/.test(r[0]?.text??"")))return[];let a=s.slice(1);return a.length===0?[{kind:"mutate",note:`${e} -i with no identifiable path: ${Ge(t.raw)}`}]:a.map(l=>({kind:"mutate",...l.literal?{path:l.text}:{},note:`${e} -i edit not reconstructable: ${Ge(t.raw)}`}))}case"ln":case"install":case"rsync":case"patch":case"unzip":case"dd":return[{kind:"mutate",note:`${e} invocation not analyzed: ${Ge(t.raw)}`}];case"tar":return/x/.test(r[0]?.text??"")?[{kind:"mutate",note:`tar extraction not analyzed: ${Ge(t.raw)}`}]:[];case"git":{let o=EG(r);return o!==void 0&&_G.has(o)?[]:[{kind:"mutate",note:`git ${o??"command"} may modify working-tree files: ${Ge(t.raw)}`}]}default:return[]}}function EG(t){let e=new Set(["-C","-c","--git-dir","--work-tree","--namespace","--super-prefix","--config-env","--exec-path"]);for(let n=0;n<t.length;n+=1){let r=t[n].text;if(r==="--version"||r==="--help")return r;if(e.has(r)){n+=1;continue}if(!(/^(?:-C|-c).+/.test(r)||/^--(?:git-dir|work-tree|namespace|super-prefix|config-env|exec-path)=/.test(r)||r.startsWith("-")))return r}}function TG(t){let e=[],n=UI(),r=null,s="",i=!0,o=!1,a=[],l=[0],c=()=>{o&&(n.argv.push({text:s,literal:i}),s="",i=!0,o=!1)},u=(f,m)=>{c(),n.raw=t.slice(l[l.length-1],m).trim(),e.push({command:n,connector:r}),r=f,n=UI(),l.push(m+1)},d=0;for(;d<t.length;){let f=t[d];if(f==="'"){let m=t.indexOf("'",d+1);if(m===-1)throw new Error("unterminated single quote");s+=t.slice(d+1,m),o=!0,d=m+1;continue}if(f==='"'){let m=JI(t,d+1);if(m===-1)throw new Error("unterminated double quote");let p=t.slice(d+1,m);/[$`]/.test(p)&&(i=!1),s+=p.replace(/\\([$`"\\])/g,"$1"),o=!0,d=m+1;continue}if(f==="\\"){if(d+1<t.length){let m=t[d+1];if(m===`
@@ -2576,25 +2576,25 @@ Send a prompt to a team member or raw provider session, or answer a paused run.`
2576
2576
 
2577
2577
  ${fs}`);let s=M(r,"--dir");if(s!==void 0)return r.positionals.length>0?k(e,`--dir targets a directory and takes no <teamfile>/<alias>
2578
2578
 
2579
- ${fs}`):B(r,"--single-session")?k(e,"--single-session applies to <teamfile> <alias> targeting; --dir always merges every discovered session"):UG(s,r,e,n);if(B(r,"--recursive"))return k(e,`--recursive requires --dir
2579
+ ${fs}`):X(r,"--single-session")?k(e,"--single-session applies to <teamfile> <alias> targeting; --dir always merges every discovered session"):UG(s,r,e,n);if(X(r,"--recursive"))return k(e,`--recursive requires --dir
2580
2580
 
2581
2581
  ${fs}`);if(r.positionals.length===0)return k(e,`restore requires a <teamfile> (or --dir <path>)
2582
2582
 
2583
2583
  ${fs}`);if(r.positionals.length>2)return k(e,`unexpected argument: ${r.positionals[2]}`);let i=r.positionals[0],o=pr(i),a=o?.teamfile??i,l=r.positionals[1],c=o?.alias??l;if(o!==null&&l!==void 0)return k(e,"restore alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(c===void 0)return k(e,`restore requires an <alias>
2584
2584
 
2585
- ${fs}`);let u;try{u=await n.resolveTeamTarget(a,c,e)}catch(b){if(b instanceof ve)return k(e,b.message);throw b}let d;try{d=await n.loadSession(u.sessionid,u.provider)}catch(b){return k(e,`failed to load session: ${Gl(b)}`)}if(d===null)return k(e,`session not found: ${u.sessionid} (provider=${u.provider})`);let f=B(r,"--dry-run"),m=B(r,"--force"),p=B(r,"--single-session")||n.resolveTeamRoster===void 0,h=M(r,"--target"),_=h===void 0?void 0:wn(h),y=p?[u]:WG([u,...await n.resolveTeamRoster(a,e)]),g=[],w=[],T=[];for(let b of y){if(b.sessionid===u.sessionid){T.push({member:b,detail:d}),w.push(wr(b,"target",0));continue}try{let R=await n.loadSession(b.sessionid,b.provider);if(R===null){w.push(wr(b,"not_found",0)),g.push(`team member ${b.alias}: session ${b.sessionid} not found \u2014 its file history is missing from this recovery`);continue}T.push({member:b,detail:R}),w.push(wr(b,"merged",0))}catch(R){w.push(wr(b,"load_error",0)),g.push(`team member ${b.alias}: session load failed (${Gl(R)}) \u2014 its file history is missing from this recovery`)}}let N={toolCalls:Oi(d).coverage.toolCalls,structuredReplay:oN[d.provider],shellScan:up[d.provider]!==void 0?"best_effort":"none",crossSession:p?"single_session":"team_merged",...Xl[d.provider]!==void 0?{structuredNote:Xl[d.provider]}:{},shellNote:aN};return lN(e,{json:B(r,"--json"),dryRun:f,force:m,absTarget:_,loaded:T,members:w,loadWarnings:g,coverage:N,mode:p?"single_session":"team",headerJson:{provider:d.provider,sessionId:d.sessionId,sessionCwd:d.cwd},describe:p?" (single session)":` from ${T.length} team session(s)`})}function nN(t){let e=wn(t),n=[];for(;;)try{return MG(xG(e),...n.reverse())}catch{let r=Kl(e);if(r===e)return wn(t);n.push(iN(e)),e=r}}async function UG(t,e,n,r){if(r.discoverSessions===void 0)return k(n,"--dir is not available: session discovery is not wired in this harness");let s=nN(t),i=B(e,"--recursive"),o;try{o=await r.discoverSessions()}catch(g){return k(n,`session discovery failed: ${Gl(g)}`)}let a=s.endsWith("/")?s:`${s}/`,l=new Set,c=[],u=0,d=0,f=0;for(let g of o){let w=`${g.provider}:${g.sessionId}`;if(l.has(w)){f+=1;continue}if(l.add(w),typeof g.cwd!="string"||g.cwd.trim()===""){u+=1;continue}let T=nN(g.cwd);T===s||i&&T.startsWith(a)?c.push(g):d+=1}if(c.sort((g,w)=>g.createdAt.getTime()-w.createdAt.getTime()),c.length===0)return k(n,`no provider sessions recorded working directory ${s}${i?" (or its subdirectories)":""} \u2014 checked ${o.length} session(s); ${u} had no recorded cwd`);let m=[],p=[],h=[];for(let g of c){let w={teamfile:"",alias:`${g.provider}:${g.sessionId}`,provider:g.provider,sessionid:g.sessionId,sessiondir:g.cwd,isLead:!1};try{let T=await r.loadSession(g.sessionId,g.provider);if(T===null){p.push(wr(w,"not_found",0)),m.push(`session ${w.alias}: discovered but not loadable \u2014 its file history is missing from this recovery`);continue}h.push({member:w,detail:T}),p.push(wr(w,"merged",0))}catch(T){p.push(wr(w,"load_error",0)),m.push(`session ${w.alias}: load failed (${Gl(T)}) \u2014 its file history is missing from this recovery`)}}let y={crossSession:"directory_merged",providers:[...new Set(h.map(g=>g.detail.provider))].map(g=>({provider:g,structuredReplay:oN[g],shellScan:up[g]!==void 0?"best_effort":"none",...Xl[g]!==void 0?{structuredNote:Xl[g]}:{}})),shellNote:aN};return lN(n,{json:B(e,"--json"),dryRun:B(e,"--dry-run"),force:B(e,"--force"),absTarget:M(e,"--target")===void 0?void 0:wn(M(e,"--target")),loaded:h,members:p,loadWarnings:m,coverage:y,mode:"directory",headerJson:{dir:s,recursive:i,discovery:{sessionsScanned:o.length,duplicates:f,matched:c.length,merged:h.length,excludedNoCwd:u,excludedOutsideDir:d}},describe:` from ${h.length} session(s) recorded in ${s}`})}async function lN(t,e){let{dryRun:n,force:r,absTarget:s,loaded:i,members:o,loadWarnings:a}=e,l=qG(i);for(let h of o)h.fileOps=l.filter(_=>_.alias===h.alias).length;let{files:c,warnings:u}=await JG(l,{dryRun:n,force:r,targetDir:s}),d=[...a,...u],f=i.flatMap(({member:h,detail:_})=>VG(_,l.filter(y=>y.alias===h.alias),h.alias)),m={files:c.length,written:c.filter(h=>h.action==="written").length,wouldWrite:c.filter(h=>h.action==="would_write").length,skipped:c.filter(h=>h.action==="skipped").length,unreplayable:c.filter(h=>h.action==="unreplayable").length,stitchedFiles:c.filter(h=>h.aliases.length>1).length,unreplayedCalls:f.length,warnings:d.length},p=m.unreplayable>0||m.unreplayedCalls>0||m.warnings>0;if(e.json)X(t,{schema_version:DG,...e.headerJson,target:s??null,dryRun:n,force:r,mode:e.mode,members:o,coverage:e.coverage,summary:m,files:c,unreplayedCalls:f,warnings:d});else{for(let h of c){let _=h.aliases.length>1?` [stitched: ${h.aliases.join("+")}]`:"",y=h.detail===null?"":` \u2014 ${h.detail}`;t.stdout.write(`${h.path}: ${h.action} (${h.reason})${_}${y}
2585
+ ${fs}`);let u;try{u=await n.resolveTeamTarget(a,c,e)}catch(b){if(b instanceof ve)return k(e,b.message);throw b}let d;try{d=await n.loadSession(u.sessionid,u.provider)}catch(b){return k(e,`failed to load session: ${Gl(b)}`)}if(d===null)return k(e,`session not found: ${u.sessionid} (provider=${u.provider})`);let f=X(r,"--dry-run"),m=X(r,"--force"),p=X(r,"--single-session")||n.resolveTeamRoster===void 0,h=M(r,"--target"),_=h===void 0?void 0:wn(h),y=p?[u]:WG([u,...await n.resolveTeamRoster(a,e)]),g=[],w=[],T=[];for(let b of y){if(b.sessionid===u.sessionid){T.push({member:b,detail:d}),w.push(wr(b,"target",0));continue}try{let R=await n.loadSession(b.sessionid,b.provider);if(R===null){w.push(wr(b,"not_found",0)),g.push(`team member ${b.alias}: session ${b.sessionid} not found \u2014 its file history is missing from this recovery`);continue}T.push({member:b,detail:R}),w.push(wr(b,"merged",0))}catch(R){w.push(wr(b,"load_error",0)),g.push(`team member ${b.alias}: session load failed (${Gl(R)}) \u2014 its file history is missing from this recovery`)}}let N={toolCalls:Oi(d).coverage.toolCalls,structuredReplay:oN[d.provider],shellScan:up[d.provider]!==void 0?"best_effort":"none",crossSession:p?"single_session":"team_merged",...Xl[d.provider]!==void 0?{structuredNote:Xl[d.provider]}:{},shellNote:aN};return lN(e,{json:X(r,"--json"),dryRun:f,force:m,absTarget:_,loaded:T,members:w,loadWarnings:g,coverage:N,mode:p?"single_session":"team",headerJson:{provider:d.provider,sessionId:d.sessionId,sessionCwd:d.cwd},describe:p?" (single session)":` from ${T.length} team session(s)`})}function nN(t){let e=wn(t),n=[];for(;;)try{return MG(xG(e),...n.reverse())}catch{let r=Kl(e);if(r===e)return wn(t);n.push(iN(e)),e=r}}async function UG(t,e,n,r){if(r.discoverSessions===void 0)return k(n,"--dir is not available: session discovery is not wired in this harness");let s=nN(t),i=X(e,"--recursive"),o;try{o=await r.discoverSessions()}catch(g){return k(n,`session discovery failed: ${Gl(g)}`)}let a=s.endsWith("/")?s:`${s}/`,l=new Set,c=[],u=0,d=0,f=0;for(let g of o){let w=`${g.provider}:${g.sessionId}`;if(l.has(w)){f+=1;continue}if(l.add(w),typeof g.cwd!="string"||g.cwd.trim()===""){u+=1;continue}let T=nN(g.cwd);T===s||i&&T.startsWith(a)?c.push(g):d+=1}if(c.sort((g,w)=>g.createdAt.getTime()-w.createdAt.getTime()),c.length===0)return k(n,`no provider sessions recorded working directory ${s}${i?" (or its subdirectories)":""} \u2014 checked ${o.length} session(s); ${u} had no recorded cwd`);let m=[],p=[],h=[];for(let g of c){let w={teamfile:"",alias:`${g.provider}:${g.sessionId}`,provider:g.provider,sessionid:g.sessionId,sessiondir:g.cwd,isLead:!1};try{let T=await r.loadSession(g.sessionId,g.provider);if(T===null){p.push(wr(w,"not_found",0)),m.push(`session ${w.alias}: discovered but not loadable \u2014 its file history is missing from this recovery`);continue}h.push({member:w,detail:T}),p.push(wr(w,"merged",0))}catch(T){p.push(wr(w,"load_error",0)),m.push(`session ${w.alias}: load failed (${Gl(T)}) \u2014 its file history is missing from this recovery`)}}let y={crossSession:"directory_merged",providers:[...new Set(h.map(g=>g.detail.provider))].map(g=>({provider:g,structuredReplay:oN[g],shellScan:up[g]!==void 0?"best_effort":"none",...Xl[g]!==void 0?{structuredNote:Xl[g]}:{}})),shellNote:aN};return lN(n,{json:X(e,"--json"),dryRun:X(e,"--dry-run"),force:X(e,"--force"),absTarget:M(e,"--target")===void 0?void 0:wn(M(e,"--target")),loaded:h,members:p,loadWarnings:m,coverage:y,mode:"directory",headerJson:{dir:s,recursive:i,discovery:{sessionsScanned:o.length,duplicates:f,matched:c.length,merged:h.length,excludedNoCwd:u,excludedOutsideDir:d}},describe:` from ${h.length} session(s) recorded in ${s}`})}async function lN(t,e){let{dryRun:n,force:r,absTarget:s,loaded:i,members:o,loadWarnings:a}=e,l=qG(i);for(let h of o)h.fileOps=l.filter(_=>_.alias===h.alias).length;let{files:c,warnings:u}=await JG(l,{dryRun:n,force:r,targetDir:s}),d=[...a,...u],f=i.flatMap(({member:h,detail:_})=>VG(_,l.filter(y=>y.alias===h.alias),h.alias)),m={files:c.length,written:c.filter(h=>h.action==="written").length,wouldWrite:c.filter(h=>h.action==="would_write").length,skipped:c.filter(h=>h.action==="skipped").length,unreplayable:c.filter(h=>h.action==="unreplayable").length,stitchedFiles:c.filter(h=>h.aliases.length>1).length,unreplayedCalls:f.length,warnings:d.length},p=m.unreplayable>0||m.unreplayedCalls>0||m.warnings>0;if(e.json)J(t,{schema_version:DG,...e.headerJson,target:s??null,dryRun:n,force:r,mode:e.mode,members:o,coverage:e.coverage,summary:m,files:c,unreplayedCalls:f,warnings:d});else{for(let h of c){let _=h.aliases.length>1?` [stitched: ${h.aliases.join("+")}]`:"",y=h.detail===null?"":` \u2014 ${h.detail}`;t.stdout.write(`${h.path}: ${h.action} (${h.reason})${_}${y}
2586
2586
  `)}for(let h of f)t.stdout.write(`unreplayed ${h.kind} call ${h.tool} [${h.alias}]${h.path===null?"":` ${h.path}`}: ${h.reason}
2587
2587
  `);for(let h of d)t.stdout.write(`warning: ${h}
2588
2588
  `);t.stdout.write(`Restore ${n?"planned":"replayed"} ${m.files} file(s)${e.describe}: ${n?`${m.wouldWrite} would write`:`${m.written} written`}, ${m.skipped} skipped, ${m.unreplayable} unreplayable, ${m.stitchedFiles} stitched, ${m.unreplayedCalls} unreplayed call(s), ${m.warnings} warning(s).
2589
2589
  `),p&&t.stdout.write(`warning: recovery is incomplete \u2014 see per-file reasons above
2590
- `)}return p?1:0}function WG(t){let e=new Set,n=[];for(let r of t)e.has(r.sessionid)||(e.add(r.sessionid),n.push(r));return n}function wr(t,e,n){return{alias:t.alias,provider:t.provider,sessionId:t.sessionid,status:e,fileOps:n}}function qG(t){let e=[];for(let n=0;n<t.length;n+=1){let{member:r,detail:s}=t[n],i=cN(s);for(let o=0;o<i.length;o+=1)e.push({op:{...i[o],alias:r.alias,cwd:s.cwd},rosterIndex:n,seq:o})}return e.sort((n,r)=>n.op.timestamp.getTime()-r.op.timestamp.getTime()||n.rosterIndex-r.rosterIndex||n.seq-r.seq),e.map(n=>n.op)}function cN(t){let e=jG[t.provider]??{},n=up[t.provider]??{},r=[];for(let s of t.messages){if(s.role!=="tool_use"||s.toolName===void 0)continue;let i=s.toolInputData??eK(s.toolInput);if(i===void 0)continue;let o={timestamp:s.timestamp,callId:s.toolCallId??null,tool:s.toolName},a=e[s.toolName];if(a!==void 0){let c=HG(a,i);c!==null&&r.push({effect:c,source:"structured",...o});continue}if(t.provider==="codex"&&s.toolName==="apply_patch"){r.push(...BG(i,o));continue}let l=n[s.toolName];if(l!==void 0){let c=XG(i[l]);if(c===null)continue;for(let u of ap(c))r.push({effect:u,source:"shell",...o})}}return r}function HG(t,e){let n=Hl(e,t.pathKeys);if(n===void 0)return null;if(t.op==="write"){let o=Hl(e,t.contentKeys);return o===void 0?null:{kind:"write",path:n,content:o}}let r=Hl(e,t.oldKeys),s=Hl(e,t.newKeys);if(r===void 0||s===void 0)return null;let i=t.replaceAllKeys.some(o=>e[o]===!0);return{kind:"edit",path:n,oldString:r,newString:s,replaceAll:i}}function BG(t,e){let n=typeof t.input=="string"?t.input:void 0;if(n===void 0)return[];let r=ZI(n);return r===null?[]:r.map(s=>({effect:s.kind==="add"?{kind:"write",path:s.path,content:s.content}:s.kind==="delete"?{kind:"delete",path:s.path,recursive:!1}:{kind:"hunks",path:s.path,hunks:s.hunks,...s.moveTo!==void 0?{moveTo:s.moveTo}:{}},source:"patch",...e}))}function XG(t){if(typeof t=="string")return t;if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))return null;let e=t,n=e.findIndex(r=>/^-[a-z]*c[a-z]*$/.test(r));return n!==-1&&n+1<e.length?e[n+1]:e.some(r=>/[\s'"$`;|&<>()]/.test(r))?null:e.join(" ")}async function JG(t,e){let n=new Map,r=[],s=new Set,i=[],o=(d,f,m)=>{let p=n.get(d);return p===void 0&&(p={state:"unknown",content:null,lastOp:m.timestamp,ops:0,sessionPath:f,sources:new Set,aliases:[]},n.set(d,p)),p.lastOp=m.timestamp,p.ops+=1,p.sources.add(m.source),p.aliases.includes(m.alias)||p.aliases.push(m.alias),p},a=(d,f)=>{let m=ZG(d,f.cwd,e.targetDir);if(m.abs!==void 0)return m.abs;if(!s.has(d)){s.add(d);let p=m.reason==="symlink_path";r.push({path:d,sessionPath:d,ops:1,sources:[f.source],aliases:[f.alias],action:p?"unreplayable":"skipped",reason:m.reason,detail:null,sessionMtime:f.timestamp.toISOString(),diskMtime:null})}return null},l=async(d,f)=>{if(d.state==="known")return d.content;if(d.ops>1||!lp(f))return null;try{return await OG(f,"utf8")}catch{return null}},c=(d,f,m)=>{d.state="unknown",d.content=null,d.unknownReason=f,m!==void 0&&(d.unknownDetail=m)};for(let d of t){let f=d.effect;switch(f.kind){case"write":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);p.state="known",p.content=f.content,delete p.unknownReason,delete p.unknownDetail;break}case"append":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;let h=p.state==="deleted"?"":await l(p,m)??"";p.state="known",p.content=h+f.content,delete p.unknownReason,delete p.unknownDetail;break}case"edit":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"edit_mismatch","edit follows in-session delete");break}let h=await l(p,m);if(h===null){c(p,"edit_base_missing");break}let _=KG(h,f.oldString,f.newString,f.replaceAll);if(_===null){c(p,"edit_mismatch");break}p.state="known",p.content=_;break}case"hunks":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"patch_context_mismatch","update follows in-session delete");break}let h=await l(p,m);if(h===null){c(p,"edit_base_missing");break}let _=QI(h,f.hunks);if(_===null){c(p,"patch_context_mismatch");break}if(p.state="known",p.content=_,f.moveTo!==void 0){let y=a(f.moveTo,d);if(y!==null){let g=o(y,f.moveTo,d);g.state="known",g.content=_,p.state="deleted",p.content=null}}break}case"delete":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state="deleted",p.content=null,f.recursive){let h=m.endsWith("/")?m:`${m}/`;for(let[_,y]of n)_.startsWith(h)&&(y.state="deleted",y.content=null,y.lastOp=d.timestamp,y.ops+=1)}break}case"move":case"copy":{let m=a(f.from,d),p=a(f.to,d),h=m===null?void 0:n.get(m);if(p!==null){let _=o(p,f.to,d);h!==void 0&&h.state==="known"?(_.state="known",_.content=h.content,delete _.unknownReason,delete _.unknownDetail):c(_,"move_source_unknown",`${f.kind} source ${f.from} content not tracked in this session`)}if(f.kind==="move"&&m!==null){let _=o(m,f.from,d);_.state="deleted",_.content=null}break}case"touch":{let m=a(f.path,d);if(m===null)break;let p=n.get(m);if(p?.state==="deleted"){let h=o(m,f.path,d);h.state="known",h.content="",delete h.unknownReason,delete h.unknownDetail}else if(p!==void 0)o(m,f.path,d);else if(!lp(m)){let h=o(m,f.path,d);h.state="known",h.content=""}break}case"mutate":{if(f.path===void 0){i.push(`${d.tool} @ ${d.timestamp.toISOString()}: ${f.note}`);for(let h of n.values())h.state!=="unknown"&&(h.lastOp=d.timestamp,h.ops+=1,h.sources.add(d.source),h.aliases.includes(d.alias)||h.aliases.push(d.alias),c(h,"not_reconstructable",f.note));break}let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);c(p,"not_reconstructable",f.note);break}case"opaque":{let m=!1;for(let[p,h]of n)h.state!=="unknown"&&YG(f.tokens,p,h.sessionPath)&&(m=!0,h.lastOp=d.timestamp,h.ops+=1,h.sources.add(d.source),h.aliases.includes(d.alias)||h.aliases.push(d.alias),c(h,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`));for(let p of zG(f.tokens)){let h=a(p,d);if(h===null||n.has(h))continue;m=!0;let _=o(h,p,d);c(_,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`)}m||i.push(`${d.tool} @ ${d.timestamp.toISOString()}: unrecognized command may mutate files: ${f.command}`);break}}}let u=[...r];for(let[d,f]of n)u.push(await GG(d,f,e));return{files:u,warnings:i}}async function GG(t,e,n){if(n.targetDir!==void 0&&Jl(n.targetDir,t))return yr(t,e,"unreplayable","symlink_path",null,"restore target contains a symbolic link");let r=lp(t)?await $G(t):null,s=r?.mtime??null;if(e.state==="deleted")return yr(t,e,"skipped","deleted_in_session",s,null);if(e.state==="unknown"||e.content===null)return yr(t,e,"unreplayable",e.unknownReason??"not_reconstructable",s,e.unknownDetail??null);let i;if(r===null)i="missing_on_disk";else if(e.lastOp.getTime()>r.mtimeMs)i="session_newer";else if(n.force)i="forced";else return yr(t,e,"skipped","disk_newer_or_equal",s,null);if(n.dryRun)return yr(t,e,"would_write",i,s,null);if(n.targetDir===void 0)await cp(Kl(t),{recursive:!0}),await sN(t,e.content,"utf8"),await rN(t,e.lastOp,e.lastOp);else try{await QG(n.targetDir,t,e.content,e.lastOp)}catch(o){if(o instanceof yn)return yr(t,e,"unreplayable","symlink_path",s,o.message);throw o}return yr(t,e,"written",i,s,null)}function KG(t,e,n,r){return e===""?t===""?n:null:t.includes(e)?r?t.split(e).join(n):t.replace(e,n):null}function VG(t,e,n){let r=new Set(e.map(o=>o.callId).filter(o=>o!==null)),s=Oi(t),i=[];for(let o of s.toolCalls)o.kind!=="file_write"&&o.kind!=="file_edit"||o.callId!==null&&r.has(o.callId)||i.push({tool:o.name,alias:n,kind:o.kind,path:o.path??null,callId:o.callId,startedAt:o.startedAt,reason:"content extraction is not supported for this tool call"});return i}function YG(t,e,n){let r=iN(e);for(let s of t)if(s===e||s===n||s.includes(e)||n.length>=3&&s.includes(n)||r.length>=3&&(s===r||s.endsWith(`/${r}`))||r.length>=5&&s.includes(r))return!0;return!1}function zG(t){return[...new Set(t.filter(e=>e===""||e.startsWith("-")||/[$`*?{}();]/.test(e)||/\s/.test(e)?!1:Bl(e)||e.includes("/")||/(?:^|\.)[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{1,16}$/.test(e)))]}function ZG(t,e,n){if(n===void 0)return Bl(t)?{abs:t}:e===""?{reason:"unresolvable_path"}:{abs:wn(e,t)};let r=Bl(t)?e===""?void 0:dp(e,t):t;if(r===void 0)return{reason:"unresolvable_path"};let s=wn(n,r),i=dp(n,s);return i===""||i.startsWith("..")||Bl(i)?{reason:"outside_target"}:Jl(n,s)?{reason:"symlink_path"}:{abs:s}}function Jl(t,e){let n=e;for(;;){try{if(AG(n).isSymbolicLink())return!0}catch(s){if(s.code!=="ENOENT")throw s}if(n===t)return!1;let r=Kl(n);if(r===n)return!0;n=r}}async function QG(t,e,n,r){try{let l=await ql(t);if(l.isSymbolicLink()||!l.isDirectory())throw new yn(`unsafe restore root: ${t}`)}catch(l){if(l.code!=="ENOENT")throw l;await cp(t,{recursive:!0});let c=await ql(t);if(c.isSymbolicLink()||!c.isDirectory())throw new yn(`unsafe restore root: ${t}`)}let s=dp(t,Kl(e)),i=t;for(let l of s===""?[]:s.split(/[\\/]/)){i=wn(i,l);try{let c=await ql(i);if(c.isSymbolicLink()||!c.isDirectory())throw new yn(`unsafe restore parent: ${i}`)}catch(c){if(c.code!=="ENOENT")throw c;await cp(i);let u=await ql(i);if(u.isSymbolicLink()||!u.isDirectory())throw new yn(`unsafe restore parent: ${i}`)}}if(Jl(t,e))throw new yn(`restore target contains a symbolic link: ${e}`);let o=await RG(wn(i,".lmctl-restore-")),a=wn(o,"content.tmp");try{if(await sN(a,n,{encoding:"utf8",flag:"wx"}),await rN(a,r,r),Jl(t,e))throw new yn(`restore target contains a symbolic link: ${e}`);await LG(a,e)}finally{await CG(o,{recursive:!0,force:!0})}}function yr(t,e,n,r,s,i){return{path:t,sessionPath:e.sessionPath,ops:e.ops,sources:[...e.sources],aliases:[...e.aliases],action:n,reason:r,detail:i,sessionMtime:e.lastOp.toISOString(),diskMtime:s?.toISOString()??null}}function Hl(t,e){for(let n of e){let r=t[n];if(typeof r=="string")return r}}function eK(t){if(t!==void 0)try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}function Gl(t){return t instanceof Error?t.message:String(t)}var DG,fs,oN,Xl,aN,tN,jG,up,PG,yn,uN=E(()=>{"use strict";St();gt();Ul();VI();eN();Ie();vt();en();DG=2,fs=["usage: lmctl restore <teamfile> <alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore <teamfile>:<alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore --dir <path> [--recursive] [--target <dir>] [--force] [--dry-run] [--json]","","Replay the file writes/edits recorded in a member's provider session","transcript back onto disk (recover files after the working directory was","lost). Structured Write/Edit tools, shell commands that carry their file","content (heredocs, echo/printf/tee redirects), and codex apply_patch","payloads are all replayed; mutations whose content cannot be reconstructed","are reported as explicit gaps. A recovered file's mtime is set to the","session's write timestamp.","","A file missing on disk is always recovered. An existing file is only","overwritten when the session's write is newer than the disk file's mtime;","--force overwrites regardless. Files the session itself deleted are not","resurrected (and are never deleted on disk by this command).","","Replay is TEAM-AWARE by default: file operations from every seeded member","of the same teamfile are merged into one chronological stream, so a file","created by one alias and edited by another reconstructs correctly no","matter which alias you target. Files whose history needed more than one","member's session are marked as stitched.","","DIRECTORY mode (--dir) needs no teamfile at all: it discovers EVERY","provider session on this machine whose recorded working directory is","<path> (add --recursive to include subdirectories) \u2014 any provider, any","alias, current or superseded \u2014 and merges them all. Use it when a","teamfile's seeded sessions no longer cover the project's full history","(reseeded aliases, or work done before any teamfile existed).",""," --dir <path> target a directory instead of <teamfile> <alias>;"," mutually exclusive with the positional forms."," --recursive with --dir, also merge sessions recorded in"," subdirectories of <path>."," --target <dir> re-root recovered files under <dir> instead of the"," session's original working directory (session paths"," outside that directory are skipped)."," --dry-run report the per-file plan without touching disk."," --single-session replay ONLY the targeted alias's own session (audit"," what that one session alone would have produced)."].join(`
2591
- `),oN={claude:"full",kimi:"full",dsh:"partial",hermes:"partial",opencode:"full",lmplayer:"full",codex:"partial",agy:"partial",gemini:"none",copilot:"none",qwen:"none",ClaudeMock:"none"},Xl={codex:"apply_patch replays from the raw payload (Add/Delete/Move exact, Update context-based); calls without a preserved payload become unreplayed calls",agy:"write_to_file content replays; replace_file_content edit chunks are not replayed",dsh:"write replays exactly (file_path+content preserved in tool/call); no edit-type tool observed in real sessions",hermes:"write_file replays exactly; the patch tool replays as a single old/new edit (Hermes' multi-hunk patch form is not decomposed)",gemini:"this provider reader exposes no structured file tools",copilot:"this provider reader exposes no structured file tools",qwen:"this provider reader exposes no structured file tools",ClaudeMock:"this provider reader exposes no structured file tools"},aN="shell reconstruction is best-effort from command text; programmatic file writes (interpreters, unknown tools) are not detectable from transcripts",tN={write:{op:"write",pathKeys:["filePath","path","file"],contentKeys:["content"]},edit:{op:"edit",pathKeys:["filePath","path","file"],oldKeys:["oldString"],newKeys:["newString"],replaceAllKeys:["replaceAll"]}},jG={claude:{Write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["file_path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},dsh:{write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]}},kimi:{Write:{op:"write",pathKeys:["path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},opencode:tN,lmplayer:tN,agy:{write_to_file:{op:"write",pathKeys:["TargetFile"],contentKeys:["CodeContent"]}},hermes:{write_file:{op:"write",pathKeys:["path"],contentKeys:["content"]},patch:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}}},up={claude:{Bash:"command"},kimi:{Bash:"command"},dsh:{bash:"command"},opencode:{bash:"command"},lmplayer:{bash:"command"},codex:{exec_command:"cmd"},copilot:{bash:"command"},qwen:{run_shell_command:"command"},agy:{run_command:"CommandLine"},hermes:{terminal:"command"}},PG={loadSession:Ne,resolveTeamTarget:(t,e,n)=>$(n,r=>De(t,e,r)),resolveTeamRoster:(t,e)=>$(e,n=>{let r=be(t,n),s=st(r,n);if(s.parseErrors.length>0)return[];let i=[];for(let o of s.members)try{i.push(De(t,o.alias,n))}catch{}return i}),discoverSessions:()=>rr({})};yn=class extends Error{}});var Ci,Qae,fp=E(()=>{"use strict";Ci=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],Qae=Ci.length});import{spawn as tK}from"node:child_process";async function mN(t,e,n){let r=rK.get(t);if(r===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let i of r.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return sK(r.name,s)}function sK(t,e){return t==="lmctl_chat"?iK(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function iK(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 n=typeof t.team=="string"?t.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",n,r,e];return ue()&&Me(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),oK(s,process.cwd())}function oK(t,e){return new Promise(n=>{let r=!1,s,i=u=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(u))},o=tK("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=aK(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",u=>{l+=u.toString("utf8")}),o.stderr?.on("data",u=>{c+=u.toString("utf8")}),o.on("error",u=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),o.on("exit",u=>{if(u===0){ue()&&Me(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2590
+ `)}return p?1:0}function WG(t){let e=new Set,n=[];for(let r of t)e.has(r.sessionid)||(e.add(r.sessionid),n.push(r));return n}function wr(t,e,n){return{alias:t.alias,provider:t.provider,sessionId:t.sessionid,status:e,fileOps:n}}function qG(t){let e=[];for(let n=0;n<t.length;n+=1){let{member:r,detail:s}=t[n],i=cN(s);for(let o=0;o<i.length;o+=1)e.push({op:{...i[o],alias:r.alias,cwd:s.cwd},rosterIndex:n,seq:o})}return e.sort((n,r)=>n.op.timestamp.getTime()-r.op.timestamp.getTime()||n.rosterIndex-r.rosterIndex||n.seq-r.seq),e.map(n=>n.op)}function cN(t){let e=jG[t.provider]??{},n=up[t.provider]??{},r=[];for(let s of t.messages){if(s.role!=="tool_use"||s.toolName===void 0)continue;let i=s.toolInputData??eK(s.toolInput);if(i===void 0)continue;let o={timestamp:s.timestamp,callId:s.toolCallId??null,tool:s.toolName},a=e[s.toolName];if(a!==void 0){let c=HG(a,i);c!==null&&r.push({effect:c,source:"structured",...o});continue}if(t.provider==="codex"&&s.toolName==="apply_patch"){r.push(...BG(i,o));continue}let l=n[s.toolName];if(l!==void 0){let c=XG(i[l]);if(c===null)continue;for(let u of ap(c))r.push({effect:u,source:"shell",...o})}}return r}function HG(t,e){let n=Hl(e,t.pathKeys);if(n===void 0)return null;if(t.op==="write"){let o=Hl(e,t.contentKeys);return o===void 0?null:{kind:"write",path:n,content:o}}let r=Hl(e,t.oldKeys),s=Hl(e,t.newKeys);if(r===void 0||s===void 0)return null;let i=t.replaceAllKeys.some(o=>e[o]===!0);return{kind:"edit",path:n,oldString:r,newString:s,replaceAll:i}}function BG(t,e){let n=typeof t.input=="string"?t.input:void 0;if(n===void 0)return[];let r=ZI(n);return r===null?[]:r.map(s=>({effect:s.kind==="add"?{kind:"write",path:s.path,content:s.content}:s.kind==="delete"?{kind:"delete",path:s.path,recursive:!1}:{kind:"hunks",path:s.path,hunks:s.hunks,...s.moveTo!==void 0?{moveTo:s.moveTo}:{}},source:"patch",...e}))}function XG(t){if(typeof t=="string")return t;if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))return null;let e=t,n=e.findIndex(r=>/^-[a-z]*c[a-z]*$/.test(r));return n!==-1&&n+1<e.length?e[n+1]:e.some(r=>/[\s'"$`;|&<>()]/.test(r))?null:e.join(" ")}async function JG(t,e){let n=new Map,r=[],s=new Set,i=[],o=(d,f,m)=>{let p=n.get(d);return p===void 0&&(p={state:"unknown",content:null,lastOp:m.timestamp,ops:0,sessionPath:f,sources:new Set,aliases:[]},n.set(d,p)),p.lastOp=m.timestamp,p.ops+=1,p.sources.add(m.source),p.aliases.includes(m.alias)||p.aliases.push(m.alias),p},a=(d,f)=>{let m=ZG(d,f.cwd,e.targetDir);if(m.abs!==void 0)return m.abs;if(!s.has(d)){s.add(d);let p=m.reason==="symlink_path";r.push({path:d,sessionPath:d,ops:1,sources:[f.source],aliases:[f.alias],action:p?"unreplayable":"skipped",reason:m.reason,detail:null,sessionMtime:f.timestamp.toISOString(),diskMtime:null})}return null},l=async(d,f)=>{if(d.state==="known")return d.content;if(d.ops>1||!lp(f))return null;try{return await OG(f,"utf8")}catch{return null}},c=(d,f,m)=>{d.state="unknown",d.content=null,d.unknownReason=f,m!==void 0&&(d.unknownDetail=m)};for(let d of t){let f=d.effect;switch(f.kind){case"write":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);p.state="known",p.content=f.content,delete p.unknownReason,delete p.unknownDetail;break}case"append":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;let h=p.state==="deleted"?"":await l(p,m)??"";p.state="known",p.content=h+f.content,delete p.unknownReason,delete p.unknownDetail;break}case"edit":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"edit_mismatch","edit follows in-session delete");break}let h=await l(p,m);if(h===null){c(p,"edit_base_missing");break}let _=KG(h,f.oldString,f.newString,f.replaceAll);if(_===null){c(p,"edit_mismatch");break}p.state="known",p.content=_;break}case"hunks":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"patch_context_mismatch","update follows in-session delete");break}let h=await l(p,m);if(h===null){c(p,"edit_base_missing");break}let _=QI(h,f.hunks);if(_===null){c(p,"patch_context_mismatch");break}if(p.state="known",p.content=_,f.moveTo!==void 0){let y=a(f.moveTo,d);if(y!==null){let g=o(y,f.moveTo,d);g.state="known",g.content=_,p.state="deleted",p.content=null}}break}case"delete":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state="deleted",p.content=null,f.recursive){let h=m.endsWith("/")?m:`${m}/`;for(let[_,y]of n)_.startsWith(h)&&(y.state="deleted",y.content=null,y.lastOp=d.timestamp,y.ops+=1)}break}case"move":case"copy":{let m=a(f.from,d),p=a(f.to,d),h=m===null?void 0:n.get(m);if(p!==null){let _=o(p,f.to,d);h!==void 0&&h.state==="known"?(_.state="known",_.content=h.content,delete _.unknownReason,delete _.unknownDetail):c(_,"move_source_unknown",`${f.kind} source ${f.from} content not tracked in this session`)}if(f.kind==="move"&&m!==null){let _=o(m,f.from,d);_.state="deleted",_.content=null}break}case"touch":{let m=a(f.path,d);if(m===null)break;let p=n.get(m);if(p?.state==="deleted"){let h=o(m,f.path,d);h.state="known",h.content="",delete h.unknownReason,delete h.unknownDetail}else if(p!==void 0)o(m,f.path,d);else if(!lp(m)){let h=o(m,f.path,d);h.state="known",h.content=""}break}case"mutate":{if(f.path===void 0){i.push(`${d.tool} @ ${d.timestamp.toISOString()}: ${f.note}`);for(let h of n.values())h.state!=="unknown"&&(h.lastOp=d.timestamp,h.ops+=1,h.sources.add(d.source),h.aliases.includes(d.alias)||h.aliases.push(d.alias),c(h,"not_reconstructable",f.note));break}let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);c(p,"not_reconstructable",f.note);break}case"opaque":{let m=!1;for(let[p,h]of n)h.state!=="unknown"&&YG(f.tokens,p,h.sessionPath)&&(m=!0,h.lastOp=d.timestamp,h.ops+=1,h.sources.add(d.source),h.aliases.includes(d.alias)||h.aliases.push(d.alias),c(h,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`));for(let p of zG(f.tokens)){let h=a(p,d);if(h===null||n.has(h))continue;m=!0;let _=o(h,p,d);c(_,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`)}m||i.push(`${d.tool} @ ${d.timestamp.toISOString()}: unrecognized command may mutate files: ${f.command}`);break}}}let u=[...r];for(let[d,f]of n)u.push(await GG(d,f,e));return{files:u,warnings:i}}async function GG(t,e,n){if(n.targetDir!==void 0&&Jl(n.targetDir,t))return yr(t,e,"unreplayable","symlink_path",null,"restore target contains a symbolic link");let r=lp(t)?await $G(t):null,s=r?.mtime??null;if(e.state==="deleted")return yr(t,e,"skipped","deleted_in_session",s,null);if(e.state==="unknown"||e.content===null)return yr(t,e,"unreplayable",e.unknownReason??"not_reconstructable",s,e.unknownDetail??null);let i;if(r===null)i="missing_on_disk";else if(e.lastOp.getTime()>r.mtimeMs)i="session_newer";else if(n.force)i="forced";else return yr(t,e,"skipped","disk_newer_or_equal",s,null);if(n.dryRun)return yr(t,e,"would_write",i,s,null);if(n.targetDir===void 0)await cp(Kl(t),{recursive:!0}),await sN(t,e.content,"utf8"),await rN(t,e.lastOp,e.lastOp);else try{await QG(n.targetDir,t,e.content,e.lastOp)}catch(o){if(o instanceof yn)return yr(t,e,"unreplayable","symlink_path",s,o.message);throw o}return yr(t,e,"written",i,s,null)}function KG(t,e,n,r){return e===""?t===""?n:null:t.includes(e)?r?t.split(e).join(n):t.replace(e,n):null}function VG(t,e,n){let r=new Set(e.map(o=>o.callId).filter(o=>o!==null)),s=Oi(t),i=[];for(let o of s.toolCalls)o.kind!=="file_write"&&o.kind!=="file_edit"||o.callId!==null&&r.has(o.callId)||i.push({tool:o.name,alias:n,kind:o.kind,path:o.path??null,callId:o.callId,startedAt:o.startedAt,reason:"content extraction is not supported for this tool call"});return i}function YG(t,e,n){let r=iN(e);for(let s of t)if(s===e||s===n||s.includes(e)||n.length>=3&&s.includes(n)||r.length>=3&&(s===r||s.endsWith(`/${r}`))||r.length>=5&&s.includes(r))return!0;return!1}function zG(t){return[...new Set(t.filter(e=>e===""||e.startsWith("-")||/[$`*?{}();]/.test(e)||/\s/.test(e)?!1:Bl(e)||e.includes("/")||/(?:^|\.)[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{1,16}$/.test(e)))]}function ZG(t,e,n){if(n===void 0)return Bl(t)?{abs:t}:e===""?{reason:"unresolvable_path"}:{abs:wn(e,t)};let r=Bl(t)?e===""?void 0:dp(e,t):t;if(r===void 0)return{reason:"unresolvable_path"};let s=wn(n,r),i=dp(n,s);return i===""||i.startsWith("..")||Bl(i)?{reason:"outside_target"}:Jl(n,s)?{reason:"symlink_path"}:{abs:s}}function Jl(t,e){let n=e;for(;;){try{if(AG(n).isSymbolicLink())return!0}catch(s){if(s.code!=="ENOENT")throw s}if(n===t)return!1;let r=Kl(n);if(r===n)return!0;n=r}}async function QG(t,e,n,r){try{let l=await ql(t);if(l.isSymbolicLink()||!l.isDirectory())throw new yn(`unsafe restore root: ${t}`)}catch(l){if(l.code!=="ENOENT")throw l;await cp(t,{recursive:!0});let c=await ql(t);if(c.isSymbolicLink()||!c.isDirectory())throw new yn(`unsafe restore root: ${t}`)}let s=dp(t,Kl(e)),i=t;for(let l of s===""?[]:s.split(/[\\/]/)){i=wn(i,l);try{let c=await ql(i);if(c.isSymbolicLink()||!c.isDirectory())throw new yn(`unsafe restore parent: ${i}`)}catch(c){if(c.code!=="ENOENT")throw c;await cp(i);let u=await ql(i);if(u.isSymbolicLink()||!u.isDirectory())throw new yn(`unsafe restore parent: ${i}`)}}if(Jl(t,e))throw new yn(`restore target contains a symbolic link: ${e}`);let o=await RG(wn(i,".lmctl-restore-")),a=wn(o,"content.tmp");try{if(await sN(a,n,{encoding:"utf8",flag:"wx"}),await rN(a,r,r),Jl(t,e))throw new yn(`restore target contains a symbolic link: ${e}`);await LG(a,e)}finally{await CG(o,{recursive:!0,force:!0})}}function yr(t,e,n,r,s,i){return{path:t,sessionPath:e.sessionPath,ops:e.ops,sources:[...e.sources],aliases:[...e.aliases],action:n,reason:r,detail:i,sessionMtime:e.lastOp.toISOString(),diskMtime:s?.toISOString()??null}}function Hl(t,e){for(let n of e){let r=t[n];if(typeof r=="string")return r}}function eK(t){if(t!==void 0)try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}function Gl(t){return t instanceof Error?t.message:String(t)}var DG,fs,oN,Xl,aN,tN,jG,up,PG,yn,uN=E(()=>{"use strict";vt();ht();Ul();VI();eN();Ie();Tt();en();DG=2,fs=["usage: lmctl restore <teamfile> <alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore <teamfile>:<alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore --dir <path> [--recursive] [--target <dir>] [--force] [--dry-run] [--json]","","Replay the file writes/edits recorded in a member's provider session","transcript back onto disk (recover files after the working directory was","lost). Structured Write/Edit tools, shell commands that carry their file","content (heredocs, echo/printf/tee redirects), and codex apply_patch","payloads are all replayed; mutations whose content cannot be reconstructed","are reported as explicit gaps. A recovered file's mtime is set to the","session's write timestamp.","","A file missing on disk is always recovered. An existing file is only","overwritten when the session's write is newer than the disk file's mtime;","--force overwrites regardless. Files the session itself deleted are not","resurrected (and are never deleted on disk by this command).","","Replay is TEAM-AWARE by default: file operations from every seeded member","of the same teamfile are merged into one chronological stream, so a file","created by one alias and edited by another reconstructs correctly no","matter which alias you target. Files whose history needed more than one","member's session are marked as stitched.","","DIRECTORY mode (--dir) needs no teamfile at all: it discovers EVERY","provider session on this machine whose recorded working directory is","<path> (add --recursive to include subdirectories) \u2014 any provider, any","alias, current or superseded \u2014 and merges them all. Use it when a","teamfile's seeded sessions no longer cover the project's full history","(reseeded aliases, or work done before any teamfile existed).",""," --dir <path> target a directory instead of <teamfile> <alias>;"," mutually exclusive with the positional forms."," --recursive with --dir, also merge sessions recorded in"," subdirectories of <path>."," --target <dir> re-root recovered files under <dir> instead of the"," session's original working directory (session paths"," outside that directory are skipped)."," --dry-run report the per-file plan without touching disk."," --single-session replay ONLY the targeted alias's own session (audit"," what that one session alone would have produced)."].join(`
2591
+ `),oN={claude:"full",kimi:"full",dsh:"partial",hermes:"partial",opencode:"full",lmplayer:"full",codex:"partial",agy:"partial",gemini:"none",copilot:"none",qwen:"none",ClaudeMock:"none"},Xl={codex:"apply_patch replays from the raw payload (Add/Delete/Move exact, Update context-based); calls without a preserved payload become unreplayed calls",agy:"write_to_file content replays; replace_file_content edit chunks are not replayed",dsh:"write replays exactly (file_path+content preserved in tool/call); no edit-type tool observed in real sessions",hermes:"write_file replays exactly; the patch tool replays as a single old/new edit (Hermes' multi-hunk patch form is not decomposed)",gemini:"this provider reader exposes no structured file tools",copilot:"this provider reader exposes no structured file tools",qwen:"this provider reader exposes no structured file tools",ClaudeMock:"this provider reader exposes no structured file tools"},aN="shell reconstruction is best-effort from command text; programmatic file writes (interpreters, unknown tools) are not detectable from transcripts",tN={write:{op:"write",pathKeys:["filePath","path","file"],contentKeys:["content"]},edit:{op:"edit",pathKeys:["filePath","path","file"],oldKeys:["oldString"],newKeys:["newString"],replaceAllKeys:["replaceAll"]}},jG={claude:{Write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["file_path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},dsh:{write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]}},kimi:{Write:{op:"write",pathKeys:["path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},opencode:tN,lmplayer:tN,agy:{write_to_file:{op:"write",pathKeys:["TargetFile"],contentKeys:["CodeContent"]}},hermes:{write_file:{op:"write",pathKeys:["path"],contentKeys:["content"]},patch:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}}},up={claude:{Bash:"command"},kimi:{Bash:"command"},dsh:{bash:"command"},opencode:{bash:"command"},lmplayer:{bash:"command"},codex:{exec_command:"cmd"},copilot:{bash:"command"},qwen:{run_shell_command:"command"},agy:{run_command:"CommandLine"},hermes:{terminal:"command"}},PG={loadSession:Ne,resolveTeamTarget:(t,e,n)=>$(n,r=>je(t,e,r)),resolveTeamRoster:(t,e)=>$(e,n=>{let r=be(t,n),s=rt(r,n);if(s.parseErrors.length>0)return[];let i=[];for(let o of s.members)try{i.push(je(t,o.alias,n))}catch{}return i}),discoverSessions:()=>rr({})};yn=class extends Error{}});var Ci,Qae,fp=E(()=>{"use strict";Ci=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],Qae=Ci.length});import{spawn as tK}from"node:child_process";async function mN(t,e,n){let r=rK.get(t);if(r===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let i of r.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return sK(r.name,s)}function sK(t,e){return t==="lmctl_chat"?iK(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function iK(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 n=typeof t.team=="string"?t.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",n,r,e];return ue()&&Me(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),oK(s,process.cwd())}function oK(t,e){return new Promise(n=>{let r=!1,s,i=u=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(u))},o=tK("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=aK(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",u=>{l+=u.toString("utf8")}),o.stderr?.on("data",u=>{c+=u.toString("utf8")}),o.on("error",u=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),o.on("exit",u=>{if(u===0){ue()&&Me(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2592
2592
  `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function aK(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return fN;let n=Number(e);return!Number.isFinite(n)||n<=0?fN:n}function mp(t,e=process.env){let r=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:nK),s=t.getConfig("api.token"),i=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:r,token:i}}var nK,fN,rK,pp=E(()=>{"use strict";fp();ae();nK="http://127.0.0.1:8787",fN=30*60*1e3,rK=new Map(Ci.map(t=>[t.name,t]))});async function uK(t,e){let n=t.id===void 0,r=t.id??null;if(t.method==="exit")return n||e.io.write(_p({jsonrpc:"2.0",id:r,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{protocolVersion:lK,capabilities:{tools:{listChanged:!1}},serverInfo:{name:cK,version:dK}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{tools:Ci.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:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await mN(i,o,e.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return n?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:r,error:{code:-32601,message:`method not found: ${t.method}`}}}}function _p(t){return`${JSON.stringify(t)}
2593
2593
  `}async function pN(t,e){let n=!1,r="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(_p({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await uK(l,t);c.kind==="response"?t.io.write(_p(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,o(d))},u=()=>{let d=r.indexOf(`
2594
2594
  `);for(;d!==-1;){let f=r.slice(0,d);r=r.slice(d+1),a=a.then(()=>i(f)).then(()=>{s&&c(0)}),d=r.indexOf(`
2595
2595
  `)}};e.setEncoding("utf8"),e.on("data",d=>{r+=d,u()}),e.on("end",()=>{r.trim().length>0&&(a=a.then(()=>i(r))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
2596
2596
  `),a.finally(()=>c(1))})})}var lK,cK,dK,_N=E(()=>{"use strict";fp();pp();lK="2025-06-18",cK="lmctl",dK="0.0.1"});var gN={};oe(gN,{runMcp:()=>mK});async function mK(t,e={stdout:process.stdout,stderr:process.stderr},n=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(fK),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
2597
- `),2;C({event:"mcp_bridge_start",pid:process.pid});let r=e.dal===void 0,s=e.dal??pK(),i=1;try{let o=s===void 0?mp({getConfig:()=>null},process.env):mp(s,process.env);return i=await pN({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},n),i}finally{C({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),r&&s!==void 0&&s.close()}}function pK(){let t=Q(),e=3;for(let n=1;n<=e;n+=1)try{return Be({path:t})}catch(r){let s=r instanceof Error?r.message:String(r);if(C({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:n,db_path:t,error_message:s}),n<e&&hN(s))_K(50*n);else if(!hN(s))break}}function hN(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function _K(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var fK,yN=E(()=>{"use strict";mt();pp();_N();ae();qe();fK=`usage: lmctl mcp
2597
+ `),2;C({event:"mcp_bridge_start",pid:process.pid});let r=e.dal===void 0,s=e.dal??pK(),i=1;try{let o=s===void 0?mp({getConfig:()=>null},process.env):mp(s,process.env);return i=await pN({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},n),i}finally{C({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),r&&s!==void 0&&s.close()}}function pK(){let t=Q(),e=3;for(let n=1;n<=e;n+=1)try{return Xe({path:t})}catch(r){let s=r instanceof Error?r.message:String(r);if(C({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:n,db_path:t,error_message:s}),n<e&&hN(s))_K(50*n);else if(!hN(s))break}}function hN(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function _K(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var fK,yN=E(()=>{"use strict";ft();pp();_N();ae();He();fK=`usage: lmctl mcp
2598
2598
 
2599
2599
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2600
2600
  local config, then uses stdin/stdout for JSON-RPC frames.
@@ -2628,26 +2628,26 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2628
2628
  WHERE event_type IN ('CREATE', 'RESPONSE_CREATE')
2629
2629
  AND ts >= ?
2630
2630
  ORDER BY seq ASC
2631
- `).all(e.since).map(CK),s=new Map;for(let l of r){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new qn(`${l.stream_id} ${l.event_type} is missing receiver identity`);let c=l.sender_teamfile===null||l.sender_alias===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias},u=$K(l);s.set(l.stream_id,{seq:l.seq,message_id:l.stream_id,from:c,to:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},message_type:l.event_type==="RESPONSE_CREATE"?"response":"request",at:l.ts,parent_message_id:u.message_id,parent_link:u.link,orphaned_to_root:u.message_id===null,children:[]})}for(let l of s.values()){if(l.parent_message_id===null)continue;let c=s.get(l.parent_message_id);if(c===void 0){l.orphaned_to_root=!0;continue}c.children.push(l)}let i=e.cursorSeq??null,o=[...s.values()].filter(l=>SN(l,e.root)&&!MK(l,s,e.root)&&(i===null||l.seq>i)),a=o.slice(0,e.limit);return{sent:a.map(l=>bN(l,new Set)),next_seq:o.length>e.limit?a.at(-1).seq:null}}function CK(t){try{let e=JSON.parse(t.payload);if(!kN(e))throw new qn(`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof qn?e:new qn(`message_event seq ${t.seq} payload is invalid JSON`)}}function $K(t){if(t.event_type==="RESPONSE_CREATE"){let r=TN(t.payload.in_reply_to_message_id);return{message_id:r,link:r===null?null:"in_reply_to_message_id"}}let e=kN(t.payload.causation)?t.payload.causation:null,n=TN(e?.request_message_id);return{message_id:n,link:n===null?null:"invocation_state.request_message_id"}}function SN(t,e){return e===null?t.from===null:t.from?.teamfile===e.teamfile&&t.from.alias===e.alias}function MK(t,e,n){let r=new Set([t.message_id]),s=t.parent_message_id;for(;s!==null;){if(r.has(s))return!1;r.add(s);let i=e.get(s);if(i===void 0)return!1;if(SN(i,n))return!0;s=i.parent_message_id}return!1}function bN(t,e){let{seq:n,children:r,...s}=t;if(e.has(t.message_id))return{...s,children:[]};let i=new Set(e).add(t.message_id);return{...s,children:r.map(o=>bN(o,i))}}function kN(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function TN(t){return typeof t=="string"&&t.length>0?t:null}var qn,IN=E(()=>{"use strict";qn=class extends Error{errorKind="data_error"}});var MN={};oe(MN,{runMail:()=>zK});import{hostname as DK}from"node:os";async function zK(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(qK),0;let[n,...r]=t,s=En(r);try{switch(n){case"sent":return await ZK(r,e);case"history":return await QK(r,e);case"seen":return await e4(r,e);case"pending":return await t4(r,e);case"read":return await r4(r,e);case"handle":return await i4(r,e);case"ack":return await s4(r,e);case"tree":return await o4(r,e);default:return re(e,s,"invalid_command",`unknown mail command: ${n}`)}}catch(i){return i instanceof Ze||i instanceof qn?re(e,s,i.errorKind,i.message):re(e,s,"internal",i instanceof Error?i.message:String(i))}}async function ZK(t,e){if(Xn(t))return e.stdout.write(HK),0;let n=En(t),r=Y(Vl(t,["--to","--since","--status","--limit","--cursor"]),["--to","--since","--status","--limit","--cursor"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=wp(M(r,"--to"));if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=g4(M(r,"--since"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=M(r,"--status");if(o!==void 0&&o!=="queued"&&o!=="delivered")return re(e,n,"invalid_arguments","--status must be queued or delivered");let a=Tp(M(r,"--limit"));if("error"in a)return re(e,n,"invalid_arguments",a.error);let l=$N(M(r,"--cursor"),"sent");if("error"in l)return re(e,n,"invalid_arguments",l.error);if(l.value!==null&&(M(r,"--to")!==void 0||M(r,"--since")!==void 0||o!==void 0))return re(e,n,"invalid_arguments","--cursor cannot be combined with --to, --since, or --status; the cursor retains the original filters");let c=await $(e,u=>{let d=l.value===null?Je(Ep(u,e,"mail sent")):Je(l.value.self),f=l.value===null?s.value:l.value.to===null?null:Je(l.value.to),m=l.value?.since??i.iso,p=l.value?.status??o??null,h=a4(u,d,f,m,p??void 0,a.value,l.value?.seq??null),_=h.next_seq===null?null:CN({v:1,kind:"sent",seq:h.next_seq,self:d.value,to:f?.value??null,since:m,status:p});return{schema_version:Hn,schema:"event-log-v1",identity:d.value,filters:{to:f?.value??null,since:m,status:p},messages:h.messages,next_cursor:_}});if(B(r,"--json"))X(e,c);else{e.stdout.write(`Messages sent from ${c.identity}
2631
+ `).all(e.since).map(CK),s=new Map;for(let l of r){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new qn(`${l.stream_id} ${l.event_type} is missing receiver identity`);let c=l.sender_teamfile===null||l.sender_alias===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias},u=$K(l);s.set(l.stream_id,{seq:l.seq,message_id:l.stream_id,from:c,to:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},message_type:l.event_type==="RESPONSE_CREATE"?"response":"request",at:l.ts,parent_message_id:u.message_id,parent_link:u.link,orphaned_to_root:u.message_id===null,children:[]})}for(let l of s.values()){if(l.parent_message_id===null)continue;let c=s.get(l.parent_message_id);if(c===void 0){l.orphaned_to_root=!0;continue}c.children.push(l)}let i=e.cursorSeq??null,o=[...s.values()].filter(l=>SN(l,e.root)&&!MK(l,s,e.root)&&(i===null||l.seq>i)),a=o.slice(0,e.limit);return{sent:a.map(l=>bN(l,new Set)),next_seq:o.length>e.limit?a.at(-1).seq:null}}function CK(t){try{let e=JSON.parse(t.payload);if(!kN(e))throw new qn(`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof qn?e:new qn(`message_event seq ${t.seq} payload is invalid JSON`)}}function $K(t){if(t.event_type==="RESPONSE_CREATE"){let r=TN(t.payload.in_reply_to_message_id);return{message_id:r,link:r===null?null:"in_reply_to_message_id"}}let e=kN(t.payload.causation)?t.payload.causation:null,n=TN(e?.request_message_id);return{message_id:n,link:n===null?null:"invocation_state.request_message_id"}}function SN(t,e){return e===null?t.from===null:t.from?.teamfile===e.teamfile&&t.from.alias===e.alias}function MK(t,e,n){let r=new Set([t.message_id]),s=t.parent_message_id;for(;s!==null;){if(r.has(s))return!1;r.add(s);let i=e.get(s);if(i===void 0)return!1;if(SN(i,n))return!0;s=i.parent_message_id}return!1}function bN(t,e){let{seq:n,children:r,...s}=t;if(e.has(t.message_id))return{...s,children:[]};let i=new Set(e).add(t.message_id);return{...s,children:r.map(o=>bN(o,i))}}function kN(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function TN(t){return typeof t=="string"&&t.length>0?t:null}var qn,IN=E(()=>{"use strict";qn=class extends Error{errorKind="data_error"}});var MN={};oe(MN,{runMail:()=>zK});import{hostname as DK}from"node:os";async function zK(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(qK),0;let[n,...r]=t,s=En(r);try{switch(n){case"sent":return await ZK(r,e);case"history":return await QK(r,e);case"seen":return await e4(r,e);case"pending":return await t4(r,e);case"read":return await r4(r,e);case"handle":return await i4(r,e);case"ack":return await s4(r,e);case"tree":return await o4(r,e);default:return re(e,s,"invalid_command",`unknown mail command: ${n}`)}}catch(i){return i instanceof ze||i instanceof qn?re(e,s,i.errorKind,i.message):re(e,s,"internal",i instanceof Error?i.message:String(i))}}async function ZK(t,e){if(Xn(t))return e.stdout.write(HK),0;let n=En(t),r=Y(Vl(t,["--to","--since","--status","--limit","--cursor"]),["--to","--since","--status","--limit","--cursor"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=wp(M(r,"--to"));if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=g4(M(r,"--since"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=M(r,"--status");if(o!==void 0&&o!=="queued"&&o!=="delivered")return re(e,n,"invalid_arguments","--status must be queued or delivered");let a=Tp(M(r,"--limit"));if("error"in a)return re(e,n,"invalid_arguments",a.error);let l=$N(M(r,"--cursor"),"sent");if("error"in l)return re(e,n,"invalid_arguments",l.error);if(l.value!==null&&(M(r,"--to")!==void 0||M(r,"--since")!==void 0||o!==void 0))return re(e,n,"invalid_arguments","--cursor cannot be combined with --to, --since, or --status; the cursor retains the original filters");let c=await $(e,u=>{let d=l.value===null?Je(Ep(u,e,"mail sent")):Je(l.value.self),f=l.value===null?s.value:l.value.to===null?null:Je(l.value.to),m=l.value?.since??i.iso,p=l.value?.status??o??null,h=a4(u,d,f,m,p??void 0,a.value,l.value?.seq??null),_=h.next_seq===null?null:CN({v:1,kind:"sent",seq:h.next_seq,self:d.value,to:f?.value??null,since:m,status:p});return{schema_version:Hn,schema:"event-log-v1",identity:d.value,filters:{to:f?.value??null,since:m,status:p},messages:h.messages,next_cursor:_}});if(X(r,"--json"))J(e,c);else{e.stdout.write(`Messages sent from ${c.identity}
2632
2632
  `);for(let u of c.messages)e.stdout.write(`${u.created_at} ${u.message_id} ${u.message_type} ${u.lifecycle_state} -> ${u.receiver.teamfile}:${u.receiver.alias}
2633
2633
  `);c.messages.length===0&&e.stdout.write(`(none)
2634
- `)}return 0}async function QK(t,e){if(Xn(t))return e.stdout.write(KK),0;let n=En(t),r=Y(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=Mi(r.positionals,"history");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await $(e,a=>{let l=xN(a,s.value);return l!==null&&rs(a,l),RN(a,s.value)}),o={schema_version:Hn,schema:"event-log-v1",message_id:s.value,events:i};if(B(r,"--json"))X(e,o);else{e.stdout.write(`History for ${s.value}
2634
+ `)}return 0}async function QK(t,e){if(Xn(t))return e.stdout.write(KK),0;let n=En(t),r=Y(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=Mi(r.positionals,"history");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await $(e,a=>{let l=xN(a,s.value);return l!==null&&rs(a,l),RN(a,s.value)}),o={schema_version:Hn,schema:"event-log-v1",message_id:s.value,events:i};if(X(r,"--json"))J(e,o);else{e.stdout.write(`History for ${s.value}
2635
2635
  `);for(let a of i)e.stdout.write(`${a.seq} ${a.ts} ${a.event_type} ${JSON.stringify(a.payload)}
2636
- `)}return 0}async function e4(t,e){if(Xn(t))return e.stdout.write(VK),0;let n=En(t),r=Y(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=Mi(r.positionals,"seen");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await $(e,o=>c4(o,s.value));return B(r,"--json")?X(e,i):(e.stdout.write(`${s.value}
2636
+ `)}return 0}async function e4(t,e){if(Xn(t))return e.stdout.write(VK),0;let n=En(t),r=Y(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=Mi(r.positionals,"seen");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await $(e,o=>c4(o,s.value));return X(r,"--json")?J(e,i):(e.stdout.write(`${s.value}
2637
2637
  `),e.stdout.write(` db: ${i.db.delivered?"delivered":i.db.handled?"handled":"not delivered"}
2638
2638
  `),e.stdout.write(` transcript: ${i.transcript.checked?i.transcript.found?`seen at ${i.transcript.seen_at}`:"not found":`not checked (${i.transcript.reason})`}
2639
2639
  `),e.stdout.write(` answered: ${i.answered?.via??"no evidence"}
2640
- `)),0}async function t4(t,e){if(Xn(t))return e.stdout.write(BK),0;let n=En(t),r=Y(Vl(t,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=wp(M(r,"--receiver"));if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=Tp(M(r,"--limit"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=await $(e,l=>{let c=s.value;if(c===null){let m=_r(e.env??process.env,l);if(m.ok)c=Je(m.identity);else if(m.reason==="not-found")throw new Ze("self_identity",gn("mail pending"))}let u=c===null?"":"WHERE receiver_teamfile = ? AND receiver_alias = ?",d=c===null?[]:[c.teamfile,c.alias],f=l.db.prepare(`SELECT message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
2640
+ `)),0}async function t4(t,e){if(Xn(t))return e.stdout.write(BK),0;let n=En(t),r=Y(Vl(t,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=wp(M(r,"--receiver"));if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=Tp(M(r,"--limit"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=await $(e,l=>{let c=s.value;if(c===null){let m=_r(e.env??process.env,l);if(m.ok)c=Je(m.identity);else if(m.reason==="not-found")throw new ze("self_identity",gn("mail pending"))}let u=c===null?"":"WHERE receiver_teamfile = ? AND receiver_alias = ?",d=c===null?[]:[c.teamfile,c.alias],f=l.db.prepare(`SELECT message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
2641
2641
  receiver_teamfile, receiver_alias, lifecycle_state, created_seq
2642
2642
  FROM message_pending ${u}
2643
- ORDER BY created_seq ASC LIMIT ?`).all(...d,i.value);return{receiver:c,messages:f}}),a={schema_version:Hn,schema:"event-log-v1",filters:{receiver:o.receiver===null?null:`${o.receiver.teamfile}:${o.receiver.alias}`,limit:i.value},messages:o.messages.map(l=>({message_id:l.message_id,message_type:l.message_type,in_reply_to:l.in_reply_to,sender:l.sender_teamfile===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias??""},receiver:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},lifecycle_state:l.lifecycle_state,created_seq:l.created_seq}))};if(B(r,"--json"))X(e,a);else if(a.messages.length===0)e.stdout.write(`no pending messages
2643
+ ORDER BY created_seq ASC LIMIT ?`).all(...d,i.value);return{receiver:c,messages:f}}),a={schema_version:Hn,schema:"event-log-v1",filters:{receiver:o.receiver===null?null:`${o.receiver.teamfile}:${o.receiver.alias}`,limit:i.value},messages:o.messages.map(l=>({message_id:l.message_id,message_type:l.message_type,in_reply_to:l.in_reply_to,sender:l.sender_teamfile===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias??""},receiver:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},lifecycle_state:l.lifecycle_state,created_seq:l.created_seq}))};if(X(r,"--json"))J(e,a);else if(a.messages.length===0)e.stdout.write(`no pending messages
2644
2644
  `);else for(let l of a.messages){let c=l.sender===null?"operator":`${l.sender.teamfile}:${l.sender.alias}`;e.stdout.write(`${l.message_id} ${l.lifecycle_state} ${c} -> ${l.receiver.teamfile}:${l.receiver.alias}
2645
2645
  `)}return 0}function xN(t,e){let n=/^msg_tcl_(\d+)$/.exec(e);if(n===null)return null;let r=Number(n[1]);return t.db.prepare(`SELECT id, status, holder_pid, holder_host, started_at, last_heartbeat_at
2646
2646
  FROM tracked_invocation
2647
2647
  WHERE team_chat_log_id = ? AND status = 'running'
2648
2648
  ORDER BY id DESC LIMIT 1`).get(r)??null}function n4(t,e){let n=t.db.prepare(`SELECT event_type, payload FROM message_event
2649
2649
  WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE')
2650
- ORDER BY seq ASC LIMIT 1`).get(e);if(n===void 0)throw new Ze("not_found",`no such message: ${e}`);let r=JSON.parse(n.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e),i=xN(t,e),o=i===null?null:Xt(i);return{schema_version:Hn,schema:"event-log-v1",message_id:e,message_type:n.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:r.in_reply_to_message_id??null,sender:r.sender,receiver:r.receiver,content:r.content??"",pending_state:s?.lifecycle_state??null,holder_liveness:o,effective_status:o==="dead"?"aborted":null}}async function r4(t,e){if(Xn(t))return e.stdout.write(XK),0;let n=En(t),r=Y(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=Mi(r.positionals,"read");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await $(e,o=>n4(o,s.value));if(B(r,"--json"))X(e,i);else{let o=i.sender===null?"operator":`${i.sender.teamfile}:${i.sender.alias}`;e.stdout.write(`${i.message_id} (${i.message_type}${i.in_reply_to===null?"":`, replies to ${i.in_reply_to}`})
2650
+ ORDER BY seq ASC LIMIT 1`).get(e);if(n===void 0)throw new ze("not_found",`no such message: ${e}`);let r=JSON.parse(n.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e),i=xN(t,e),o=i===null?null:Xt(i);return{schema_version:Hn,schema:"event-log-v1",message_id:e,message_type:n.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:r.in_reply_to_message_id??null,sender:r.sender,receiver:r.receiver,content:r.content??"",pending_state:s?.lifecycle_state??null,holder_liveness:o,effective_status:o==="dead"?"aborted":null}}async function r4(t,e){if(Xn(t))return e.stdout.write(XK),0;let n=En(t),r=Y(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=Mi(r.positionals,"read");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await $(e,o=>n4(o,s.value));if(X(r,"--json"))J(e,i);else{let o=i.sender===null?"operator":`${i.sender.teamfile}:${i.sender.alias}`;e.stdout.write(`${i.message_id} (${i.message_type}${i.in_reply_to===null?"":`, replies to ${i.in_reply_to}`})
2651
2651
  `),e.stdout.write(`from: ${o}
2652
2652
  `),e.stdout.write(`to: ${i.receiver.teamfile}:${i.receiver.alias}
2653
2653
  `),e.stdout.write(`state: ${i.pending_state??"terminal"}
@@ -2655,10 +2655,10 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2655
2655
  `),e.stdout.write(`---
2656
2656
  ${i.content}
2657
2657
  `)}return 0}async function s4(t,e){if(Xn(t))return e.stdout.write(JK),0;let n=En(t),r=Y(Vl(t,["--note"]),["--note"],["--terminalize-pending","--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=Mi(r.positionals,"ack");if("error"in s)return re(e,n,"invalid_id",s.error);let i=M(r,"--note"),o=await $(e,l=>{if(l.db.prepare(`SELECT 1 FROM message_event
2658
- WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ze("not_found",`no such message: ${s.value}`);let u=_r(e.env??process.env,l);if(!u.ok&&u.reason==="not-found")throw new Ze("self_identity",gn("mail ack"));let d=u.ok?u.identity:"operator",f=l.db.transaction(()=>{let m=fh(l.db,{messageId:s.value,ackedBy:d,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:DK(),terminalizePending:B(r,"--terminalize-pending")});if(u.ok){let p=Je(u.identity);l.clearCurrentlyHandlingMessage(p.teamfile,p.alias,s.value)}return m})();return{ackedBy:d,ack:f}}),a={schema_version:Hn,schema:"event-log-v1",message_id:s.value,acked_by:o.ackedBy,appended:o.ack.appended,pending_outcome:o.ack.pending_outcome};return B(r,"--json")?X(e,a):e.stdout.write(`${a.appended?"acknowledged":"already acknowledged"} ${a.message_id} as ${a.acked_by} (${a.pending_outcome})
2658
+ WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new ze("not_found",`no such message: ${s.value}`);let u=_r(e.env??process.env,l);if(!u.ok&&u.reason==="not-found")throw new ze("self_identity",gn("mail ack"));let d=u.ok?u.identity:"operator",f=l.db.transaction(()=>{let m=fh(l.db,{messageId:s.value,ackedBy:d,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:DK(),terminalizePending:X(r,"--terminalize-pending")});if(u.ok){let p=Je(u.identity);l.clearCurrentlyHandlingMessage(p.teamfile,p.alias,s.value)}return m})();return{ackedBy:d,ack:f}}),a={schema_version:Hn,schema:"event-log-v1",message_id:s.value,acked_by:o.ackedBy,appended:o.ack.appended,pending_outcome:o.ack.pending_outcome};return X(r,"--json")?J(e,a):e.stdout.write(`${a.appended?"acknowledged":"already acknowledged"} ${a.message_id} as ${a.acked_by} (${a.pending_outcome})
2659
2659
  `),0}async function i4(t,e){if(Xn(t))return e.stdout.write(GK),0;let n=En(t),r=Y(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=Mi(r.positionals,"handle");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await $(e,a=>{if(a.db.prepare(`SELECT 1 FROM message_event
2660
- WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ze("not_found",`no such message: ${s.value}`);let c=Je(Ep(a,e,"mail handle"));return{identity:c,handling:uh(a.db,{messageId:s.value,handlingBy:c.value,handlingTeamfile:c.teamfile,handlingAlias:c.alias})}}),o={schema_version:Hn,schema:"event-log-v1",message_id:s.value,handling_by:i.identity.value,handling_at:i.handling.handling_at,appended:i.handling.appended};return B(r,"--json")?X(e,o):e.stdout.write(`${o.appended?"handling":"handling refreshed"} ${o.message_id} as ${o.handling_by} since ${o.handling_at}
2661
- `),0}async function o4(t,e){if(Xn(t))return e.stdout.write(YK),0;let n=En(t),r=Y(Vl(t,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=LN(M(r,"--since"),jK);if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=wp(M(r,"--root"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=Tp(M(r,"--limit"));if("error"in o)return re(e,n,"invalid_arguments",o.error);let a=$N(M(r,"--cursor"),"tree");if("error"in a)return re(e,n,"invalid_arguments",a.error);if(a.value!==null&&(M(r,"--root")!==void 0||M(r,"--since")!==void 0))return re(e,n,"invalid_arguments","--cursor cannot be combined with --root or --since; the cursor retains the original filters");let l=await $(e,c=>{let u=a.value===null?i.value??Je(Ep(c,e,"mail tree")):Je(a.value.root),d=a.value?.since??s.iso,f=a.value?.since_label??M(r,"--since")??"24h",m=vN(c,{root:{teamfile:u.teamfile,alias:u.alias},since:d,limit:o.value,cursorSeq:a.value?.seq??null}),p=m.next_seq===null?null:CN({v:1,kind:"tree",seq:m.next_seq,root:u.value,since:d,since_label:f});return{schema_version:Hn,schema:"event-log-v1",root:{teamfile:u.teamfile,alias:u.alias},since:f,since_timestamp:d,sent:m.sent,next_cursor:p,orphan_policy:"Missing causal linkage, including a genuinely fresh or unprompted send before any inbound delivery, is surfaced as a root; no temporal fallback is used.",incomplete_capture_note:"External composition is causally linked by calling mail handle before a reactive send. A send remains an orphan root when no handle was declared or the handling pointer exceeded its one-hour TTL."}});if(B(r,"--json"))X(e,l);else{e.stdout.write(`Causal mail tree for ${l.root.teamfile}:${l.root.alias} since ${l.since_timestamp}
2660
+ WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new ze("not_found",`no such message: ${s.value}`);let c=Je(Ep(a,e,"mail handle"));return{identity:c,handling:uh(a.db,{messageId:s.value,handlingBy:c.value,handlingTeamfile:c.teamfile,handlingAlias:c.alias})}}),o={schema_version:Hn,schema:"event-log-v1",message_id:s.value,handling_by:i.identity.value,handling_at:i.handling.handling_at,appended:i.handling.appended};return X(r,"--json")?J(e,o):e.stdout.write(`${o.appended?"handling":"handling refreshed"} ${o.message_id} as ${o.handling_by} since ${o.handling_at}
2661
+ `),0}async function o4(t,e){if(Xn(t))return e.stdout.write(YK),0;let n=En(t),r=Y(Vl(t,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=LN(M(r,"--since"),jK);if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=wp(M(r,"--root"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=Tp(M(r,"--limit"));if("error"in o)return re(e,n,"invalid_arguments",o.error);let a=$N(M(r,"--cursor"),"tree");if("error"in a)return re(e,n,"invalid_arguments",a.error);if(a.value!==null&&(M(r,"--root")!==void 0||M(r,"--since")!==void 0))return re(e,n,"invalid_arguments","--cursor cannot be combined with --root or --since; the cursor retains the original filters");let l=await $(e,c=>{let u=a.value===null?i.value??Je(Ep(c,e,"mail tree")):Je(a.value.root),d=a.value?.since??s.iso,f=a.value?.since_label??M(r,"--since")??"24h",m=vN(c,{root:{teamfile:u.teamfile,alias:u.alias},since:d,limit:o.value,cursorSeq:a.value?.seq??null}),p=m.next_seq===null?null:CN({v:1,kind:"tree",seq:m.next_seq,root:u.value,since:d,since_label:f});return{schema_version:Hn,schema:"event-log-v1",root:{teamfile:u.teamfile,alias:u.alias},since:f,since_timestamp:d,sent:m.sent,next_cursor:p,orphan_policy:"Missing causal linkage, including a genuinely fresh or unprompted send before any inbound delivery, is surfaced as a root; no temporal fallback is used.",incomplete_capture_note:"External composition is causally linked by calling mail handle before a reactive send. A send remains an orphan root when no handle was declared or the handling pointer exceeded its one-hour TTL."}});if(X(r,"--json"))J(e,l);else{e.stdout.write(`Causal mail tree for ${l.root.teamfile}:${l.root.alias} since ${l.since_timestamp}
2662
2662
  `);for(let c of l.sent)ON(e,c,0);l.sent.length===0&&e.stdout.write(`(none)
2663
2663
  `),e.stdout.write(`
2664
2664
  Note: ${l.orphan_policy}
@@ -2672,7 +2672,7 @@ Note: ${l.orphan_policy}
2672
2672
  WHERE ${a.join(" AND ")}
2673
2673
  ORDER BY e.seq DESC
2674
2674
  LIMIT ?
2675
- `).all(...l),u=c.length>i,d=c.slice(0,i);return{messages:d.map(m=>{if(m.receiver_teamfile===null||m.receiver_alias===null)throw new Ze("data_error",`${m.stream_id} ${m.event_type} is missing receiver identity`);return{message_id:m.stream_id,receiver:{teamfile:m.receiver_teamfile,alias:m.receiver_alias},message_type:m.event_type==="RESPONSE_CREATE"?"response":"request",created_at:m.ts,lifecycle_state:l4(t,m)}}),next_seq:u?d.at(-1).seq:null}}function l4(t,e){return e.pending_message_id!==null?e.delivery_lease_id!==null||e.pending_state==="claimed"?"delivering":"queued":t.db.prepare("SELECT 1 FROM message_event WHERE stream_id = ? AND event_type = 'HANDLED' LIMIT 1").get(e.stream_id)===void 0?"delivered":"handled"}async function c4(t,e){let n=RN(t,e),r=n.find(f=>y4(f.event_type))??n[0],s=[...n].reverse().find(f=>WK.includes(f.event_type))??null,i=[...n].reverse().find(f=>f.event_type==="HANDLED")??null,o=d4(t,e,n),a=_4(t,e),l=$i(r.payload.provider_prompt),c=m4(r.payload),u=await u4(o,{messageId:e,providerPrompt:l,legacyMailboxId:c,evidenceAt:s?.ts??i?.ts??null}),d=a===null&&u.matched_index!==null&&u.messages!==null?p4(u.messages,u.matched_index):null;return{schema_version:Hn,schema:"event-log-v1",message_id:e,receiver:r.receiver_teamfile===null||r.receiver_alias===null?null:{teamfile:r.receiver_teamfile,alias:r.receiver_alias},db:{delivered:s!==null,handled:i!==null,delivered_at:s?.ts??i?.ts??null,delivered_by:s===null?null:h4(s.payload)},transcript:{checked:u.checked,found:u.matched_index!==null,seen_at:u.seen_at,session_id:o?.session_id??null,provider:o?.provider??null,reason:u.reason},answered:a!==null?{via:"db_response_event",response_message_id:a.stream_id,at:a.ts}:d===null?null:{via:"transcript_heuristic",response_message_id:null,at:d.timestamp.toISOString()}}}function RN(t,e){let n=t.db.prepare("SELECT * FROM message_event WHERE stream_id = ? ORDER BY seq ASC").all(e);if(n.length===0)throw new Ze("not_found",`message stream not found: ${e}`);return n.map(yp)}function yp(t){try{let e=JSON.parse(t.payload);if(!ms(e))throw new Ze("data_error",`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof Ze?e:new Ze("data_error",`message_event seq ${t.seq} payload is invalid JSON`)}}function d4(t,e,n){for(let s of[...n].reverse()){let i=AN(s.payload,null);if(i!==null)return i}let r=t.db.prepare(`
2675
+ `).all(...l),u=c.length>i,d=c.slice(0,i);return{messages:d.map(m=>{if(m.receiver_teamfile===null||m.receiver_alias===null)throw new ze("data_error",`${m.stream_id} ${m.event_type} is missing receiver identity`);return{message_id:m.stream_id,receiver:{teamfile:m.receiver_teamfile,alias:m.receiver_alias},message_type:m.event_type==="RESPONSE_CREATE"?"response":"request",created_at:m.ts,lifecycle_state:l4(t,m)}}),next_seq:u?d.at(-1).seq:null}}function l4(t,e){return e.pending_message_id!==null?e.delivery_lease_id!==null||e.pending_state==="claimed"?"delivering":"queued":t.db.prepare("SELECT 1 FROM message_event WHERE stream_id = ? AND event_type = 'HANDLED' LIMIT 1").get(e.stream_id)===void 0?"delivered":"handled"}async function c4(t,e){let n=RN(t,e),r=n.find(f=>y4(f.event_type))??n[0],s=[...n].reverse().find(f=>WK.includes(f.event_type))??null,i=[...n].reverse().find(f=>f.event_type==="HANDLED")??null,o=d4(t,e,n),a=_4(t,e),l=$i(r.payload.provider_prompt),c=m4(r.payload),u=await u4(o,{messageId:e,providerPrompt:l,legacyMailboxId:c,evidenceAt:s?.ts??i?.ts??null}),d=a===null&&u.matched_index!==null&&u.messages!==null?p4(u.messages,u.matched_index):null;return{schema_version:Hn,schema:"event-log-v1",message_id:e,receiver:r.receiver_teamfile===null||r.receiver_alias===null?null:{teamfile:r.receiver_teamfile,alias:r.receiver_alias},db:{delivered:s!==null,handled:i!==null,delivered_at:s?.ts??i?.ts??null,delivered_by:s===null?null:h4(s.payload)},transcript:{checked:u.checked,found:u.matched_index!==null,seen_at:u.seen_at,session_id:o?.session_id??null,provider:o?.provider??null,reason:u.reason},answered:a!==null?{via:"db_response_event",response_message_id:a.stream_id,at:a.ts}:d===null?null:{via:"transcript_heuristic",response_message_id:null,at:d.timestamp.toISOString()}}}function RN(t,e){let n=t.db.prepare("SELECT * FROM message_event WHERE stream_id = ? ORDER BY seq ASC").all(e);if(n.length===0)throw new ze("not_found",`message stream not found: ${e}`);return n.map(yp)}function yp(t){try{let e=JSON.parse(t.payload);if(!ms(e))throw new ze("data_error",`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof ze?e:new ze("data_error",`message_event seq ${t.seq} payload is invalid JSON`)}}function d4(t,e,n){for(let s of[...n].reverse()){let i=AN(s.payload,null);if(i!==null)return i}let r=t.db.prepare(`
2676
2676
  SELECT invocation_id FROM invocation_state
2677
2677
  WHERE request_message_id = ?
2678
2678
  ORDER BY started_at ASC, invocation_id ASC
@@ -2697,7 +2697,7 @@ Note: ${l.orphan_policy}
2697
2697
  ORDER BY response.seq ASC
2698
2698
  LIMIT 1
2699
2699
  `).get(e,e);return n===void 0?null:yp(n)}function h4(t){let e=ms(t.delivered_by)?t.delivered_by:null;return{lease_id:$i(e?.lease_id,t.lease_id),pid:v4(e?.pid,t.pid,t.holder_pid),host:$i(e?.host,t.host,t.holder_host)}}function ON(t,e,n){let r=" ".repeat(n),s=e.from===null?"operator":`${e.from.teamfile}:${e.from.alias}`;t.stdout.write(`${r}${e.message_id} ${s} -> ${e.to.teamfile}:${e.to.alias}${e.orphaned_to_root?" [root: no causal link]":""}
2700
- `);for(let i of e.children)ON(t,i,n+1)}function Mi(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let n=t[0];return FK.test(n)?{value:n}:{error:`invalid message_id: ${n}; expected msg_<id>`}}function wp(t){if(t===void 0)return{value:null};try{return{value:Je(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function Vl(t,e){let n=new Set(e),r=[];for(let s of t){let i=s.indexOf("="),o=i<0?s:s.slice(0,i);i>0&&n.has(o)?r.push(o,s.slice(i+1)):r.push(s)}return r}function g4(t){return t===void 0?{iso:null}:LN(t,null)}function LN(t,e){if(t===void 0)return e===null?{error:"missing --since value"}:{iso:new Date(Date.now()-e).toISOString()};let n=/^(\d+(?:\.\d+)?)(m|h|d)$/.exec(t);if(n!==null){let s=Number(n[1]),i=n[2]==="m"?6e4:n[2]==="h"?36e5:864e5,o=Date.now()-s*i;return!Number.isFinite(o)||s<=0?{error:`invalid --since value: ${t}`}:{iso:new Date(o).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t}; use an ISO timestamp or duration such as 24h`}}function Ep(t,e,n){let r=_r(e.env??process.env,t);if(r.ok)return r.identity;throw r.reason==="not-found"?new Ze("self_identity",gn(n)):new Ze("self_identity",sm(n))}function Xn(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h")}function En(t){return t.includes("--json")}function re(t,e,n,r){return e?(X(t,{status:"error",errorKind:n,message:r}),1):k(t,r)}function Tp(t){if(t===void 0)return{value:PK};if(!/^\d+$/.test(t))return{error:`invalid --limit value: ${t}; expected an integer`};let e=Number(t);return!Number.isSafeInteger(e)||e<1||e>NN?{error:`invalid --limit value: ${t}; expected 1..${NN}`}:{value:e}}function CN(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function $N(t,e){if(t===void 0)return{value:null};try{let n=JSON.parse(Buffer.from(t,"base64url").toString("utf8"));return!ms(n)||n.v!==1||n.kind!==e||typeof n.seq!="number"||!Number.isSafeInteger(n.seq)||n.seq<1?{error:"invalid --cursor value"}:n.kind==="sent"?typeof n.self!="string"||!gp(n.self)||!(n.to===null||typeof n.to=="string"&&gp(n.to))||!(n.since===null||typeof n.since=="string"&&Number.isFinite(Date.parse(n.since)))||!(n.status===null||n.status==="queued"||n.status==="delivered")?{error:"invalid --cursor value"}:{value:n}:typeof n.root!="string"||!gp(n.root)||typeof n.since!="string"||!Number.isFinite(Date.parse(n.since))||typeof n.since_label!="string"||n.since_label.length===0?{error:"invalid --cursor value"}:{value:n}}catch{return{error:"invalid --cursor value"}}}function gp(t){try{return Je(t),!0}catch{return!1}}function y4(t){return UK.includes(t)}function w4(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","kimi","dsh","hermes","ClaudeMock"].includes(t)}function ms(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function E4(t,e){let n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Za-z0-9_-])${n}(?:$|[^A-Za-z0-9_-])`).test(t)}function T4(t,e){return new RegExp(`(?:^|\\n)--- queued (?:message|response) [0-9]+ \\(mail #${e}(?:,|\\))`,"i").test(t)}function $i(...t){for(let e of t)if(typeof e=="string"&&e.length>0)return e;return null}function v4(...t){for(let e of t)if(typeof e=="number"&&Number.isFinite(e))return e;return null}var jK,PK,NN,Hn,FK,UK,WK,Bn,qK,HK,BK,XK,JK,GK,KK,VK,YK,Ze,DN=E(()=>{"use strict";ft();hi();Ls();St();IN();Ie();yl();yi();jK=24*60*60*1e3,PK=100,NN=1e3,Hn=1,FK=/^msg_[A-Za-z0-9][A-Za-z0-9_-]*$/,UK=["CREATE","RESPONSE_CREATE"],WK=["DELIVERED","RESPONSE_DELIVERED"],Bn=`schema_version is the output-contract version consumers must switch on.
2700
+ `);for(let i of e.children)ON(t,i,n+1)}function Mi(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let n=t[0];return FK.test(n)?{value:n}:{error:`invalid message_id: ${n}; expected msg_<id>`}}function wp(t){if(t===void 0)return{value:null};try{return{value:Je(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function Vl(t,e){let n=new Set(e),r=[];for(let s of t){let i=s.indexOf("="),o=i<0?s:s.slice(0,i);i>0&&n.has(o)?r.push(o,s.slice(i+1)):r.push(s)}return r}function g4(t){return t===void 0?{iso:null}:LN(t,null)}function LN(t,e){if(t===void 0)return e===null?{error:"missing --since value"}:{iso:new Date(Date.now()-e).toISOString()};let n=/^(\d+(?:\.\d+)?)(m|h|d)$/.exec(t);if(n!==null){let s=Number(n[1]),i=n[2]==="m"?6e4:n[2]==="h"?36e5:864e5,o=Date.now()-s*i;return!Number.isFinite(o)||s<=0?{error:`invalid --since value: ${t}`}:{iso:new Date(o).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t}; use an ISO timestamp or duration such as 24h`}}function Ep(t,e,n){let r=_r(e.env??process.env,t);if(r.ok)return r.identity;throw r.reason==="not-found"?new ze("self_identity",gn(n)):new ze("self_identity",sm(n))}function Xn(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h")}function En(t){return t.includes("--json")}function re(t,e,n,r){return e?(J(t,{status:"error",errorKind:n,message:r}),1):k(t,r)}function Tp(t){if(t===void 0)return{value:PK};if(!/^\d+$/.test(t))return{error:`invalid --limit value: ${t}; expected an integer`};let e=Number(t);return!Number.isSafeInteger(e)||e<1||e>NN?{error:`invalid --limit value: ${t}; expected 1..${NN}`}:{value:e}}function CN(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function $N(t,e){if(t===void 0)return{value:null};try{let n=JSON.parse(Buffer.from(t,"base64url").toString("utf8"));return!ms(n)||n.v!==1||n.kind!==e||typeof n.seq!="number"||!Number.isSafeInteger(n.seq)||n.seq<1?{error:"invalid --cursor value"}:n.kind==="sent"?typeof n.self!="string"||!gp(n.self)||!(n.to===null||typeof n.to=="string"&&gp(n.to))||!(n.since===null||typeof n.since=="string"&&Number.isFinite(Date.parse(n.since)))||!(n.status===null||n.status==="queued"||n.status==="delivered")?{error:"invalid --cursor value"}:{value:n}:typeof n.root!="string"||!gp(n.root)||typeof n.since!="string"||!Number.isFinite(Date.parse(n.since))||typeof n.since_label!="string"||n.since_label.length===0?{error:"invalid --cursor value"}:{value:n}}catch{return{error:"invalid --cursor value"}}}function gp(t){try{return Je(t),!0}catch{return!1}}function y4(t){return UK.includes(t)}function w4(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","kimi","dsh","hermes","ClaudeMock"].includes(t)}function ms(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function E4(t,e){let n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Za-z0-9_-])${n}(?:$|[^A-Za-z0-9_-])`).test(t)}function T4(t,e){return new RegExp(`(?:^|\\n)--- queued (?:message|response) [0-9]+ \\(mail #${e}(?:,|\\))`,"i").test(t)}function $i(...t){for(let e of t)if(typeof e=="string"&&e.length>0)return e;return null}function v4(...t){for(let e of t)if(typeof e=="number"&&Number.isFinite(e))return e;return null}var jK,PK,NN,Hn,FK,UK,WK,Bn,qK,HK,BK,XK,JK,GK,KK,VK,YK,ze,DN=E(()=>{"use strict";ut();hi();Ls();vt();IN();Ie();yl();yi();jK=24*60*60*1e3,PK=100,NN=1e3,Hn=1,FK=/^msg_[A-Za-z0-9][A-Za-z0-9_-]*$/,UK=["CREATE","RESPONSE_CREATE"],WK=["DELIVERED","RESPONSE_DELIVERED"],Bn=`schema_version is the output-contract version consumers must switch on.
2701
2701
  schema identifies the backing event-log substrate; it is not a second output version.`,qK=`usage:
2702
2702
  lmctl mail sent [--to <teamfile:alias>] [--since <duration|ISO>] [--status queued|delivered] [--limit N] [--cursor <token>] [--json]
2703
2703
  lmctl mail history <message_id> [--json]
@@ -2902,8 +2902,8 @@ With --json, the stable external contract is:
2902
2902
  "incomplete_capture_note":"..."}
2903
2903
  ${Bn}
2904
2904
  Default text output is human-readable and may change without notice.
2905
- `,Ze=class extends Error{errorKind;constructor(e,n){super(n),this.errorKind=e}}});import{existsSync as jN,mkdirSync as S4,readdirSync as b4,readFileSync as PN,writeFileSync as k4}from"node:fs";import{join as ps}from"node:path";import{fileURLToPath as I4}from"node:url";function A4(t){try{return N4.some(e=>jN(ps(t,e)))}catch{return!1}}function x4(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let n=e[1],r=e[2].trimStart(),s=n.match(/^name:\s*(.+)$/m),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:r}}function FN(t,e){t.durable_memory_mode!=="db"?R4(t):O4(t,e)}function UN(t){let e=A4(t),n;try{n=b4(Yl).filter(r=>r.endsWith(".template")).sort()}catch(r){return C({event:"bootstrap_templates_unreadable",path:Yl,error_message:r instanceof Error?r.message:String(r)}),[]}return n.filter(r=>r==="skills_lmprobe.md.template"||r==="skills_lmdebug.md.template"?e:!0)}function R4(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),C({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let n=ps(e,"durable-memory");try{S4(n,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),C({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:n,error_message:i instanceof Error?i.message:String(i)});return}let r=UN(e),s=[];for(let i of r){let o=i.replace(/\.template$/,""),a=ps(n,o);if(!jN(a))try{let l=PN(ps(Yl,i),"utf8");k4(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),C({event:"bootstrap_template_copy_failed",project_id:t.id,template:i,path:a,error_message:l instanceof Error?l.message:String(l)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${n}: ${s.join(", ")}`)}function O4(t,e){let n=t.local_path??"",r=UN(n),s=[];for(let i of r){let o=ps(Yl,i),a;try{a=PN(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c),C({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:c instanceof Error?c.message:String(c)});continue}let l=x4(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`),C({event:"bootstrap_template_frontmatter_invalid",project_id:t.id,template:i,path: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),C({event:"bootstrap_memory_upsert_failed",project_id:t.id,memory_name:l.name,template:i,error_message:c instanceof Error?c.message:String(c)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var Yl,N4,WN=E(()=>{"use strict";ae();Yl=ps(I4(import.meta.url),"../../config/durable_memory_templates"),N4=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as L4}from"node:crypto";import{existsSync as C4,mkdirSync as $4,writeFileSync as M4}from"node:fs";import{dirname as D4,join as _s}from"node:path";function vp(t){return typeof t=="string"&&t.startsWith(qN)}function q4(t){if(!vp(t))throw new jt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(qN.length),n=e.indexOf("/");if(n<=0)throw new jt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let r=e.slice(0,n);if(!U4.has(r))throw new jt(`unknown lmctl:// kind '${r}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(n+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new jt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new jt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:r,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function H4(t,e,n){if(t==="workflow")return Ra(e,n);let r=t==="mcp"?_s("templates","mcp",`${e}.json`):_s("templates","skills",e,"SKILL.md");for(let s of lf(n)){let i=_s(s,r);if(C4(i))return i}return null}function B4(t,e,n){let r=_s(af(n),P4,t);return t==="skill"?_s(r,e,"SKILL.md"):_s(r,`${e}${t==="workflow"?".compound.json":".json"}`)}function X4(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let n=e.trim();if(t==="mcp")try{let r=JSON.parse(n);return r!==null&&typeof r=="object"}catch{return!1}if(n.startsWith("{")||n.startsWith("["))try{return JSON.parse(n),!0}catch{return!1}return!0}async function HN(t,e){let{kind:n,name:r,ref:s}=q4(t),i=H4(n,r,e);if(i!==null)return i;let o=`${j4}${n}/${r}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(F4)})}catch(u){throw new jt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new jt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=W4.exec(s);if(u!==null){let d=L4("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new jt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!X4(n,l))throw new jt(`lmctl:// '${t}' remote artifact failed shape validation for ${n} \u2014 discarded, NOT cached.`,"validation-failure");let c=B4(n,r,e);return $4(D4(c),{recursive:!0}),M4(c,l,"utf8"),c}var qN,j4,P4,F4,U4,jt,W4,BN=E(()=>{"use strict";cf();qN="lmctl://",j4="https://lmctl.com/templates/",P4=".cache",F4=8e3,U4=new Set(["workflow","mcp","skill"]),jt=class extends Error{reason;constructor(e,n="malformed"){super(e),this.reason=n,this.name="LmctlUriError"}},W4=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as J4}from"node:child_process";import{cpSync as XN,existsSync as G4,mkdirSync as K4,mkdtempSync as V4,readFileSync as Vle,statSync as Y4,writeFileSync as JN}from"node:fs";import{homedir as z4,tmpdir as Z4}from"node:os";import{basename as GN,join as Pt}from"node:path";function Sp(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function bp(t,e,n){if(Array.isArray(t)){for(let r of t)bp(r,e,n);return}if(Sp(t)){t.alias===e&&(Array.isArray(t.mcp)&&n.mcp.push(...t.mcp),Array.isArray(t.skills)&&n.skills.push(...t.skills));for(let r of Object.values(t))bp(r,e,n)}}function nV(t,e){let n={mcp:[],skills:[]},r=new Set;for(let i of t.listProjects()){if(i.team_id!==e.team_id)continue;let o=t.getWorkflowByName(i.workflow_name);if(o===null||r.has(o.id))continue;r.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!Sp(a)||!Array.isArray(a.steps)))for(let l of a.steps)Sp(l)&&l.members!==void 0&&bp(l.members,e.alias,n)}let s=i=>{let o=new Map;for(let a of i)o.set(tV(a),a);return[...o.values()]};return{mcp:s(n.mcp),skills:s(n.skills)}}function rV(t,e){return t.listProjects().find(n=>n.team_id===e.team_id)?.local_path}async function sV(t,e){let n;try{n=await fetch(t,{signal:AbortSignal.timeout(Q4)})}catch(s){throw new Jn(e,`fetch ${t} failed: ${s.message}`)}if(!n.ok)throw new Jn(e,`fetch ${t} \u2192 HTTP ${n.status}`);let r=await n.text();if(r.length>KN)throw new Jn(e,`fetched ${t} exceeds ${KN} bytes`);return r}function iV(t,e,n,r){let s=J4(t,e,{cwd:n,env:kn(void 0,n),encoding:"utf8",timeout:6e4});if(s.error)throw new Jn(r,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Jn(r,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function oV(t){if(typeof t!="string")return t.name;let e=GN(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?GN(t.replace(/\/skill\.md$/i,"")):e}async function VN(t,e,n){let r=oV(t),s=Pt(e,r);if(K4(s,{recursive:!0}),typeof t!="string")return JN(Pt(s,"SKILL.md"),t.content,"utf8"),{name:r,dir:s};if(vp(t)&&(t=await HN(t)),zN.test(t))return JN(Pt(s,"SKILL.md"),await sV(t,n),"utf8"),{name:r,dir:s};if(!G4(t))throw new Jn(n,`skill path not found: ${t}`);return Y4(t).isDirectory()?(XN(t,s,{recursive:!0}),{name:r,dir:s}):(XN(t,Pt(s,"SKILL.md")),{name:r,dir:s})}async function ZN(t){let{dal:e,member:n,stderr:r}=t,s=nV(e,n);if(s.mcp.length===0&&s.skills.length===0)return;let i=Qe(n),o=n.sessiondir||t.baseDir||rV(e,n)||process.cwd(),a=l=>{r.write(`[seed:${n.alias}] ${l}
2906
- `)};if(s.mcp.length>0&&a(`MCP capability install is disabled in lmctl; ${s.mcp.length} declared server(s) NOT installed. Use nomcp for MCP server access.`),s.skills.length>0)if(eV.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=V4(Pt(Z4(),`lmctl-skill-${n.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!zN.test(c)?c:(await VN(c,l,n.alias)).dir;iV(i,["skills","install",u,"--scope","user","--consent"],o,n.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(YN[i]!==void 0){let l=YN[i]();for(let c of s.skills)await VN(c,l,n.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var Jn,zN,Q4,KN,eV,tV,Di,YN,QN=E(()=>{"use strict";mt();BN();At();Ii();Jn=class extends Error{alias;constructor(e,n){super(`capability install failed for ${e}: ${n}`),this.alias=e,this.name="CapabilityInstallError"}},zN=/^https?:\/\//i,Q4=8e3,KN=1e6,eV=new Set(["opencode"]),tV=t=>JSON.stringify(t),Di=()=>process.env.HOME??z4();YN={claude:()=>Pt(Di(),".claude","skills"),qwen:()=>Pt(Di(),".qwen","skills"),codex:()=>Pt(Di(),".codex","skills"),copilot:()=>Pt(Di(),".copilot","skills"),kimi:()=>Pt(process.env.KIMI_CODE_HOME??Pt(Di(),".kimi-code"),"skills")}});var kp,eA=E(()=>{"use strict";kp=`---
2905
+ `,ze=class extends Error{errorKind;constructor(e,n){super(n),this.errorKind=e}}});import{existsSync as jN,mkdirSync as S4,readdirSync as b4,readFileSync as PN,writeFileSync as k4}from"node:fs";import{join as ps}from"node:path";import{fileURLToPath as I4}from"node:url";function A4(t){try{return N4.some(e=>jN(ps(t,e)))}catch{return!1}}function x4(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let n=e[1],r=e[2].trimStart(),s=n.match(/^name:\s*(.+)$/m),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:r}}function FN(t,e){t.durable_memory_mode!=="db"?R4(t):O4(t,e)}function UN(t){let e=A4(t),n;try{n=b4(Yl).filter(r=>r.endsWith(".template")).sort()}catch(r){return C({event:"bootstrap_templates_unreadable",path:Yl,error_message:r instanceof Error?r.message:String(r)}),[]}return n.filter(r=>r==="skills_lmprobe.md.template"||r==="skills_lmdebug.md.template"?e:!0)}function R4(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),C({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let n=ps(e,"durable-memory");try{S4(n,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),C({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:n,error_message:i instanceof Error?i.message:String(i)});return}let r=UN(e),s=[];for(let i of r){let o=i.replace(/\.template$/,""),a=ps(n,o);if(!jN(a))try{let l=PN(ps(Yl,i),"utf8");k4(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),C({event:"bootstrap_template_copy_failed",project_id:t.id,template:i,path:a,error_message:l instanceof Error?l.message:String(l)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${n}: ${s.join(", ")}`)}function O4(t,e){let n=t.local_path??"",r=UN(n),s=[];for(let i of r){let o=ps(Yl,i),a;try{a=PN(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c),C({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:c instanceof Error?c.message:String(c)});continue}let l=x4(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`),C({event:"bootstrap_template_frontmatter_invalid",project_id:t.id,template:i,path: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),C({event:"bootstrap_memory_upsert_failed",project_id:t.id,memory_name:l.name,template:i,error_message:c instanceof Error?c.message:String(c)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var Yl,N4,WN=E(()=>{"use strict";ae();Yl=ps(I4(import.meta.url),"../../config/durable_memory_templates"),N4=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as L4}from"node:crypto";import{existsSync as C4,mkdirSync as $4,writeFileSync as M4}from"node:fs";import{dirname as D4,join as _s}from"node:path";function vp(t){return typeof t=="string"&&t.startsWith(qN)}function q4(t){if(!vp(t))throw new jt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(qN.length),n=e.indexOf("/");if(n<=0)throw new jt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let r=e.slice(0,n);if(!U4.has(r))throw new jt(`unknown lmctl:// kind '${r}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(n+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new jt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new jt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:r,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function H4(t,e,n){if(t==="workflow")return Ra(e,n);let r=t==="mcp"?_s("templates","mcp",`${e}.json`):_s("templates","skills",e,"SKILL.md");for(let s of lf(n)){let i=_s(s,r);if(C4(i))return i}return null}function B4(t,e,n){let r=_s(af(n),P4,t);return t==="skill"?_s(r,e,"SKILL.md"):_s(r,`${e}${t==="workflow"?".compound.json":".json"}`)}function X4(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let n=e.trim();if(t==="mcp")try{let r=JSON.parse(n);return r!==null&&typeof r=="object"}catch{return!1}if(n.startsWith("{")||n.startsWith("["))try{return JSON.parse(n),!0}catch{return!1}return!0}async function HN(t,e){let{kind:n,name:r,ref:s}=q4(t),i=H4(n,r,e);if(i!==null)return i;let o=`${j4}${n}/${r}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(F4)})}catch(u){throw new jt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new jt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=W4.exec(s);if(u!==null){let d=L4("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new jt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!X4(n,l))throw new jt(`lmctl:// '${t}' remote artifact failed shape validation for ${n} \u2014 discarded, NOT cached.`,"validation-failure");let c=B4(n,r,e);return $4(D4(c),{recursive:!0}),M4(c,l,"utf8"),c}var qN,j4,P4,F4,U4,jt,W4,BN=E(()=>{"use strict";cf();qN="lmctl://",j4="https://lmctl.com/templates/",P4=".cache",F4=8e3,U4=new Set(["workflow","mcp","skill"]),jt=class extends Error{reason;constructor(e,n="malformed"){super(e),this.reason=n,this.name="LmctlUriError"}},W4=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as J4}from"node:child_process";import{cpSync as XN,existsSync as G4,mkdirSync as K4,mkdtempSync as V4,readFileSync as Vle,statSync as Y4,writeFileSync as JN}from"node:fs";import{homedir as z4,tmpdir as Z4}from"node:os";import{basename as GN,join as Pt}from"node:path";function Sp(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function bp(t,e,n){if(Array.isArray(t)){for(let r of t)bp(r,e,n);return}if(Sp(t)){t.alias===e&&(Array.isArray(t.mcp)&&n.mcp.push(...t.mcp),Array.isArray(t.skills)&&n.skills.push(...t.skills));for(let r of Object.values(t))bp(r,e,n)}}function nV(t,e){let n={mcp:[],skills:[]},r=new Set;for(let i of t.listProjects()){if(i.team_id!==e.team_id)continue;let o=t.getWorkflowByName(i.workflow_name);if(o===null||r.has(o.id))continue;r.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!Sp(a)||!Array.isArray(a.steps)))for(let l of a.steps)Sp(l)&&l.members!==void 0&&bp(l.members,e.alias,n)}let s=i=>{let o=new Map;for(let a of i)o.set(tV(a),a);return[...o.values()]};return{mcp:s(n.mcp),skills:s(n.skills)}}function rV(t,e){return t.listProjects().find(n=>n.team_id===e.team_id)?.local_path}async function sV(t,e){let n;try{n=await fetch(t,{signal:AbortSignal.timeout(Q4)})}catch(s){throw new Jn(e,`fetch ${t} failed: ${s.message}`)}if(!n.ok)throw new Jn(e,`fetch ${t} \u2192 HTTP ${n.status}`);let r=await n.text();if(r.length>KN)throw new Jn(e,`fetched ${t} exceeds ${KN} bytes`);return r}function iV(t,e,n,r){let s=J4(t,e,{cwd:n,env:kn(void 0,n),encoding:"utf8",timeout:6e4});if(s.error)throw new Jn(r,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Jn(r,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function oV(t){if(typeof t!="string")return t.name;let e=GN(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?GN(t.replace(/\/skill\.md$/i,"")):e}async function VN(t,e,n){let r=oV(t),s=Pt(e,r);if(K4(s,{recursive:!0}),typeof t!="string")return JN(Pt(s,"SKILL.md"),t.content,"utf8"),{name:r,dir:s};if(vp(t)&&(t=await HN(t)),zN.test(t))return JN(Pt(s,"SKILL.md"),await sV(t,n),"utf8"),{name:r,dir:s};if(!G4(t))throw new Jn(n,`skill path not found: ${t}`);return Y4(t).isDirectory()?(XN(t,s,{recursive:!0}),{name:r,dir:s}):(XN(t,Pt(s,"SKILL.md")),{name:r,dir:s})}async function ZN(t){let{dal:e,member:n,stderr:r}=t,s=nV(e,n);if(s.mcp.length===0&&s.skills.length===0)return;let i=Ze(n),o=n.sessiondir||t.baseDir||rV(e,n)||process.cwd(),a=l=>{r.write(`[seed:${n.alias}] ${l}
2906
+ `)};if(s.mcp.length>0&&a(`MCP capability install is disabled in lmctl; ${s.mcp.length} declared server(s) NOT installed. Use nomcp for MCP server access.`),s.skills.length>0)if(eV.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=V4(Pt(Z4(),`lmctl-skill-${n.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!zN.test(c)?c:(await VN(c,l,n.alias)).dir;iV(i,["skills","install",u,"--scope","user","--consent"],o,n.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(YN[i]!==void 0){let l=YN[i]();for(let c of s.skills)await VN(c,l,n.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var Jn,zN,Q4,KN,eV,tV,Di,YN,QN=E(()=>{"use strict";ft();BN();At();Ii();Jn=class extends Error{alias;constructor(e,n){super(`capability install failed for ${e}: ${n}`),this.alias=e,this.name="CapabilityInstallError"}},zN=/^https?:\/\//i,Q4=8e3,KN=1e6,eV=new Set(["opencode"]),tV=t=>JSON.stringify(t),Di=()=>process.env.HOME??z4();YN={claude:()=>Pt(Di(),".claude","skills"),qwen:()=>Pt(Di(),".qwen","skills"),codex:()=>Pt(Di(),".codex","skills"),copilot:()=>Pt(Di(),".copilot","skills"),kimi:()=>Pt(process.env.KIMI_CODE_HOME??Pt(Di(),".kimi-code"),"skills")}});var kp,eA=E(()=>{"use strict";kp=`---
2907
2907
 
2908
2908
  # Durable memory \u2014 how to use it
2909
2909
 
@@ -2914,22 +2914,22 @@ ON EVERY NEW TASK:
2914
2914
  2. Pull only the chapters relevant to your current task. Don't load everything.
2915
2915
  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.
2916
2916
 
2917
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var nA={};oe(nA,{runTeam:()=>dV});import{existsSync as aV}from"node:fs";import{join as lV}from"node:path";async function dV(t,e){let[n,...r]=t;if(n==="--help"||n==="-h"||n==="help")return e.stdout.write(cV),0;try{return await $(e,async s=>{switch(n){case"create":return fV(r,e,s);case"list":return mV(r,e,s);case"show":return pV(r,e,s);case"add-member":return _V(r,e,s);case"seed":return tA(r,e,s,!1);case"refresh":return tA(r,e,s,!0);case"companion":return gV(r,e,s);case"list-roots":return uV(r,e,s);default:return k(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return Ue(e,s)}}function uV(t,e,n){let r=Y(t,[]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length>0)return k(e,"usage: team list-roots [--json]");let s=n.listRootTeams().map(i=>({...i,missing_on_disk:!aV(i.teamfile_path)||void 0}));return B(r,"--json")?X(e,s):e.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}${i.missing_on_disk?" MISSING (file deleted or renamed)":""}`).join(`
2917
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var nA={};oe(nA,{runTeam:()=>dV});import{existsSync as aV}from"node:fs";import{join as lV}from"node:path";async function dV(t,e){let[n,...r]=t;if(n==="--help"||n==="-h"||n==="help")return e.stdout.write(cV),0;try{return await $(e,async s=>{switch(n){case"create":return fV(r,e,s);case"list":return mV(r,e,s);case"show":return pV(r,e,s);case"add-member":return _V(r,e,s);case"seed":return tA(r,e,s,!1);case"refresh":return tA(r,e,s,!0);case"companion":return gV(r,e,s);case"list-roots":return uV(r,e,s);default:return k(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return We(e,s)}}function uV(t,e,n){let r=Y(t,[]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length>0)return k(e,"usage: team list-roots [--json]");let s=n.listRootTeams().map(i=>({...i,missing_on_disk:!aV(i.teamfile_path)||void 0}));return X(r,"--json")?J(e,s):e.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}${i.missing_on_disk?" MISSING (file deleted or renamed)":""}`).join(`
2918
2918
  `)+(s.length>0?`
2919
2919
  `:"")),0}function fV(t,e,n){let[r]=t;if(r===void 0)return k(e,"usage: team create <name>");let s=n.insertTeam({name:r});return e.stdout.write(`created team ${s.name}
2920
- `),0}function mV(t,e,n){let r=Y(t,[]);if(r.error!==void 0)return k(e,r.error);let s=n.listTeams();return B(r,"--json")?X(e,s):e.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
2920
+ `),0}function mV(t,e,n){let r=Y(t,[]);if(r.error!==void 0)return k(e,r.error);let s=n.listTeams();return X(r,"--json")?J(e,s):e.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
2921
2921
  `)}${s.length>0?`
2922
- `:""}`),0}function pV(t,e,n){let r=Y(t,[]);if(r.error!==void 0)return k(e,r.error);let[s]=r.positionals;if(s===void 0)return k(e,"usage: team show <name> [--json]");let i=n.findTeamByName(s);if(i===null)return k(e,`team not found: ${s}`);let o=n.listTeamMembers(i.id);if(B(r,"--json"))X(e,{team:i,members:o});else{e.stdout.write(`team ${i.name}
2923
- `);for(let a of o)e.stdout.write(`- ${a.alias} ${Qe(a)} ${a.sessionid??"(unseeded)"}
2924
- `)}return 0}function _V(t,e,n){let r=Y(t,["--alias","--provider","--model","--role","--sessiondir"]);if(r.error!==void 0)return k(e,r.error);let[s]=r.positionals;if(s===void 0)return k(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=n.findTeamByName(s);if(i===null)return k(e,`team not found: ${s}`);let o=M(r,"--alias"),a=M(r,"--provider");if(o===void 0||a===void 0)return k(e,"team add-member requires --alias and --provider");let l=n.insertTeamMember({team_id:i.id,alias:o,provider:a,model:M(r,"--model")??null,role:M(r,"--role")??"agent",sessiondir:M(r,"--sessiondir")??lV(Xi(),"sessions",i.name,o)});return B(r,"--json")?X(e,l):e.stdout.write(`added member ${l.alias} to ${i.name}
2922
+ `:""}`),0}function pV(t,e,n){let r=Y(t,[]);if(r.error!==void 0)return k(e,r.error);let[s]=r.positionals;if(s===void 0)return k(e,"usage: team show <name> [--json]");let i=n.findTeamByName(s);if(i===null)return k(e,`team not found: ${s}`);let o=n.listTeamMembers(i.id);if(X(r,"--json"))J(e,{team:i,members:o});else{e.stdout.write(`team ${i.name}
2923
+ `);for(let a of o)e.stdout.write(`- ${a.alias} ${Ze(a)} ${a.sessionid??"(unseeded)"}
2924
+ `)}return 0}function _V(t,e,n){let r=Y(t,["--alias","--provider","--model","--role","--sessiondir"]);if(r.error!==void 0)return k(e,r.error);let[s]=r.positionals;if(s===void 0)return k(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=n.findTeamByName(s);if(i===null)return k(e,`team not found: ${s}`);let o=M(r,"--alias"),a=M(r,"--provider");if(o===void 0||a===void 0)return k(e,"team add-member requires --alias and --provider");let l=n.insertTeamMember({team_id:i.id,alias:o,provider:a,model:M(r,"--model")??null,role:M(r,"--role")??"agent",sessiondir:M(r,"--sessiondir")??lV(Xi(),"sessions",i.name,o)});return X(r,"--json")?J(e,l):e.stdout.write(`added member ${l.alias} to ${i.name}
2925
2925
  `),0}async function tA(t,e,n,r){let s=Y(t,["--alias"]);if(s.error!==void 0)return k(e,s.error);let[i]=s.positionals;if(i===void 0)return k(e,r?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=n.findTeamByName(i);if(o===null)return k(e,`team not found: ${i}`);let a=M(s,"--alias");if(r&&a===void 0)return k(e,"team refresh requires --alias");if(r&&a!==void 0&&a.trim().toLowerCase()==="lead")return k(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=hV(n.listTeamMembers(o.id),a,r);if(a!==void 0&&l.length===0)return k(e,`member not found or already seeded: ${a}`);if(r&&l.some(m=>m.alias.toLowerCase()==="lead"||m.role==="lead"))return k(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=n.listProjects().filter(m=>m.team_id===o.id),u=new Set;for(let m of c){if(u.has(m.workflow_name))continue;u.add(m.workflow_name);let p=n.getWorkflowByName(m.workflow_name);if(p===null)continue;let h=ZT(m.workflow_name,p.definition);if(h.status==="FAIL")return k(e,`cannot seed team \`${o.name}\`: workflow \`${m.workflow_name}\` failed verify-at-seed \u2014 ${h.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let m of c)FN(m,n);let d=[],f=!1;for(let m of l){let p=await Jo({member:m,dal:n}),h=n.updateTeamMemberSession(m.id,p.sessionid);if(h!==null){let _=h.role_prompt??"",y=_.length>0?`${_}
2926
2926
 
2927
- ${kp}`:kp;n.setMemberPromptSnapshot(m.id,y),d.push(h);let g=El(Qe(h),p.sessionid);g!==null&&e.stderr.write(`[seeded ${h.alias}] customize/compact in its native TUI:
2927
+ ${kp}`:kp;n.setMemberPromptSnapshot(m.id,y),d.push(h);let g=El(Ze(h),p.sessionid);g!==null&&e.stderr.write(`[seeded ${h.alias}] customize/compact in its native TUI:
2928
2928
  ${g}
2929
2929
  `);try{await ZN({dal:n,member:h,stderr:e.stderr})}catch(w){f=!0,e.stderr.write(`error: ${w instanceof Error?w.message:String(w)}
2930
- `)}}}return B(s,"--json")?X(e,d):e.stdout.write(`seeded ${d.length} member(s)
2930
+ `)}}}return X(s,"--json")?J(e,d):e.stdout.write(`seeded ${d.length} member(s)
2931
2931
  `),f?1:0}function hV(t,e,n){return t.filter(r=>e!==void 0&&r.alias!==e?!1:n||r.sessionid===null)}function gV(t,e,n){let r=Y(t,["--interpreter","--of"]);if(r.error!==void 0)return k(e,r.error);let[s]=r.positionals;if(s===void 0)return k(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=n.findTeamByName(s);if(i===null)return k(e,`team not found: ${s}`);let o=M(r,"--interpreter"),a=M(r,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return k(e,"team companion requires --interpreter and --of");let l=n.findTeamMemberByAlias(i.id,o);if(l===null)return k(e,`member not found: ${o}`);for(let c of a){let u=n.findTeamMemberByAlias(i.id,c);if(u===null)return k(e,`member not found: ${c}`);n.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
2932
- `),0}var cV,rA=E(()=>{"use strict";qe();Eu();WN();mt();St();QN();Ua();Ie();eA();cV=`usage: lmctl team create <name>
2932
+ `),0}var cV,rA=E(()=>{"use strict";He();Eu();WN();ft();vt();QN();Ua();Ie();eA();cV=`usage: lmctl team create <name>
2933
2933
  lmctl team list [--json]
2934
2934
  lmctl team show <name> [--json]
2935
2935
  lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
@@ -2942,20 +2942,20 @@ Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2942
2942
  refresh to create/update native provider sessions for team members.
2943
2943
  team refresh rejects Lead members (alias matching is case-insensitive).
2944
2944
  `});var fA={};oe(fA,{applyMaxBytes:()=>Ql,parseTailSince:()=>dA,renderMessage:()=>cA,runTail:()=>vV});async function vV(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${TV}
2945
- `),0;let n=Y(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run","--since"],["--watch","--help","--json"]);if(n.error!==void 0)return k(e,n.error);let r=B(n,"--json"),s=M(n,"--since"),i=dA(s);if("error"in i)return k(e,i.error);let o=i.date,a=M(n,"--lines"),l=M(n,"--max-bytes");if(a!==void 0&&l!==void 0)return k(e,"--lines and --max-bytes are mutually exclusive (choose one)");let c;if(a!==void 0){let y=Number.parseInt(a,10);if(!Number.isFinite(y)||y<1||String(y)!==a)return k(e,`invalid --lines "${a}" (expected a positive integer)`);c={kind:"lines",lines:y}}else{let y=l===void 0?wV:Number.parseInt(l,10);if(!Number.isFinite(y)||y<0||l!==void 0&&String(y)!==l)return k(e,`invalid --max-bytes "${l}" (expected a non-negative integer)`);r&&l!==void 0&&e.stderr.write(`warning: --max-bytes has no effect under --json (byte-truncation has no JSON analog); ignoring
2946
- `),c={kind:"bytes",maxBytes:y}}let u=B(n,"--watch"),d=M(n,"--watch-interval"),f=d===void 0?EV:Number.parseInt(d.replace(/s$/,""),10);if(!Number.isFinite(f)||f<1)return k(e,`invalid --watch-interval "${d}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let m=M(n,"--run");if(m!==void 0){if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional [target] [alias]");if(M(n,"--session")!==void 0)return k(e,"--run is mutually exclusive with --session");if(M(n,"--provider")!==void 0)return k(e,"--run is mutually exclusive with --provider");let y=Number.parseInt(m,10);if(!Number.isFinite(y)||y<=0||String(y)!==m)return k(e,`invalid --run "${m}" (expected a positive integer run id)`);try{return await $(e,async g=>SV(e,g,y,c,u,f,o,r))}catch(g){return Ue(e,g)}}let p=Tt(yV,{target:n.positionals[0],alias:n.positionals[1],flags:{session:M(n,"--session"),provider:M(n,"--provider")}});if(p.mode==="error")return k(e,p.message);if(p.mode==="managed")return k(e,"tail managed mode requires --run <id>");let h;if(p.mode==="ai-team")if(p.alias===void 0){let y;try{y=await $(e,T=>be(p.teamfile,T))}catch(T){return k(e,`tail: ${T instanceof Error?T.message:String(T)}`)}let g;try{g=$e(y)}catch(T){return k(e,`tail: ${T instanceof Error?T.message:String(T)}`)}let w=Et(g);if(w===void 0)return k(e,`tail: ${p.teamfile} has no Lead member; pass <tf>:<alias>`);try{let T=await $(e,N=>De(p.teamfile,w.alias,N));h={provider:T.provider,sessionId:T.sessionid,cwd:T.sessiondir}}catch(T){return T instanceof ve?k(e,T.message):Ue(e,T)}}else try{let y=await $(e,g=>De(p.teamfile,p.alias,g));h={provider:y.provider,sessionId:y.sessionid,cwd:y.sessiondir}}catch(y){return y instanceof ve?k(e,y.message):Ue(e,y)}else{let y=p.sessionid,g=p.provider;if(g===void 0){let w=await tn(y);if(w.length===0)return k(e,`tail: session "${y}" not found in any provider store`);if(w.length>1)return k(e,`tail: session "${y}" matches multiple providers (${w.join(", ")}); pass --provider`);g=w[0]}h={provider:g,sessionId:y}}let _=await sA(e,h.provider,h.sessionId,c,-1,o,r);return _===Zl?1:u?await new Promise(y=>{let g=async()=>{try{let N=await sA(e,h.provider,h.sessionId,c,_,o,r);N!==Zl&&(_=N)}catch(N){e.stderr.write(`tail: ${N instanceof Error?N.message:String(N)}
2945
+ `),0;let n=Y(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run","--since"],["--watch","--help","--json"]);if(n.error!==void 0)return k(e,n.error);let r=X(n,"--json"),s=M(n,"--since"),i=dA(s);if("error"in i)return k(e,i.error);let o=i.date,a=M(n,"--lines"),l=M(n,"--max-bytes");if(a!==void 0&&l!==void 0)return k(e,"--lines and --max-bytes are mutually exclusive (choose one)");let c;if(a!==void 0){let y=Number.parseInt(a,10);if(!Number.isFinite(y)||y<1||String(y)!==a)return k(e,`invalid --lines "${a}" (expected a positive integer)`);c={kind:"lines",lines:y}}else{let y=l===void 0?wV:Number.parseInt(l,10);if(!Number.isFinite(y)||y<0||l!==void 0&&String(y)!==l)return k(e,`invalid --max-bytes "${l}" (expected a non-negative integer)`);r&&l!==void 0&&e.stderr.write(`warning: --max-bytes has no effect under --json (byte-truncation has no JSON analog); ignoring
2946
+ `),c={kind:"bytes",maxBytes:y}}let u=X(n,"--watch"),d=M(n,"--watch-interval"),f=d===void 0?EV:Number.parseInt(d.replace(/s$/,""),10);if(!Number.isFinite(f)||f<1)return k(e,`invalid --watch-interval "${d}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let m=M(n,"--run");if(m!==void 0){if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional [target] [alias]");if(M(n,"--session")!==void 0)return k(e,"--run is mutually exclusive with --session");if(M(n,"--provider")!==void 0)return k(e,"--run is mutually exclusive with --provider");let y=Number.parseInt(m,10);if(!Number.isFinite(y)||y<=0||String(y)!==m)return k(e,`invalid --run "${m}" (expected a positive integer run id)`);try{return await $(e,async g=>SV(e,g,y,c,u,f,o,r))}catch(g){return We(e,g)}}let p=Et(yV,{target:n.positionals[0],alias:n.positionals[1],flags:{session:M(n,"--session"),provider:M(n,"--provider")}});if(p.mode==="error")return k(e,p.message);if(p.mode==="managed")return k(e,"tail managed mode requires --run <id>");let h;if(p.mode==="ai-team")if(p.alias===void 0){let y;try{y=await $(e,T=>be(p.teamfile,T))}catch(T){return k(e,`tail: ${T instanceof Error?T.message:String(T)}`)}let g;try{g=$e(y)}catch(T){return k(e,`tail: ${T instanceof Error?T.message:String(T)}`)}let w=wt(g);if(w===void 0)return k(e,`tail: ${p.teamfile} has no Lead member; pass <tf>:<alias>`);try{let T=await $(e,N=>je(p.teamfile,w.alias,N));h={provider:T.provider,sessionId:T.sessionid,cwd:T.sessiondir}}catch(T){return T instanceof ve?k(e,T.message):We(e,T)}}else try{let y=await $(e,g=>je(p.teamfile,p.alias,g));h={provider:y.provider,sessionId:y.sessionid,cwd:y.sessiondir}}catch(y){return y instanceof ve?k(e,y.message):We(e,y)}else{let y=p.sessionid,g=p.provider;if(g===void 0){let w=await tn(y);if(w.length===0)return k(e,`tail: session "${y}" not found in any provider store`);if(w.length>1)return k(e,`tail: session "${y}" matches multiple providers (${w.join(", ")}); pass --provider`);g=w[0]}h={provider:g,sessionId:y}}let _=await sA(e,h.provider,h.sessionId,c,-1,o,r);return _===Zl?1:u?await new Promise(y=>{let g=async()=>{try{let N=await sA(e,h.provider,h.sessionId,c,_,o,r);N!==Zl&&(_=N)}catch(N){e.stderr.write(`tail: ${N instanceof Error?N.message:String(N)}
2947
2947
  `)}},w=setInterval(()=>{g()},f*1e3),T=()=>{clearInterval(w),y(0)};process.once("SIGINT",T),process.once("SIGTERM",T)}):0}async function sA(t,e,n,r,s,i,o){let a;try{a=await Ne(n,e)}catch(f){return t.stderr.write(`tail: failed to load session: ${f instanceof Error?f.message:String(f)}
2948
2948
  `),Zl}if(a===null)return t.stderr.write(`tail: session not found: ${n} (provider=${e})
2949
- `),Zl;let l=a.messages??[],c=s<0&&r.kind==="lines"?Math.max(0,l.length-r.lines):s+1;if(s<0&&i!==void 0){let f=i.getTime(),m=l.length;for(let p=0;p<l.length;p+=1){let h=l[p].timestamp,_=h===void 0?NaN:(h instanceof Date?h:new Date(h)).getTime();if(!Number.isNaN(_)&&_>=f){m=p;break}}c=Math.max(c,m)}let u=s<0&&c>0;if(c>=l.length)return o===!0&&s<0&&X(t,{schema_version:zl,provider:e,sessionId:n,messages:[],truncated:u}),l.length-1;if(o===!0){let f=l.slice(c).map(p=>({role:p.role,content:p.content,model:p.model??null,timestamp:(p.timestamp instanceof Date?p.timestamp:new Date(p.timestamp)).toISOString()}));return X(t,{schema_version:zl,provider:e,sessionId:n,messages:f,truncated:u}),l.length-1}let d="";for(let f=c;f<l.length;f+=1)d+=`${cA(l[f])}
2949
+ `),Zl;let l=a.messages??[],c=s<0&&r.kind==="lines"?Math.max(0,l.length-r.lines):s+1;if(s<0&&i!==void 0){let f=i.getTime(),m=l.length;for(let p=0;p<l.length;p+=1){let h=l[p].timestamp,_=h===void 0?NaN:(h instanceof Date?h:new Date(h)).getTime();if(!Number.isNaN(_)&&_>=f){m=p;break}}c=Math.max(c,m)}let u=s<0&&c>0;if(c>=l.length)return o===!0&&s<0&&J(t,{schema_version:zl,provider:e,sessionId:n,messages:[],truncated:u}),l.length-1;if(o===!0){let f=l.slice(c).map(p=>({role:p.role,content:p.content,model:p.model??null,timestamp:(p.timestamp instanceof Date?p.timestamp:new Date(p.timestamp)).toISOString()}));return J(t,{schema_version:zl,provider:e,sessionId:n,messages:f,truncated:u}),l.length-1}let d="";for(let f=c;f<l.length;f+=1)d+=`${cA(l[f])}
2950
2950
  `;return t.stdout.write(r.kind==="bytes"?Ql(d,r.maxBytes):d),l.length-1}function cA(t){let e=uA(t.timestamp),n=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
2951
2951
  `).replace(/\r/g,`
2952
2952
  `).split(`
2953
2953
  `),i=s[0]??"",o=s.slice(1);return o.length===0?`${n}: ${i}`:`${n}: ${i}
2954
2954
  ${o.map(a=>` ${a}`).join(`
2955
- `)}`}function iA(t){return t.map(e=>({id:e.id,kind:e.kind,step_id:e.step_id,timestamp:new Date(e.timestamp_ms).toISOString(),payload:e.payload}))}async function SV(t,e,n,r,s,i,o,a){if(e.getRun(n)===null)return k(t,`tail: run ${n}: not found`);let c=o===void 0?e.listSessionEvents(n):e.listSessionEvents(n).filter(f=>f.timestamp_ms>=o.getTime()),u=r.kind==="lines"?c.slice(Math.max(0,c.length-r.lines)):c;if(a===!0)X(t,{schema_version:zl,run_id:n,truncated:u.length<c.length,events:iA(u)});else{let f=u.map(m=>`${lA(m)}
2956
- `).join("");t.stdout.write(r.kind==="bytes"?Ql(f,r.maxBytes):f)}let d=c.length>0?c[c.length-1].id:0;return s?await new Promise(f=>{let p=setInterval(()=>{try{let _=e.listSessionEvents(n,d);if(_.length===0)return;for(let g of _)d=g.id;if(a===!0){X(t,{schema_version:zl,run_id:n,truncated:!1,events:iA(_)});return}let y=_.map(g=>`${lA(g)}
2955
+ `)}`}function iA(t){return t.map(e=>({id:e.id,kind:e.kind,step_id:e.step_id,timestamp:new Date(e.timestamp_ms).toISOString(),payload:e.payload}))}async function SV(t,e,n,r,s,i,o,a){if(e.getRun(n)===null)return k(t,`tail: run ${n}: not found`);let c=o===void 0?e.listSessionEvents(n):e.listSessionEvents(n).filter(f=>f.timestamp_ms>=o.getTime()),u=r.kind==="lines"?c.slice(Math.max(0,c.length-r.lines)):c;if(a===!0)J(t,{schema_version:zl,run_id:n,truncated:u.length<c.length,events:iA(u)});else{let f=u.map(m=>`${lA(m)}
2956
+ `).join("");t.stdout.write(r.kind==="bytes"?Ql(f,r.maxBytes):f)}let d=c.length>0?c[c.length-1].id:0;return s?await new Promise(f=>{let p=setInterval(()=>{try{let _=e.listSessionEvents(n,d);if(_.length===0)return;for(let g of _)d=g.id;if(a===!0){J(t,{schema_version:zl,run_id:n,truncated:!1,events:iA(_)});return}let y=_.map(g=>`${lA(g)}
2957
2957
  `).join("");t.stdout.write(r.kind==="bytes"?Ql(y,r.maxBytes):y)}catch(_){t.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2958
- `)}},i*1e3),h=()=>{clearInterval(p),f(0)};process.once("SIGINT",h),process.once("SIGTERM",h)}):0}function Ql(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(oA,"utf8");if(r>=e)return aA(t,e);let s=e-r,i=aA(t,s);return`${oA}${i}`}function aA(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function lA(t){let e=uA(new Date(t.timestamp_ms))??"",n="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(n=`alias=${i.alias}`),typeof i.provider=="string"&&(n+=`${n?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(n+=`${n?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(n+=`${n?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function dA(t){return xi(t,"--since")}function uA(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let n=r=>String(r).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())} ${n(e.getHours())}:${n(e.getMinutes())}:${n(e.getSeconds())}`}var yV,wV,EV,zl,TV,Zl,oA,mA=E(()=>{"use strict";St();Ie();vt();Dt();en();sp();yV={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},wV=4096,EV=2,zl=1,TV=`usage: lmctl tail [target] [alias]
2958
+ `)}},i*1e3),h=()=>{clearInterval(p),f(0)};process.once("SIGINT",h),process.once("SIGTERM",h)}):0}function Ql(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(oA,"utf8");if(r>=e)return aA(t,e);let s=e-r,i=aA(t,s);return`${oA}${i}`}function aA(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function lA(t){let e=uA(new Date(t.timestamp_ms))??"",n="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(n=`alias=${i.alias}`),typeof i.provider=="string"&&(n+=`${n?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(n+=`${n?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(n+=`${n?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function dA(t){return xi(t,"--since")}function uA(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let n=r=>String(r).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())} ${n(e.getHours())}:${n(e.getMinutes())}:${n(e.getSeconds())}`}var yV,wV,EV,zl,TV,Zl,oA,mA=E(()=>{"use strict";vt();Ie();Tt();Dt();en();sp();yV={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},wV=4096,EV=2,zl=1,TV=`usage: lmctl tail [target] [alias]
2959
2959
  lmctl tail --session <id> [--provider <name>]
2960
2960
  lmctl tail --run <id>
2961
2961
  [--lines N | --max-bytes N] [--since <duration|ISO8601>]
@@ -3008,7 +3008,7 @@ nothing new prints no line at all, same as text mode.`;Zl=-2;oA=`\u2026 [truncat
3008
3008
  ended_at = excluded.ended_at,
3009
3009
  exit_code = excluded.exit_code,
3010
3010
  error = excluded.error
3011
- `).run(e.id,e.kind,e.origin,e.target_teamfile,e.target_alias,e.from_identity,e.provider,e.session_id,e.command,e.status,e.started_at,e.ended_at,e.exit_code,e.error)}function IA(t){return t.prepare("SELECT DISTINCT provider, session_id FROM indexed_invocation WHERE provider IS NOT NULL AND session_id IS NOT NULL").all()}var IV,NV,NA=E(()=>{"use strict";Zi();qe();Bt();IV="session-index.db";NV=`
3011
+ `).run(e.id,e.kind,e.origin,e.target_teamfile,e.target_alias,e.from_identity,e.provider,e.session_id,e.command,e.status,e.started_at,e.ended_at,e.exit_code,e.error)}function IA(t){return t.prepare("SELECT DISTINCT provider, session_id FROM indexed_invocation WHERE provider IS NOT NULL AND session_id IS NOT NULL").all()}var IV,NV,NA=E(()=>{"use strict";Zi();He();Bt();IV="session-index.db";NV=`
3012
3012
  CREATE TABLE IF NOT EXISTS indexed_session (
3013
3013
  provider TEXT NOT NULL,
3014
3014
  session_id TEXT NOT NULL,
@@ -3092,9 +3092,9 @@ CREATE TABLE IF NOT EXISTS build_lock (
3092
3092
  pid INTEGER NOT NULL
3093
3093
  );
3094
3094
  `});var LA={};oe(LA,{discoverTargets:()=>RA,indexOneSession:()=>OA,pullInvocations:()=>xA,runSessionIndex:()=>RV});import{existsSync as AV}from"node:fs";async function RV(t,e,n=Ip){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${xV}
3095
- `),0;let[r]=t;if(r!=="build")return k(e,`session-index: unknown subcommand "${r??""}" (expected: build)`);let s=Q(),i=_A(),o={invocations_pulled:0,sessions_scanned:0,sessions_updated:0,sessions_skipped_unchanged:0,errors:[]};if(!AV(s))return X(e,{schema_version:1,index_db:i,state_db_found:!1,...o}),0;let a=hA(i),l=gA(s);try{EA(a);try{o.invocations_pulled=xA(l,a);let c=RA(l,a,n),u=new Map;for(let d of new Set(c.map(f=>f.provider)))u.set(d,await n.listSessions({provider:d}));for(let d of c){o.sessions_scanned+=1;try{let f=u.get(d.provider)?.find(p=>p.sessionId===d.sessionId);await OA(a,d,f,n)?o.sessions_updated+=1:o.sessions_skipped_unchanged+=1}catch(f){o.errors.push(`${d.provider}:${d.sessionId} \u2014 ${f instanceof Error?f.message:String(f)}`)}}}finally{TA(a)}}finally{l.close(),a.close()}return X(e,{schema_version:1,index_db:i,state_db_found:!0,...o}),0}function xA(t,e){let n=yA(e,AA),r=t.prepare("SELECT id, kind, origin, target_teamfile, target_alias, from_identity, meta, command, status, started_at, ended_at, exit_code, error FROM tracked_invocation WHERE id > ? ORDER BY id ASC").all(n),s=Sn(),i=n,o=0;for(let a of r){let l=null,c=null;if(a.meta!==null)try{let u=JSON.parse(a.meta);typeof u.provider=="string"&&(l=u.provider),typeof u.sessionid=="string"&&(c=u.sessionid)}catch{}if(kA(e,{id:a.id,kind:a.kind,origin:a.origin,target_teamfile:a.target_teamfile,target_alias:a.target_alias,from_identity:a.from_identity,provider:l,session_id:c,command:a.command,status:a.status,started_at:a.started_at,ended_at:a.ended_at,exit_code:a.exit_code,error:a.error}),o+=1,a.status==="running"&&Date.now()-new Date(a.started_at).getTime()<=s)break;i=a.id}return i>n&&wA(e,AA,i),o}function RA(t,e,n=Ip){let r=new Map,s=t.prepare("SELECT teamfile_path FROM root_team ORDER BY teamfile_path ASC").all().map(i=>i.teamfile_path);for(let i of s){let o;try{o=n.readTeamConfig(i)}catch{continue}for(let a of o.members){if(a.session===void 0||a.session.length===0)continue;let l=`${a.provider}\0${a.session}`;r.set(l,{provider:a.provider,sessionId:a.session,teamfile:i,alias:a.alias})}}for(let{provider:i,session_id:o}of IA(e)){let a=`${i}\0${o}`;r.has(a)||r.set(a,{provider:i,sessionId:o,teamfile:null,alias:null})}return[...r.values()]}async function OA(t,e,n,r=Ip){if(n===void 0)return!1;let s={modifiedAt:n.modifiedAt.toISOString(),messageCount:n.messageCount},i=SA(t,e.provider,e.sessionId);if(i!==null&&i.modified_at===s.modifiedAt&&i.message_count===s.messageCount)return!1;let o=await r.loadSessionDetail(e.sessionId,e.provider);if(o===null)return!1;let a=Fl(o);return bA(t,e.provider,e.sessionId,o.messages.filter(l=>l.role==="user"||l.role==="assistant").map((l,c)=>({provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,seq:c,role:l.role,content:l.content,model:l.model??null,timestamp_ms:l.timestamp.getTime()})),a.map(l=>({provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,kind:l.kind,name:l.name,command:l.command??null,path:l.path??null,started_at:l.startedAt,ended_at:l.endedAt,result:l.result}))),vA(t,{provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,modified_at:s.modifiedAt,message_count:s.messageCount,indexed_at:new Date().toISOString()}),!0}var xV,AA,Ip,CA=E(()=>{"use strict";ft();Dt();gt();St();qe();Ul();NA();Ie();xV=["usage: lmctl session-index build [--db PATH]","","One-shot background aggregation into ~/.lmctl/session-index.db (a","separate file from state.db). Indexes provider session messages,","classified tool calls, and lmctl's own tracked_invocation dispatch","history for every teamfile member lmctl knows about, plus any","superseded sessions already on record. Idempotent and safe to run on","a cron/loop; not wired into `lmctl serve` in this pass."].join(`
3095
+ `),0;let[r]=t;if(r!=="build")return k(e,`session-index: unknown subcommand "${r??""}" (expected: build)`);let s=Q(),i=_A(),o={invocations_pulled:0,sessions_scanned:0,sessions_updated:0,sessions_skipped_unchanged:0,errors:[]};if(!AV(s))return J(e,{schema_version:1,index_db:i,state_db_found:!1,...o}),0;let a=hA(i),l=gA(s);try{EA(a);try{o.invocations_pulled=xA(l,a);let c=RA(l,a,n),u=new Map;for(let d of new Set(c.map(f=>f.provider)))u.set(d,await n.listSessions({provider:d}));for(let d of c){o.sessions_scanned+=1;try{let f=u.get(d.provider)?.find(p=>p.sessionId===d.sessionId);await OA(a,d,f,n)?o.sessions_updated+=1:o.sessions_skipped_unchanged+=1}catch(f){o.errors.push(`${d.provider}:${d.sessionId} \u2014 ${f instanceof Error?f.message:String(f)}`)}}}finally{TA(a)}}finally{l.close(),a.close()}return J(e,{schema_version:1,index_db:i,state_db_found:!0,...o}),0}function xA(t,e){let n=yA(e,AA),r=t.prepare("SELECT id, kind, origin, target_teamfile, target_alias, from_identity, meta, command, status, started_at, ended_at, exit_code, error FROM tracked_invocation WHERE id > ? ORDER BY id ASC").all(n),s=Sn(),i=n,o=0;for(let a of r){let l=null,c=null;if(a.meta!==null)try{let u=JSON.parse(a.meta);typeof u.provider=="string"&&(l=u.provider),typeof u.sessionid=="string"&&(c=u.sessionid)}catch{}if(kA(e,{id:a.id,kind:a.kind,origin:a.origin,target_teamfile:a.target_teamfile,target_alias:a.target_alias,from_identity:a.from_identity,provider:l,session_id:c,command:a.command,status:a.status,started_at:a.started_at,ended_at:a.ended_at,exit_code:a.exit_code,error:a.error}),o+=1,a.status==="running"&&Date.now()-new Date(a.started_at).getTime()<=s)break;i=a.id}return i>n&&wA(e,AA,i),o}function RA(t,e,n=Ip){let r=new Map,s=t.prepare("SELECT teamfile_path FROM root_team ORDER BY teamfile_path ASC").all().map(i=>i.teamfile_path);for(let i of s){let o;try{o=n.readTeamConfig(i)}catch{continue}for(let a of o.members){if(a.session===void 0||a.session.length===0)continue;let l=`${a.provider}\0${a.session}`;r.set(l,{provider:a.provider,sessionId:a.session,teamfile:i,alias:a.alias})}}for(let{provider:i,session_id:o}of IA(e)){let a=`${i}\0${o}`;r.has(a)||r.set(a,{provider:i,sessionId:o,teamfile:null,alias:null})}return[...r.values()]}async function OA(t,e,n,r=Ip){if(n===void 0)return!1;let s={modifiedAt:n.modifiedAt.toISOString(),messageCount:n.messageCount},i=SA(t,e.provider,e.sessionId);if(i!==null&&i.modified_at===s.modifiedAt&&i.message_count===s.messageCount)return!1;let o=await r.loadSessionDetail(e.sessionId,e.provider);if(o===null)return!1;let a=Fl(o);return bA(t,e.provider,e.sessionId,o.messages.filter(l=>l.role==="user"||l.role==="assistant").map((l,c)=>({provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,seq:c,role:l.role,content:l.content,model:l.model??null,timestamp_ms:l.timestamp.getTime()})),a.map(l=>({provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,kind:l.kind,name:l.name,command:l.command??null,path:l.path??null,started_at:l.startedAt,ended_at:l.endedAt,result:l.result}))),vA(t,{provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,modified_at:s.modifiedAt,message_count:s.messageCount,indexed_at:new Date().toISOString()}),!0}var xV,AA,Ip,CA=E(()=>{"use strict";ut();Dt();ht();vt();He();Ul();NA();Ie();xV=["usage: lmctl session-index build [--db PATH]","","One-shot background aggregation into ~/.lmctl/session-index.db (a","separate file from state.db). Indexes provider session messages,","classified tool calls, and lmctl's own tracked_invocation dispatch","history for every teamfile member lmctl knows about, plus any","superseded sessions already on record. Idempotent and safe to run on","a cron/loop; not wired into `lmctl serve` in this pass."].join(`
3096
3096
  `),AA="tracked_invocation_max_id",Ip={listSessions:rr,loadSessionDetail:Ne,readTeamConfig:$e}});function Np(t){for(let e=t.length-1;e>=0;e-=1){let n=t[e],r=OV.exec(n.content);if(r===null){if(n.role==="assistant"&&n.content.trim().length>0)return null;continue}let s=Number.parseInt(r[1],10),i=r[2]===void 0?0:Number.parseInt(r[2],10),o=r[3].toLowerCase(),a=r[4]?.trim()??null,l=`${r[1]}${r[2]!==void 0?`:${r[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:LV(n.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:n.timestamp.toISOString()}}return null}function LV(t,e,n,r,s){if(!Number.isFinite(t.getTime())||e<1||e>12||n<0||n>59)return null;let i=CV(e,r);try{let o=$V(t,s),a=$A(o.year,o.month,o.day,i,n,s);if(a.getTime()<=t.getTime()){let l=PV(o,1);a=$A(l.year,l.month,l.day,i,n,s)}return a.toISOString()}catch{return null}}function CV(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function $V(t,e){let n=MA(e,!1).formatToParts(t);return{year:Tn(n,"year"),month:Tn(n,"month"),day:Tn(n,"day")}}function $A(t,e,n,r,s,i){let o=Date.UTC(t,e-1,n,r,s,0,0);for(let a=0;a<3;a+=1){let l=MV(new Date(o),i);o=Date.UTC(t,e-1,n,r,s,0,0)-l}return new Date(o)}function MV(t,e){let n=MA(e,!0).formatToParts(t);return Date.UTC(Tn(n,"year"),Tn(n,"month")-1,Tn(n,"day"),Tn(n,"hour"),Tn(n,"minute"),Tn(n,"second"),0)-t.getTime()}function MA(t,e){let n=e?jV:DV,r=n.get(t);if(r!==void 0)return r;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return n.set(t,s),s}function Tn(t,e){let n=t.find(r=>r.type===e)?.value;if(n===void 0)throw new Error(`missing ${e}`);return Number.parseInt(n,10)}function PV(t,e){let n=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate()}}var OV,DV,jV,DA=E(()=>{"use strict";OV=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;DV=new Map,jV=new Map});var BA={};oe(BA,{runInfo:()=>HV});import{execFileSync as Ap}from"node:child_process";import{dirname as jA,resolve as FV}from"node:path";function qV(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function HV(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${WV}
3097
- `),0;let n=Y(t,["--provider","--run"],["--json","--help"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let r=B(n,"--json"),s=M(n,"--run");if(s!==void 0){if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional [target] [alias]");if(M(n,"--provider")!==void 0)return k(e,"--run is mutually exclusive with --provider");let u=Number.parseInt(s,10);if(!Number.isFinite(u)||u<=0||String(u)!==s)return k(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await $(e,async d=>XV(e,d,u,r))}catch(d){return Ue(e,d)}}let i=Tt(UV,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:M(n,"--provider")}});if(i.mode==="error")return k(e,i.message);if(i.mode==="managed")return k(e,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let u;try{u=await $(e,d=>be(i.teamfile,d))}catch(d){return k(e,`health: ${d instanceof Error?d.message:String(d)}`)}return JV(e,u,r)}let o,a,l,c;if(i.mode==="ai-team")try{let u=await $(e,d=>De(i.teamfile,i.alias,d));o=u.provider,a=u.sessionid,l=u.alias,c={teamfile:u.teamfile,alias:u.alias}}catch(u){return u instanceof ve?k(e,u.message):Ue(e,u)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let u=await tn(a);if(u.length===0)return k(e,`health: session "${a}" not found in any provider store`);if(u.length>1)return k(e,`health: session "${a}" matches multiple providers (${u.join(", ")}); pass --provider`);o=u[0]}return BV(e,o,a,l,r,c)}async function BV(t,e,n,r,s,i){let o;try{o=await Ne(n,e)}catch(u){return k(t,`health: failed to load session: ${u instanceof Error?u.message:String(u)}`)}if(o===null)return k(t,`health: session not found: ${n} (provider=${e})`);let a=Np(o.messages),l=i===void 0?null:await GV(t,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...r!==void 0?{alias:r}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(X(t,{schema_version:Rp,...c}),0):(t.stdout.write(`Session: ${o.sessionId}
3097
+ `),0;let n=Y(t,["--provider","--run"],["--json","--help"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let r=X(n,"--json"),s=M(n,"--run");if(s!==void 0){if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional [target] [alias]");if(M(n,"--provider")!==void 0)return k(e,"--run is mutually exclusive with --provider");let u=Number.parseInt(s,10);if(!Number.isFinite(u)||u<=0||String(u)!==s)return k(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await $(e,async d=>XV(e,d,u,r))}catch(d){return We(e,d)}}let i=Et(UV,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:M(n,"--provider")}});if(i.mode==="error")return k(e,i.message);if(i.mode==="managed")return k(e,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let u;try{u=await $(e,d=>be(i.teamfile,d))}catch(d){return k(e,`health: ${d instanceof Error?d.message:String(d)}`)}return JV(e,u,r)}let o,a,l,c;if(i.mode==="ai-team")try{let u=await $(e,d=>je(i.teamfile,i.alias,d));o=u.provider,a=u.sessionid,l=u.alias,c={teamfile:u.teamfile,alias:u.alias}}catch(u){return u instanceof ve?k(e,u.message):We(e,u)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let u=await tn(a);if(u.length===0)return k(e,`health: session "${a}" not found in any provider store`);if(u.length>1)return k(e,`health: session "${a}" matches multiple providers (${u.join(", ")}); pass --provider`);o=u[0]}return BV(e,o,a,l,r,c)}async function BV(t,e,n,r,s,i){let o;try{o=await Ne(n,e)}catch(u){return k(t,`health: failed to load session: ${u instanceof Error?u.message:String(u)}`)}if(o===null)return k(t,`health: session not found: ${n} (provider=${e})`);let a=Np(o.messages),l=i===void 0?null:await GV(t,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...r!==void 0?{alias:r}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(J(t,{schema_version:Rp,...c}),0):(t.stdout.write(`Session: ${o.sessionId}
3098
3098
  `),t.stdout.write(` Provider: ${o.provider}
3099
3099
  `),r!==void 0&&t.stdout.write(` Alias: ${r}
3100
3100
  `),l!==null&&t.stdout.write(` Liveness: ${xp(l.liveness)}
@@ -3108,7 +3108,7 @@ CREATE TABLE IF NOT EXISTS build_lock (
3108
3108
  `),a!==null&&t.stdout.write(` SessionLimit: LIMITED resets_at=${UA(a)}
3109
3109
  `),t.stdout.write(` Created: ${c.createdAt}
3110
3110
  `),t.stdout.write(` Modified: ${c.modifiedAt}
3111
- `),0)}async function XV(t,e,n,r){let s=ir(e,n);if(s===null)return k(t,`health: run ${n}: not found`);let i=Wr(e,n),o=e.agentCallTokenTotals(n),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return r?(X(t,{schema_version:Rp,run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
3111
+ `),0)}async function XV(t,e,n,r){let s=ir(e,n);if(s===null)return k(t,`health: run ${n}: not found`);let i=Wr(e,n),o=e.agentCallTokenTotals(n),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return r?(J(t,{schema_version:Rp,run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
3112
3112
  `),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
3113
3113
  `),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
3114
3114
  `),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
@@ -3118,8 +3118,8 @@ CREATE TABLE IF NOT EXISTS build_lock (
3118
3118
  `),t.stdout.write(` Steps: ${s.steps.length}
3119
3119
  `),t.stdout.write(` AgentCalls: ${o.agentCallCount}
3120
3120
  `),t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
3121
- `),0)}async function JV(t,e,n){let r,s;try{let w=await $(t,T=>{let N=st(e,T);if(N.parseErrors.length>0)throw new Error(N.parseErrors.join("; "));return{teamName:N.name,targets:PA(e,T,new Set,[])}});s=w.teamName,r=w.targets}catch(w){return k(t,`health: ${w instanceof Error?w.message:String(w)}`)}let i=WA(e),o=i.kind==="repo"?i:null,a=await FA(t,r),l=[],c=0,u=o===null?void 0:0,d=o===null?void 0:0;for(let w of r){let T=null;try{T=await Ne(w.sessionid,w.provider)}catch(j){t.stderr.write(`warning: failed to load session "${w.sessionid}" for ${w.reportPath} (${w.provider}): ${j instanceof Error?j.message:String(j)}
3122
- `)}let N=T?.messageCount,b=o===null?void 0:T===null?null:qA(T,o.since),R=o===null?void 0:T===null?null:HA(T)??"n/a",K=o===null?void 0:{messageCount:b??null,tokens:null};l.push({alias:w.alias,reportPath:w.reportPath,teamfile:w.teamfile,provider:w.provider,sessionid:w.sessionid,messageCount:N??null,model:T?.model??"(unknown)",lastContext:T?.lastInputTokens,detailLoaded:T!==null,liveness:a.get(Op(w.teamfile,w.alias))??Lp(),sessionLimit:T===null?null:Np(T.messages),...o!==null?{activitySinceLastCommit:K,cumulativeTokens:R}:{}}),N===void 0?c=void 0:c!==void 0&&(c+=N),o!==null&&(b==null?u=void 0:u!==void 0&&(u+=b),R==null||R==="n/a"?d=void 0:d!==void 0&&(d+=R))}if(n)return X(t,{schema_version:Rp,team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(w=>({ref:w.ref,timestamp:w.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:w,cumulativeTokens:T,...N})=>({...N,lastContext:N.lastContext??null,...T!==void 0?{cumulativeTokens:T==="n/a"?null:T}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(w=>w.sessionid.length)),m=Math.max(5,...l.map(w=>w.reportPath.length))+1,p=Math.max(8,...l.map(w=>w.provider.length))+1,h=Math.max(5,...l.map(w=>w.model.length))+1,_=Math.max(4,...l.map(w=>xp(w.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
3121
+ `),0)}async function JV(t,e,n){let r,s;try{let w=await $(t,T=>{let N=rt(e,T);if(N.parseErrors.length>0)throw new Error(N.parseErrors.join("; "));return{teamName:N.name,targets:PA(e,T,new Set,[])}});s=w.teamName,r=w.targets}catch(w){return k(t,`health: ${w instanceof Error?w.message:String(w)}`)}let i=WA(e),o=i.kind==="repo"?i:null,a=await FA(t,r),l=[],c=0,u=o===null?void 0:0,d=o===null?void 0:0;for(let w of r){let T=null;try{T=await Ne(w.sessionid,w.provider)}catch(j){t.stderr.write(`warning: failed to load session "${w.sessionid}" for ${w.reportPath} (${w.provider}): ${j instanceof Error?j.message:String(j)}
3122
+ `)}let N=T?.messageCount,b=o===null?void 0:T===null?null:qA(T,o.since),R=o===null?void 0:T===null?null:HA(T)??"n/a",K=o===null?void 0:{messageCount:b??null,tokens:null};l.push({alias:w.alias,reportPath:w.reportPath,teamfile:w.teamfile,provider:w.provider,sessionid:w.sessionid,messageCount:N??null,model:T?.model??"(unknown)",lastContext:T?.lastInputTokens,detailLoaded:T!==null,liveness:a.get(Op(w.teamfile,w.alias))??Lp(),sessionLimit:T===null?null:Np(T.messages),...o!==null?{activitySinceLastCommit:K,cumulativeTokens:R}:{}}),N===void 0?c=void 0:c!==void 0&&(c+=N),o!==null&&(b==null?u=void 0:u!==void 0&&(u+=b),R==null||R==="n/a"?d=void 0:d!==void 0&&(d+=R))}if(n)return J(t,{schema_version:Rp,team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(w=>({ref:w.ref,timestamp:w.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:w,cumulativeTokens:T,...N})=>({...N,lastContext:N.lastContext??null,...T!==void 0?{cumulativeTokens:T==="n/a"?null:T}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(w=>w.sessionid.length)),m=Math.max(5,...l.map(w=>w.reportPath.length))+1,p=Math.max(8,...l.map(w=>w.provider.length))+1,h=Math.max(5,...l.map(w=>w.model.length))+1,_=Math.max(4,...l.map(w=>xp(w.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
3123
3123
  `),i.kind==="repo"){t.stdout.write(`Git progress:
3124
3124
  `);for(let w of i.commits)t.stdout.write(` ${w.ref}: ${w.timestamp.toISOString()}
3125
3125
  `);t.stdout.write(` Uncommitted: ${Ft(i.working.uncommittedTracked)} changed (tracked), ${Ft(i.working.untracked)} untracked
@@ -3135,7 +3135,7 @@ CREATE TABLE IF NOT EXISTS build_lock (
3135
3135
  small. Re-read after the next turn before concluding a compaction failed or gating on the value.
3136
3136
  `),g.length>0){t.stdout.write(`Session limits:
3137
3137
  `);for(let w of g)t.stdout.write(` ${w.reportPath}: LIMITED resets_at=${UA(w.sessionLimit)}
3138
- `)}return 0}function PA(t,e,n,r){let s=be(t,e);if(n.has(s))return[];n.add(s);let i=st(s,e);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...PA(FV(jA(s),a.teamfile),e,n,[...r,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function GV(t,e,n){let r=await FA(t,[{teamfile:e.teamfile,alias:e.alias}]),s=WA(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:n.lastInputTokens??null,liveness:r.get(Op(e.teamfile,e.alias))??Lp(),...i!==null?{activitySinceLastCommit:{messageCount:qA(n,i.since),tokens:null},cumulativeTokens:HA(n)??"n/a"}:{}}}async function FA(t,e){try{let n=await $(t,r=>e.map(s=>{let i=kr(r,s.teamfile,s.alias);return[Op(s.teamfile,s.alias),KV(i)]}));return new Map(n)}catch{return new Map}}function Op(t,e){return`${t}\0${e.toLowerCase()}`}function KV(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:Lp(t.reclaimable===void 0?null:{source:t.reclaimable.source,holderPid:t.reclaimable.holder_pid,holderHost:t.reclaimable.holder_host,reason:t.reclaimable.reason})}function Lp(t=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:t}}function xp(t){if(t.state!=="idle")return`busy (${t.reason})`;if(t.reclaimable!==null){let{holderPid:e,holderHost:n,reason:r}=t.reclaimable;return`idle (reclaimable lock: ${e!==null?`pid ${e}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead":"stale"})`}return"idle"}function UA(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function Ft(t){return t==null?"unknown":String(t)}function VV(t){return t==="n/a"?t:Ft(t)}function YV(t,e,n=String){return t!==void 0?n(t):e?"n/a":"unknown"}function WA(t){let e=jA(t),n;try{Ap("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{n=Ap("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let r=n.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(r.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=r.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:zV(e)}}function zV(t){let e;try{e=Ap("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let n=0,r=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?r+=1:n+=1);return{uncommittedTracked:n,untracked:r}}function qA(t,e){let n=e.getTime();return t.messages.filter(r=>(r.role==="user"||r.role==="assistant")&&Number.isFinite(r.timestamp.getTime())&&r.timestamp.getTime()>n).length}function HA(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(n=>typeof n=="number"&&Number.isFinite(n));return e.length===0?null:e.reduce((n,r)=>n+r,0)}var UV,Rp,WV,XA=E(()=>{"use strict";St();Ie();vt();en();ft();un();DA();UV={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},Rp=1,WV=`usage: lmctl health [target] [alias]
3138
+ `)}return 0}function PA(t,e,n,r){let s=be(t,e);if(n.has(s))return[];n.add(s);let i=rt(s,e);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...PA(FV(jA(s),a.teamfile),e,n,[...r,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function GV(t,e,n){let r=await FA(t,[{teamfile:e.teamfile,alias:e.alias}]),s=WA(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:n.lastInputTokens??null,liveness:r.get(Op(e.teamfile,e.alias))??Lp(),...i!==null?{activitySinceLastCommit:{messageCount:qA(n,i.since),tokens:null},cumulativeTokens:HA(n)??"n/a"}:{}}}async function FA(t,e){try{let n=await $(t,r=>e.map(s=>{let i=kr(r,s.teamfile,s.alias);return[Op(s.teamfile,s.alias),KV(i)]}));return new Map(n)}catch{return new Map}}function Op(t,e){return`${t}\0${e.toLowerCase()}`}function KV(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:Lp(t.reclaimable===void 0?null:{source:t.reclaimable.source,holderPid:t.reclaimable.holder_pid,holderHost:t.reclaimable.holder_host,reason:t.reclaimable.reason})}function Lp(t=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:t}}function xp(t){if(t.state!=="idle")return`busy (${t.reason})`;if(t.reclaimable!==null){let{holderPid:e,holderHost:n,reason:r}=t.reclaimable;return`idle (reclaimable lock: ${e!==null?`pid ${e}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead":"stale"})`}return"idle"}function UA(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function Ft(t){return t==null?"unknown":String(t)}function VV(t){return t==="n/a"?t:Ft(t)}function YV(t,e,n=String){return t!==void 0?n(t):e?"n/a":"unknown"}function WA(t){let e=jA(t),n;try{Ap("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{n=Ap("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let r=n.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(r.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=r.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:zV(e)}}function zV(t){let e;try{e=Ap("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let n=0,r=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?r+=1:n+=1);return{uncommittedTracked:n,untracked:r}}function qA(t,e){let n=e.getTime();return t.messages.filter(r=>(r.role==="user"||r.role==="assistant")&&Number.isFinite(r.timestamp.getTime())&&r.timestamp.getTime()>n).length}function HA(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(n=>typeof n=="number"&&Number.isFinite(n));return e.length===0?null:e.reduce((n,r)=>n+r,0)}var UV,Rp,WV,XA=E(()=>{"use strict";vt();Ie();Tt();en();ut();un();DA();UV={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},Rp=1,WV=`usage: lmctl health [target] [alias]
3139
3139
  lmctl health <teamfile> # team rollup
3140
3140
  lmctl health <sessionid> [--provider <name>]
3141
3141
  lmctl health --run <id> # run state, step rollup, and token totals
@@ -3145,7 +3145,7 @@ Show provider session details, team rollups, or managed run state/token totals.
3145
3145
  --json adds a schema_version field to whichever shape the target resolves
3146
3146
  to (single session / team rollup / --run) -- additive-only evolution, like
3147
3147
  \`lmctl session\`'s own JSON contract.`});import{mkdirSync as ZV,readFileSync as Cp,writeFileSync as JA,existsSync as KA}from"node:fs";import{homedir as QV}from"node:os";import{dirname as VA,join as $p,resolve as ec}from"node:path";import{fileURLToPath as eY}from"node:url";function rY(){return $p(QV(),".lmctl","cache","lmprice")}function YA(t){return $p(t,"model_list.json")}function zA(t){return $p(t,"model_list.meta.json")}function sY(t){try{let e=Cp(YA(t),"utf-8"),n=JSON.parse(e),r=null;try{r=JSON.parse(Cp(zA(t),"utf-8")).etag??null}catch{}return{catalog:n,etag:r}}catch{return null}}function iY(t,e,n){try{ZV(t,{recursive:!0}),JA(YA(t),JSON.stringify(e));let r={etag:n,fetchedAt:new Date().toISOString()};JA(zA(t),JSON.stringify(r))}catch{}}function oY(t){let e=aY(t),n=e?[ec(e,"data","price-data.json")]:[ec(t,"..","..","data","price-data.json")];for(let r of n)if(KA(r))return r;return null}function aY(t){let e=ec(t);for(;;){if(KA(ec(e,"package.json")))return e;let n=VA(e);if(n===e)return null;e=n}}function lY(t){let e=t!==void 0?t:oY(VA(eY(import.meta.url)));if(e===null)return null;try{return JSON.parse(Cp(e,"utf-8"))}catch{return null}}async function ZA(t={}){let e=t.fetchImpl??fetch,n=t.cacheDir??rY(),r=sY(n);try{let i=await e(GA,{method:"HEAD",signal:AbortSignal.timeout(tY)});if(i.ok){let o=i.headers.get("etag");if(r&&o!==null&&o===r.etag)return{catalog:r.catalog,source:"cache",generatedAt:r.catalog.generated_at};let a=await e(GA,{signal:AbortSignal.timeout(nY)});if(a.ok){let l=await a.json();return iY(n,l,a.headers.get("etag")),{catalog:l,source:"network",generatedAt:l.generated_at}}}}catch{}if(r)return{catalog:r.catalog,source:"cache",generatedAt:r.catalog.generated_at};let s=lY(t.bundledPath);return s?{catalog:s,source:"bundled",generatedAt:s.generated_at}:{catalog:null,source:"unavailable",generatedAt:null}}function QA(t,e){let n=e.toLowerCase(),r=t.records.find(i=>i.source_model_id.toLowerCase()===n);if(r)return r.pricing;let s=t.records.find(i=>i.source_model_id.toLowerCase().endsWith(`/${n}`));return s?s.pricing:null}function ex(t,e){if(e===null)return null;let{input_per_1m_tokens:n,output_per_1m_tokens:r,input_cache_read_per_1m_tokens:s}=e;if(n===null||r===null)return null;let i=s??n,o=t.input/1e6*n+t.output/1e6*r+t.cachedInput/1e6*i;return Number(o.toPrecision(10))}var GA,tY,nY,tx=E(()=>{"use strict";GA="https://lmctl.com/dataset/model_list.json",tY=1e3,nY=1e4});var nx={};oe(nx,{runCost:()=>fY});async function fY(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${uY}
3148
- `),0;let n=Y(t,["--provider"],["--json"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected <target> [alias]`);let r=B(n,"--json"),s=Tt(cY,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:M(n,"--provider")}});if(s.mode==="error")return k(e,s.message);if(s.mode==="managed")return k(e,"cost: managed-run targets are not supported (no per-run token/model rollup exists)");let i,o;if(s.mode==="ai-team")try{let g=await $(e,w=>De(s.teamfile,s.alias,w));i=g.provider,o=g.sessionid}catch(g){if(g instanceof ve)return k(e,g.message);throw g}else if(o=s.sessionid,s.provider!==void 0)i=s.provider;else{let g=await tn(o);if(g.length===0)return k(e,`cost: session "${o}" not found in any provider store`);if(g.length>1)return k(e,`cost: session "${o}" matches multiple providers (${g.join(", ")}); pass --provider`);i=g[0]}let a;try{a=await Ne(o,i)}catch(g){return k(e,`cost: failed to load session: ${g instanceof Error?g.message:String(g)}`)}if(a===null)return k(e,`cost: session not found: ${o} (provider=${i})`);let l=[...new Set(a.messages.map(g=>g.model).filter(g=>g!==void 0&&g!=="<synthetic>"))],c=[...a.messages].reverse().find(g=>g.model!==void 0&&g.model!=="<synthetic>")?.model,u=a.model??c??null,d=l.length>1,f={input:a.totalInputTokens??null,output:a.totalOutputTokens??null,cachedInput:a.totalCachedInputTokens??null},m=await ZA(),p=u!==null&&m.catalog!==null?QA(m.catalog,u):null,h=p===null?null:{inputPer1m:p.input_per_1m_tokens,outputPer1m:p.output_per_1m_tokens,cachedInputPer1m:p.input_cache_read_per_1m_tokens},_=f.input===null||f.output===null?null:ex({input:f.input,output:f.output,cachedInput:f.cachedInput??0},p),y={schema_version:dY,provider:i,sessionId:o,model:u,modelsUsed:l,approximate:d,tokens:f,pricePerModel:h,costUsd:_,priceDataSource:m.source,priceDataGeneratedAt:m.generatedAt};return r?(X(e,y),0):(e.stdout.write(`Session: ${o}
3148
+ `),0;let n=Y(t,["--provider"],["--json"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected <target> [alias]`);let r=X(n,"--json"),s=Et(cY,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:M(n,"--provider")}});if(s.mode==="error")return k(e,s.message);if(s.mode==="managed")return k(e,"cost: managed-run targets are not supported (no per-run token/model rollup exists)");let i,o;if(s.mode==="ai-team")try{let g=await $(e,w=>je(s.teamfile,s.alias,w));i=g.provider,o=g.sessionid}catch(g){if(g instanceof ve)return k(e,g.message);throw g}else if(o=s.sessionid,s.provider!==void 0)i=s.provider;else{let g=await tn(o);if(g.length===0)return k(e,`cost: session "${o}" not found in any provider store`);if(g.length>1)return k(e,`cost: session "${o}" matches multiple providers (${g.join(", ")}); pass --provider`);i=g[0]}let a;try{a=await Ne(o,i)}catch(g){return k(e,`cost: failed to load session: ${g instanceof Error?g.message:String(g)}`)}if(a===null)return k(e,`cost: session not found: ${o} (provider=${i})`);let l=[...new Set(a.messages.map(g=>g.model).filter(g=>g!==void 0&&g!=="<synthetic>"))],c=[...a.messages].reverse().find(g=>g.model!==void 0&&g.model!=="<synthetic>")?.model,u=a.model??c??null,d=l.length>1,f={input:a.totalInputTokens??null,output:a.totalOutputTokens??null,cachedInput:a.totalCachedInputTokens??null},m=await ZA(),p=u!==null&&m.catalog!==null?QA(m.catalog,u):null,h=p===null?null:{inputPer1m:p.input_per_1m_tokens,outputPer1m:p.output_per_1m_tokens,cachedInputPer1m:p.input_cache_read_per_1m_tokens},_=f.input===null||f.output===null?null:ex({input:f.input,output:f.output,cachedInput:f.cachedInput??0},p),y={schema_version:dY,provider:i,sessionId:o,model:u,modelsUsed:l,approximate:d,tokens:f,pricePerModel:h,costUsd:_,priceDataSource:m.source,priceDataGeneratedAt:m.generatedAt};return r?(J(e,y),0):(e.stdout.write(`Session: ${o}
3149
3149
  `),e.stdout.write(` Provider: ${i}
3150
3150
  `),e.stdout.write(` Model: ${u??"(unknown)"}
3151
3151
  `),d&&e.stdout.write(` NOTE: this session used multiple models (${l.join(", ")}) -- cost below is approximate, priced at ${u}'s rate for the whole session.
@@ -3153,7 +3153,7 @@ to (single session / team rollup / --run) -- additive-only evolution, like
3153
3153
  `),_===null?e.stdout.write(` Cost: n/a (no lmprice entry for "${u??"unknown"}")
3154
3154
  `):e.stdout.write(` Cost: ~$${_.toFixed(4)}${d?" (approximate)":""}
3155
3155
  `),e.stdout.write(` Price data: ${m.source}${m.generatedAt?` (generated ${m.generatedAt})`:""}
3156
- `),0)}var cY,dY,uY,rx=E(()=>{"use strict";St();tx();Ie();vt();cY={name:"cost",allowsBareTeamfile:!1,supportsRaw:!0},dY=1,uY=`usage: lmctl cost <target> [alias] [--json]
3156
+ `),0)}var cY,dY,uY,rx=E(()=>{"use strict";vt();tx();Ie();Tt();cY={name:"cost",allowsBareTeamfile:!1,supportsRaw:!0},dY=1,uY=`usage: lmctl cost <target> [alias] [--json]
3157
3157
  lmctl cost <sessionid> [--provider <name>]
3158
3158
 
3159
3159
  Estimate a session's dollar cost: aggregate token usage x the model's
@@ -3169,24 +3169,24 @@ came from (network / cache / bundled / unavailable) and
3169
3169
  strict short timeout and NEVER blocks or fails this command: any network
3170
3170
  error degrades silently to the local cache, then the bundled built-in
3171
3171
  copy, in that order.`});var ix={};oe(ix,{runLs:()=>hY});import{resolve as Mp}from"node:path";function _Y(t){let e=new Map;for(let n of t){let r=`${n.provider}:${n.sessionId}`,s=e.get(r);(s===void 0||n.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(r,n)}return[...e.values()]}async function hY(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${mY}
3172
- `),0;let n=Y(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>0)return k(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=M(n,"--format"),s=B(n,"--json");if(B(n,"--runs")){for(let y of["--provider","--sessiondir"])if(M(n,y)!==void 0)return k(e,`--runs is mutually exclusive with ${y}`);for(let y of["--recursive","--all"])if(B(n,y))return k(e,`--runs is mutually exclusive with ${y}`);if(r==="teamfile")return k(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=M(n,"--limit"),h=pY;if(p!==void 0){let y=Number.parseInt(p,10);if(!Number.isFinite(y)||y<1||String(y)!==p)return k(e,`invalid --limit "${p}" (expected a positive integer)`);if(y>sx)return k(e,`--limit ${y} exceeds maximum (${sx})`);h=y}let _=r==="json"||s===!0?"json":"table";try{return await $(e,async y=>gY(e,y,h,_))}catch(y){return Ue(e,y)}}let o=yY(r,s);if("error"in o)return k(e,o.error);let a=o.format,l=M(n,"--provider"),c=M(n,"--sessiondir"),u=B(n,"--recursive"),d=B(n,"--all"),f;try{f=await rr(l?{provider:l}:{})}catch(p){return k(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?Mp(c):Mp(process.cwd());f=f.filter(h=>{let _=Mp(h.cwd);return u?_===p||_.startsWith(`${p}/`):_===p})}if(f=_Y(f),a==="json")return X(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}.
3172
+ `),0;let n=Y(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>0)return k(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=M(n,"--format"),s=X(n,"--json");if(X(n,"--runs")){for(let y of["--provider","--sessiondir"])if(M(n,y)!==void 0)return k(e,`--runs is mutually exclusive with ${y}`);for(let y of["--recursive","--all"])if(X(n,y))return k(e,`--runs is mutually exclusive with ${y}`);if(r==="teamfile")return k(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=M(n,"--limit"),h=pY;if(p!==void 0){let y=Number.parseInt(p,10);if(!Number.isFinite(y)||y<1||String(y)!==p)return k(e,`invalid --limit "${p}" (expected a positive integer)`);if(y>sx)return k(e,`--limit ${y} exceeds maximum (${sx})`);h=y}let _=r==="json"||s===!0?"json":"table";try{return await $(e,async y=>gY(e,y,h,_))}catch(y){return We(e,y)}}let o=yY(r,s);if("error"in o)return k(e,o.error);let a=o.format,l=M(n,"--provider"),c=M(n,"--sessiondir"),u=X(n,"--recursive"),d=X(n,"--all"),f;try{f=await rr(l?{provider:l}:{})}catch(p){return k(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?Mp(c):Mp(process.cwd());f=f.filter(h=>{let _=Mp(h.cwd);return u?_===p||_.startsWith(`${p}/`):_===p})}if(f=_Y(f),a==="json")return J(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}.
3173
3173
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
3174
3174
  `);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
3175
3175
  `);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()}
3176
- `)}return 0}async function gY(t,e,n,r){let s=Ur(e,{limit:n});if(r==="json")return X(t,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
3176
+ `)}return 0}async function gY(t,e,n,r){let s=Ur(e,{limit:n});if(r==="json")return J(t,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
3177
3177
  `),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
3178
3178
  `);for(let i of s){let o=(i.current_state??"").padEnd(20),a=(i.terminal_state??"").padEnd(20);t.stdout.write(`${String(i.id).padEnd(8)} ${String(i.workflow_id).padEnd(8)} ${String(i.team_id).padEnd(8)} ${o} ${a} ${i.started_at}
3179
- `)}return 0}function yY(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 mY,pY,sx,ox=E(()=>{"use strict";gt();Ie();un();mY=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
3179
+ `)}return 0}function yY(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 mY,pY,sx,ox=E(()=>{"use strict";ht();Ie();un();mY=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
3180
3180
  [--recursive] [--all] [--format table|teamfile|json] [--json]
3181
3181
  lmctl ls --runs [--limit N] [--format table|json] [--json]
3182
3182
 
3183
- List native provider sessions in scope, or list recent managed runs with --runs.`,pY=50,sx=500});import{spawnSync as Wp}from"node:child_process";import{existsSync as gs,readFileSync as qp}from"node:fs";import{homedir as dx}from"node:os";import{dirname as ux,resolve as Gn}from"node:path";import{fileURLToPath as wY}from"node:url";function ys(t,e){return e.code==="ETIMEDOUT"?`${t} did not respond within lint's own spawn timeout (${e.message}) \u2014 this does not mean the provider itself is unreachable, only that this specific check didn't finish in time.`:`${t} could not be run: ${e.message}`}function SY(){let t=Wp("agy",["models"],{encoding:"utf-8",timeout:vY});return{status:t.status,stdout:t.stdout??"",error:t.error}}function bY(t){let e=[];for(let n of t.split(/\r?\n/)){let r=n.trim(),s=r.indexOf(" ");if(s<0)continue;let i=r.slice(s+1).trim();i&&e.push(i)}return e}function kY(t){if(!t&&Dp)return Dp;let e=s=>(t||(Dp=s),s),n;try{n=(t??SY)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?ys("agy models",s):`agy models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:ys("agy models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${n.status??"unknown"}`});let r=bY(n.stdout);return r.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:r})}function NY(){let t=Wp("codex",["debug","models"],{encoding:"utf-8",timeout:IY});return{status:t.status,stdout:t.stdout??"",error:t.error}}function AY(t){let e;try{e=JSON.parse(t)}catch{return}let n=e.models;if(!Array.isArray(n))return;let r=[];for(let s of n){if(!s||typeof s!="object")continue;let{slug:i,visibility:o}=s;typeof i=="string"&&o==="list"&&r.push(i)}return r}function xY(t){if(!t&&jp)return jp;let e=s=>(t||(jp=s),s),n;try{n=(t??NY)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?ys("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:ys("codex debug models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`codex debug models exited with status ${n.status??"unknown"}`});let r=AY(n.stdout);return r===void 0?e({available:!1,models:[],reason:"codex debug models did not return parseable JSON"}):r.length===0?e({available:!1,models:[],reason:"codex debug models returned no user-visible models"}):e({available:!0,models:r})}function OY(t){let e=Wp("opencode",["models",t],{encoding:"utf-8",timeout:RY});return{status:e.status,stdout:e.stdout??"",error:e.error}}function LY(t,e){if(!e&&Pp.has(t))return Pp.get(t);let n=i=>(e||Pp.set(t,i),i),r;try{r=(e??OY)(t)}catch(i){return n({available:!1,models:[],reason:i instanceof Error?ys(`opencode models ${t}`,i):`opencode models ${t} could not be run: ${String(i)}`})}if(r.error)return n({available:!1,models:[],reason:ys(`opencode models ${t}`,r.error)});if(r.status!==0)return n({available:!1,models:[],reason:`opencode models ${t} exited with status ${r.status??"unknown"}`});let s=r.stdout.split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0);return s.length===0?n({available:!1,models:[],reason:`opencode models ${t} returned no models`}):n({available:!0,models:s})}function Hp(t,e={}){let n=[],r=CY(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&n.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&n.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;n.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){n.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&n.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){n.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=WY(e.opencodeConfigPath);if(!a.available){n.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let u=a.models.filter(d=>d.endsWith(`/${s.model}`));n.push(u.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${u.join(" / ")}; set model=${u[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}let l=s.model.slice(0,s.model.indexOf("/")),c=LY(l,e.opencodeModelsRunner);if(c.available&&c.models.includes(s.model))continue;if(c.available&&!c.models.includes(s.model)){n.push(`[${s.alias}] model="${s.model}" was not found in opencode's LOCALLY-VISIBLE live catalog for "${l}" (checked \`opencode models ${l}\`) -- this is unresolved, not a confirmed unavailability: it could mean opencode genuinely doesn't serve this model, OR that your local catalog/auth for "${l}" is stale/incomplete. Declaring it in opencode.json may or may not help; if it doesn't, check whether a non-opencode provider serves this model directly (e.g. \`lmctl lint\` with model= against provider=codex/claude/gemini/agy).`);continue}n.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(i==="kimi"){if(!s.model)continue;let a=FY(e.kimiConfigPath);a.available?a.models.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not declared in Kimi's [models] config. Valid configured models: ${hs(a.models)}`):n.push(`[${s.alias}] model="${s.model}" cannot be verified for kimi: ${a.reason}.`);continue}if(i==="agy"){if(!s.model)continue;let a=kY(e.agyModelsRunner);a.available?a.models.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${hs(a.models)}`):n.push(`[${s.alias}] model="${s.model}" cannot be verified for agy: ${a.reason}.`);continue}if(i==="dsh"){if(!s.model||lx.includes(s.model))continue;ax.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in dsh's built-in catalog. Valid pinned models: ${hs(ax)}. Valid server-resolved aliases (DeepSeek resolves these to its current model server-side -- pinning to a specific version instead is a DOWNGRADE, not a safer choice): ${hs(lx)}. The catalog is patchable via dsh profile overlays \u2014 a model added that way warns here even though it may resolve.`);continue}if(i==="hermes"){if(!s.model)continue;let a=s.model.indexOf(":");(a<=0||a===s.model.length-1)&&n.push(`[${s.alias}] model="${s.model}" should use <provider>:<model> from Hermes's ACP catalog. lmctl checks the shape only; provider and model availability are resolved by Hermes.`);continue}if(i==="codex"){if(!s.model)continue;s.model===cx&&n.push(`[${s.alias}] model="${cx}" is banned as a build model (operator, 2026-09-06) -- it's a fast/cheap classification model, not intended for build work, and there's no cost reason left to reach for it. Use model=gpt-5.6-sol (or leave model= unset) for build work; if this member genuinely does non-build/classification work, this warning can be ignored.`);let a=xY(e.codexModelsRunner);if(!a.available){n.push(`[${s.alias}] model="${s.model}" cannot be verified for codex: ${a.reason}.`);continue}a.models.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in codex's live model catalog (\`codex debug models\`). Valid models: ${hs(a.models)}`);continue}if(!s.model)continue;let o=r.get(i);if(!o){n.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(nc??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${hs(o)}`)}return n}function CY(t){if(!t&&ji)return ji;let e=new Map,n,r=t??$Y();if(!gs(r))return n=`${r} not found`,t||Fp(e),t||(ji=e),t||(nc=n),e;let s;try{s=qp(r,"utf-8")}catch(i){return n=`${r} could not be read: ${i instanceof Error?i.message:String(i)}`,t||Fp(e),t||(ji=e),t||(nc=n),e}for(let[i,o]of Object.entries(EY)){let a=jY(s,o),l=PY(a);l.length>0&&e.set(i,l)}return e.size===0&&(n=`${r} has no tested model rows`),!t&&e.size===0&&Fp(e),t||(ji=e),t||(nc=n),e}function $Y(){return MY(ux(wY(import.meta.url)))}function MY(t){let e=DY(t);if(e){let r=Gn(e,"durable-memory","model_selection.md");if(gs(r))return r}let n=[Gn(t,"..","..","durable-memory","model_selection.md"),Gn(t,"..","..","..","durable-memory","model_selection.md")];for(let r of n)if(gs(r))return r;return n[n.length-1]}function DY(t){let e=Gn(t);for(;;){if(gs(Gn(e,"package.json")))return e;let n=ux(e);if(n===e)return null;e=n}}function Fp(t){for(let[e,n]of Object.entries(TY))t.set(e,n)}function jY(t,e){let r=new RegExp(`^## ${HY(e)}\\s*$`,"m").exec(t);if(!r)return"";let s=r.index+r[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function PY(t){let e=new Set;for(let n of t.split(/\r?\n/)){let r=n.trim();if(!r.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(r);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function FY(t){let e=process.env.KIMI_CODE_HOME||Gn(dx(),".kimi-code"),n=t??Gn(e,"config.toml");if(!gs(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=qp(n,"utf-8")}catch(i){return{available:!1,models:[],reason:`${n} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of r.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=UY(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s].sort()}}function UY(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function WY(t){let e=t??Gn(dx(),".config","opencode","opencode.json");if(!gs(e))return{available:!0,models:[]};let n;try{n=JSON.parse(qp(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:qY(n)}}function qY(t){if(!Up(t))return[];let e=tc(t.provider)??tc(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!Up(s))continue;let i=tc(s.models)??tc(s.model);if(i)for(let o of Object.keys(i))n.add(o.startsWith(`${r}/`)?o:`${r}/${o}`)}return[...n].sort()}function tc(t){return Up(t)?t:null}function Up(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function hs(t){return t.length>0?t.join(", "):"(none)"}function HY(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var EY,ax,lx,cx,TY,vY,Dp,IY,jp,RY,Pp,ji,nc,fx=E(()=>{"use strict";EY={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen"},ax=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],lx=["deepseek-flash","deepseek-pro"],cx="gpt-5.3-codex-spark",TY={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-opus-5","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5","claude-fable-5-1"],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"]},vY=15e3;Dp=null;IY=5e3;jp=null;RY=5e3;Pp=new Map;ji=null});import{homedir as BY}from"node:os";import{basename as XY}from"node:path";function rc(t,e){let n=new Set;return{text:t.replace(GY,(s,i)=>{let o=i.trim(),a=JY[o];return a===void 0?(n.add(o),s):a(e)}),unknownNames:[...n].sort()}}function sc(t){return{workdir:t.workdir,teamfile:t.teamfile,date:KY(t.date)}}function KY(t){return t.toISOString().slice(0,10)}var JY,GY,Bp=E(()=>{"use strict";JY={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=XY(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>BY(),date:t=>t.date},GY=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Ui={};oe(Ui,{GEMINI_PROVIDER_NOTICE:()=>hx,_setAgyModelsRunnerForTests:()=>t3,_setCodexModelsRunnerForTests:()=>n3,_setLintOpenCodeConfigProbeForTests:()=>i3,_setLintSessiondirFsOpsForTests:()=>s3,_setTeamfileSeedForTests:()=>r3,buildRootTeamRegistrationRow:()=>Tx,registerRootTeam:()=>vx,runHire:()=>m3,runLint:()=>f3,runRefresh:()=>p3,runSeed:()=>wx,sha256Text:()=>Ex});import{createHash as VY}from"node:crypto";import{accessSync as YY,constants as mx,existsSync as zY,readFileSync as ac,realpathSync as Gp,statSync as ZY,writeFileSync as oc}from"node:fs";import{dirname as Tr,resolve as _x}from"node:path";function t3(t){zp=t??void 0}function n3(t){Zp=t??void 0}function r3(t){gx=t??(async e=>{let{seed:n}=await Promise.resolve().then(()=>(gt(),pu)),r=await n(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}})}function s3(t){Er=t===null?Kp:{...Kp,...t}}function i3(t){yx=t??od}async function o3(t,e,n){let r=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(r.map(async i=>({member:i,result:await yx({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function a3(t,e){let n=Tr(e),r=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??n,a=_x(o);if(r.has(a))continue;let l=l3(a);l!==void 0&&(r.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function l3(t){try{if(Er.existsSync(t)){if(!Er.statSync(t).isDirectory())return"ENOTDIR";Er.accessSync(t,mx.W_OK);return}let e=d3(t);if(e===void 0)return;if(!Er.statSync(e).isDirectory())return"ENOTDIR";Er.accessSync(e,mx.W_OK);return}catch(e){return u3(e)??"permission check failed"}}function c3(t){let e=_x(t);try{return Gp(e)}catch{return e}}function d3(t){let e=t;for(;;){try{if(Er.existsSync(e))return e}catch{return}let n=Tr(e);if(n===e)return;e=n}}function u3(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 f3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(QY),0;let n=Y(t,[],["--strict"]);if(n.error!==void 0)return e.stderr.write(`error: ${n.error}
3183
+ List native provider sessions in scope, or list recent managed runs with --runs.`,pY=50,sx=500});import{spawnSync as Wp}from"node:child_process";import{existsSync as gs,readFileSync as qp}from"node:fs";import{homedir as dx}from"node:os";import{dirname as ux,resolve as Gn}from"node:path";import{fileURLToPath as wY}from"node:url";function ys(t,e){return e.code==="ETIMEDOUT"?`${t} did not respond within lint's own spawn timeout (${e.message}) \u2014 this does not mean the provider itself is unreachable, only that this specific check didn't finish in time.`:`${t} could not be run: ${e.message}`}function SY(){let t=Wp("agy",["models"],{encoding:"utf-8",timeout:vY});return{status:t.status,stdout:t.stdout??"",error:t.error}}function bY(t){let e=[];for(let n of t.split(/\r?\n/)){let r=n.trim(),s=r.indexOf(" ");if(s<0)continue;let i=r.slice(s+1).trim();i&&e.push(i)}return e}function kY(t){if(!t&&Dp)return Dp;let e=s=>(t||(Dp=s),s),n;try{n=(t??SY)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?ys("agy models",s):`agy models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:ys("agy models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${n.status??"unknown"}`});let r=bY(n.stdout);return r.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:r})}function NY(){let t=Wp("codex",["debug","models"],{encoding:"utf-8",timeout:IY});return{status:t.status,stdout:t.stdout??"",error:t.error}}function AY(t){let e;try{e=JSON.parse(t)}catch{return}let n=e.models;if(!Array.isArray(n))return;let r=[];for(let s of n){if(!s||typeof s!="object")continue;let{slug:i,visibility:o}=s;typeof i=="string"&&o==="list"&&r.push(i)}return r}function xY(t){if(!t&&jp)return jp;let e=s=>(t||(jp=s),s),n;try{n=(t??NY)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?ys("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:ys("codex debug models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`codex debug models exited with status ${n.status??"unknown"}`});let r=AY(n.stdout);return r===void 0?e({available:!1,models:[],reason:"codex debug models did not return parseable JSON"}):r.length===0?e({available:!1,models:[],reason:"codex debug models returned no user-visible models"}):e({available:!0,models:r})}function OY(t){let e=Wp("opencode",["models",t],{encoding:"utf-8",timeout:RY});return{status:e.status,stdout:e.stdout??"",error:e.error}}function LY(t,e){if(!e&&Pp.has(t))return Pp.get(t);let n=i=>(e||Pp.set(t,i),i),r;try{r=(e??OY)(t)}catch(i){return n({available:!1,models:[],reason:i instanceof Error?ys(`opencode models ${t}`,i):`opencode models ${t} could not be run: ${String(i)}`})}if(r.error)return n({available:!1,models:[],reason:ys(`opencode models ${t}`,r.error)});if(r.status!==0)return n({available:!1,models:[],reason:`opencode models ${t} exited with status ${r.status??"unknown"}`});let s=r.stdout.split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0);return s.length===0?n({available:!1,models:[],reason:`opencode models ${t} returned no models`}):n({available:!0,models:s})}function Hp(t,e={}){let n=[],r=CY(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&n.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&n.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;n.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){n.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&n.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){n.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=WY(e.opencodeConfigPath);if(!a.available){n.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let u=a.models.filter(d=>d.endsWith(`/${s.model}`));n.push(u.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${u.join(" / ")}; set model=${u[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}let l=s.model.slice(0,s.model.indexOf("/")),c=LY(l,e.opencodeModelsRunner);if(c.available&&c.models.includes(s.model))continue;if(c.available&&!c.models.includes(s.model)){n.push(`[${s.alias}] model="${s.model}" was not found in opencode's LOCALLY-VISIBLE live catalog for "${l}" (checked \`opencode models ${l}\`) -- this is unresolved, not a confirmed unavailability: it could mean opencode genuinely doesn't serve this model, OR that your local catalog/auth for "${l}" is stale/incomplete. Declaring it in opencode.json may or may not help; if it doesn't, check whether a non-opencode provider serves this model directly (e.g. \`lmctl lint\` with model= against provider=codex/claude/gemini/agy).`);continue}n.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(i==="kimi"){if(!s.model)continue;let a=FY(e.kimiConfigPath);a.available?a.models.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not declared in Kimi's [models] config. Valid configured models: ${hs(a.models)}`):n.push(`[${s.alias}] model="${s.model}" cannot be verified for kimi: ${a.reason}.`);continue}if(i==="agy"){if(!s.model)continue;let a=kY(e.agyModelsRunner);a.available?a.models.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${hs(a.models)}`):n.push(`[${s.alias}] model="${s.model}" cannot be verified for agy: ${a.reason}.`);continue}if(i==="dsh"){if(!s.model||lx.includes(s.model))continue;ax.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in dsh's built-in catalog. Valid pinned models: ${hs(ax)}. Valid server-resolved aliases (DeepSeek resolves these to its current model server-side -- pinning to a specific version instead is a DOWNGRADE, not a safer choice): ${hs(lx)}. The catalog is patchable via dsh profile overlays \u2014 a model added that way warns here even though it may resolve.`);continue}if(i==="hermes"){if(!s.model)continue;let a=s.model.indexOf(":");(a<=0||a===s.model.length-1)&&n.push(`[${s.alias}] model="${s.model}" should use <provider>:<model> from Hermes's ACP catalog. lmctl checks the shape only; provider and model availability are resolved by Hermes.`);continue}if(i==="codex"){if(!s.model)continue;s.model===cx&&n.push(`[${s.alias}] model="${cx}" is banned as a build model (operator, 2026-09-06) -- it's a fast/cheap classification model, not intended for build work, and there's no cost reason left to reach for it. Use model=gpt-5.6-sol (or leave model= unset) for build work; if this member genuinely does non-build/classification work, this warning can be ignored.`);let a=xY(e.codexModelsRunner);if(!a.available){n.push(`[${s.alias}] model="${s.model}" cannot be verified for codex: ${a.reason}.`);continue}a.models.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in codex's live model catalog (\`codex debug models\`). Valid models: ${hs(a.models)}`);continue}if(!s.model)continue;let o=r.get(i);if(!o){n.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(nc??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${hs(o)}`)}return n}function CY(t){if(!t&&ji)return ji;let e=new Map,n,r=t??$Y();if(!gs(r))return n=`${r} not found`,t||Fp(e),t||(ji=e),t||(nc=n),e;let s;try{s=qp(r,"utf-8")}catch(i){return n=`${r} could not be read: ${i instanceof Error?i.message:String(i)}`,t||Fp(e),t||(ji=e),t||(nc=n),e}for(let[i,o]of Object.entries(EY)){let a=jY(s,o),l=PY(a);l.length>0&&e.set(i,l)}return e.size===0&&(n=`${r} has no tested model rows`),!t&&e.size===0&&Fp(e),t||(ji=e),t||(nc=n),e}function $Y(){return MY(ux(wY(import.meta.url)))}function MY(t){let e=DY(t);if(e){let r=Gn(e,"durable-memory","model_selection.md");if(gs(r))return r}let n=[Gn(t,"..","..","durable-memory","model_selection.md"),Gn(t,"..","..","..","durable-memory","model_selection.md")];for(let r of n)if(gs(r))return r;return n[n.length-1]}function DY(t){let e=Gn(t);for(;;){if(gs(Gn(e,"package.json")))return e;let n=ux(e);if(n===e)return null;e=n}}function Fp(t){for(let[e,n]of Object.entries(TY))t.set(e,n)}function jY(t,e){let r=new RegExp(`^## ${HY(e)}\\s*$`,"m").exec(t);if(!r)return"";let s=r.index+r[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function PY(t){let e=new Set;for(let n of t.split(/\r?\n/)){let r=n.trim();if(!r.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(r);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function FY(t){let e=process.env.KIMI_CODE_HOME||Gn(dx(),".kimi-code"),n=t??Gn(e,"config.toml");if(!gs(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=qp(n,"utf-8")}catch(i){return{available:!1,models:[],reason:`${n} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of r.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=UY(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s].sort()}}function UY(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function WY(t){let e=t??Gn(dx(),".config","opencode","opencode.json");if(!gs(e))return{available:!0,models:[]};let n;try{n=JSON.parse(qp(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:qY(n)}}function qY(t){if(!Up(t))return[];let e=tc(t.provider)??tc(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!Up(s))continue;let i=tc(s.models)??tc(s.model);if(i)for(let o of Object.keys(i))n.add(o.startsWith(`${r}/`)?o:`${r}/${o}`)}return[...n].sort()}function tc(t){return Up(t)?t:null}function Up(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function hs(t){return t.length>0?t.join(", "):"(none)"}function HY(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var EY,ax,lx,cx,TY,vY,Dp,IY,jp,RY,Pp,ji,nc,fx=E(()=>{"use strict";EY={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen"},ax=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],lx=["deepseek-flash","deepseek-pro"],cx="gpt-5.3-codex-spark",TY={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-opus-5","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5","claude-fable-5-1"],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"]},vY=15e3;Dp=null;IY=5e3;jp=null;RY=5e3;Pp=new Map;ji=null});import{homedir as BY}from"node:os";import{basename as XY}from"node:path";function rc(t,e){let n=new Set;return{text:t.replace(GY,(s,i)=>{let o=i.trim(),a=JY[o];return a===void 0?(n.add(o),s):a(e)}),unknownNames:[...n].sort()}}function sc(t){return{workdir:t.workdir,teamfile:t.teamfile,date:KY(t.date)}}function KY(t){return t.toISOString().slice(0,10)}var JY,GY,Bp=E(()=>{"use strict";JY={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=XY(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>BY(),date:t=>t.date},GY=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Ui={};oe(Ui,{GEMINI_PROVIDER_NOTICE:()=>hx,_setAgyModelsRunnerForTests:()=>t3,_setCodexModelsRunnerForTests:()=>n3,_setLintOpenCodeConfigProbeForTests:()=>i3,_setLintSessiondirFsOpsForTests:()=>s3,_setTeamfileSeedForTests:()=>r3,buildRootTeamRegistrationRow:()=>Tx,registerRootTeam:()=>vx,runHire:()=>m3,runLint:()=>f3,runRefresh:()=>p3,runSeed:()=>wx,sha256Text:()=>Ex});import{createHash as VY}from"node:crypto";import{accessSync as YY,constants as mx,existsSync as zY,readFileSync as ac,realpathSync as Gp,statSync as ZY,writeFileSync as oc}from"node:fs";import{dirname as Tr,resolve as _x}from"node:path";function t3(t){zp=t??void 0}function n3(t){Zp=t??void 0}function r3(t){gx=t??(async e=>{let{seed:n}=await Promise.resolve().then(()=>(ht(),pu)),r=await n(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}})}function s3(t){Er=t===null?Kp:{...Kp,...t}}function i3(t){yx=t??od}async function o3(t,e,n){let r=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(r.map(async i=>({member:i,result:await yx({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function a3(t,e){let n=Tr(e),r=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??n,a=_x(o);if(r.has(a))continue;let l=l3(a);l!==void 0&&(r.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function l3(t){try{if(Er.existsSync(t)){if(!Er.statSync(t).isDirectory())return"ENOTDIR";Er.accessSync(t,mx.W_OK);return}let e=d3(t);if(e===void 0)return;if(!Er.statSync(e).isDirectory())return"ENOTDIR";Er.accessSync(e,mx.W_OK);return}catch(e){return u3(e)??"permission check failed"}}function c3(t){let e=_x(t);try{return Gp(e)}catch{return e}}function d3(t){let e=t;for(;;){try{if(Er.existsSync(e))return e}catch{return}let n=Tr(e);if(n===e)return;e=n}}function u3(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 f3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(QY),0;let n=Y(t,[],["--strict"]);if(n.error!==void 0)return e.stderr.write(`error: ${n.error}
3184
3184
  `),2;if(n.positionals.length!==1)return e.stderr.write(`usage: lmctl lint [--strict] <teamfile.lmctl>
3185
- `),2;let r=n.flags["--strict"]===!0,s=n.positionals[0],i;try{i=await $(e,d=>be(s,d))}catch(d){return We(e,`${s}: ${d instanceof Error?d.message:String(d)}`)}let o;try{o=$e(i)}catch(d){return We(e,`${s}: ${d instanceof Error?d.message:String(d)}`)}let a=em(o,Tr(i)),l=Hp(o.members,{agyModelsRunner:zp,codexModelsRunner:Zp}),c=ac(i,"utf8"),u=rc(c,sc({workdir:Tr(i),teamfile:i,date:new Date})).unknownNames;u.length>0&&l.push(`unknown template placeholder${u.length===1?"":"s"}: ${u.map(d=>`{{${d}}}`).join(", ")}`),l.push(...nd(o.members,Tr(i))),l.push(...a3(o.members,i)),l.push(...await o3(o.members,Tr(i),e.env));for(let d of a)e.stderr.write(`error: ${d.field}: ${d.message}
3185
+ `),2;let r=n.flags["--strict"]===!0,s=n.positionals[0],i;try{i=await $(e,d=>be(s,d))}catch(d){return qe(e,`${s}: ${d instanceof Error?d.message:String(d)}`)}let o;try{o=$e(i)}catch(d){return qe(e,`${s}: ${d instanceof Error?d.message:String(d)}`)}let a=em(o,Tr(i)),l=Hp(o.members,{agyModelsRunner:zp,codexModelsRunner:Zp}),c=ac(i,"utf8"),u=rc(c,sc({workdir:Tr(i),teamfile:i,date:new Date})).unknownNames;u.length>0&&l.push(`unknown template placeholder${u.length===1?"":"s"}: ${u.map(d=>`{{${d}}}`).join(", ")}`),l.push(...nd(o.members,Tr(i))),l.push(...a3(o.members,i)),l.push(...await o3(o.members,Tr(i),e.env));for(let d of a)e.stderr.write(`error: ${d.field}: ${d.message}
3186
3186
  `);for(let d of o.members)Yp([d],e),d.session!==void 0&&d.session.length<Pi&&l.push(`${d.alias}: sessionid is shorter than ${Pi} chars; run lmctl seed to refresh it`);for(let d of l)e.stderr.write(`warning: ${d}
3187
3187
  `);return a.length>0||r&&l.length>0?1:(e.stdout.write(`ok
3188
3188
  `),0)}async function wx(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(e3),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
3189
- `),2;let n=t[0],r;try{r=await $(e,_=>be(n,_))}catch(_){return We(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Gp(r)}catch(_){return We(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let i=Tr(r),o;try{o=$e(r)}catch(_){return We(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let l=ac(r,"utf8").split(`
3189
+ `),2;let n=t[0],r;try{r=await $(e,_=>be(n,_))}catch(_){return qe(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Gp(r)}catch(_){return qe(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let i=Tr(r),o;try{o=$e(r)}catch(_){return qe(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let l=ac(r,"utf8").split(`
3190
3190
  `),c=g3(l),u=em(o,i);if(u.length>0){Yp(o.members,e);for(let _ of u)e.stderr.write(`error: ${_.field}: ${_.message}
3191
3191
  `);return 1}try{ls(e,o,r)}catch{}Yp(o.members,e);for(let _ of Hp(o.members,{agyModelsRunner:zp,codexModelsRunner:Zp}))e.stderr.write(`warning: ${_}
3192
3192
  `);for(let _ of nd(o.members,i))e.stderr.write(`warning: ${_}
@@ -3200,10 +3200,10 @@ List native provider sessions in scope, or list recent managed runs with --runs.
3200
3200
  `),"utf8"),e.stdout.write(`${_.alias}: seeded ${g.sessionId} provider=${_.provider} sessiondir=${T}
3201
3201
  `)}let m=l.join(`
3202
3202
  `),p=S3(m,Gp(r));p!==m&&oc(r,p,"utf8"),d===0&&e.stdout.write(`no members needed seeding
3203
- `);let h=new Date().toISOString();try{await $(e,_=>{vx(_,{teamfilePath:s,name:o.name,rawText:p,now:h})})}catch(_){return We(e,_ instanceof Error?_.message:String(_))}return 0}async function m3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ic),0;let n=Y(t,["--provider","--sessiondir"],[]);if(n.error!==void 0)return Jp(e,n.error,ic);if(n.positionals.length!==2)return Jp(e,"expected <teamfile.lmctl> and <alias>",ic);let[r,s]=n.positionals;if(!E3(s))return We(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return We(e,"hire only applies to non-Lead members");let i=M(n,"--provider");if(i===void 0)return Jp(e,"missing value for --provider",ic);if(!Sx(i))return We(e,`invalid provider "${i}"`);let o;try{o=await $(e,d=>be(r,d))}catch(d){return We(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=ac(o,"utf8")}catch(d){return We(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}if(w3(a,s))return We(e,`${s}: alias already exists in ${o}`);let l=M(n,"--sessiondir"),c=[`_MEMBER_ alias=${Vp(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${Vp(l)}`]].join(" "),u=v3(a,c);return oc(o,u,"utf8"),e.stdout.write(`Hired ${s} (${i}) -> ${o}
3203
+ `);let h=new Date().toISOString();try{await $(e,_=>{vx(_,{teamfilePath:s,name:o.name,rawText:p,now:h})})}catch(_){return qe(e,_ instanceof Error?_.message:String(_))}return 0}async function m3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ic),0;let n=Y(t,["--provider","--sessiondir"],[]);if(n.error!==void 0)return Jp(e,n.error,ic);if(n.positionals.length!==2)return Jp(e,"expected <teamfile.lmctl> and <alias>",ic);let[r,s]=n.positionals;if(!E3(s))return qe(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return qe(e,"hire only applies to non-Lead members");let i=M(n,"--provider");if(i===void 0)return Jp(e,"missing value for --provider",ic);if(!Sx(i))return qe(e,`invalid provider "${i}"`);let o;try{o=await $(e,d=>be(r,d))}catch(d){return qe(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=ac(o,"utf8")}catch(d){return qe(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}if(w3(a,s))return qe(e,`${s}: alias already exists in ${o}`);let l=M(n,"--sessiondir"),c=[`_MEMBER_ alias=${Vp(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${Vp(l)}`]].join(" "),u=v3(a,c);return oc(o,u,"utf8"),e.stdout.write(`Hired ${s} (${i}) -> ${o}
3204
3204
  `),e.stdout.write(`Run: lmctl seed ${o}
3205
- `),0}async function p3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Xp),0;let n,r;if(t.length===1){let d=pr(t[0]);if(d===null)return e.stderr.write(Xp),2;n=d.teamfile,r=d.alias}else if(t.length===2)[n,r]=t;else return e.stderr.write(Xp),2;let s;try{s=await $(e,d=>be(n,d))}catch(d){return We(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let i;try{i=ac(s,"utf8")}catch(d){return We(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let o=i.split(`
3206
- `),a=y3(o,r);if(a===void 0)return We(e,`${r}: no active _MEMBER_ entry found`);let l=o[a];if(Fi(l,"teamfile")!==void 0)return We(e,`${r}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[Ds],u=Fi(l,"sessionid");return c!==void 0&&c.length>0&&u===c?We(e,`${r}: cannot refresh its own running session \u2014 run this refresh from a different member session or a plain operator shell.`):(o[a]=T3(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),oc(s,o.join(`
3205
+ `),0}async function p3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Xp),0;let n,r;if(t.length===1){let d=pr(t[0]);if(d===null)return e.stderr.write(Xp),2;n=d.teamfile,r=d.alias}else if(t.length===2)[n,r]=t;else return e.stderr.write(Xp),2;let s;try{s=await $(e,d=>be(n,d))}catch(d){return qe(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let i;try{i=ac(s,"utf8")}catch(d){return qe(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let o=i.split(`
3206
+ `),a=y3(o,r);if(a===void 0)return qe(e,`${r}: no active _MEMBER_ entry found`);let l=o[a];if(Fi(l,"teamfile")!==void 0)return qe(e,`${r}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[Ds],u=Fi(l,"sessionid");return c!==void 0&&c.length>0&&u===c?qe(e,`${r}: cannot refresh its own running session \u2014 run this refresh from a different member session or a plain operator shell.`):(o[a]=T3(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),oc(s,o.join(`
3207
3207
  `),"utf8"),wx([s],e))}function Ex(t){return VY("sha256").update(t).digest("hex")}function Tx(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:Ex(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function vx(t,e){let n=hl(e.rawText,e.teamfilePath);rm(t,e.teamfilePath,n);let r=Tx(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function _3(t,e,n){let r=n.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=r.length>0?r.join(`
3208
3208
  `):"- (no non-Lead members)",i=n.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=h3(i,t);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${t}" <alias> "your task here"`,"- SAFE INPUT \u2014 use for ANYTHING non-trivial. A prompt typed into the command line is expanded by YOUR shell first,"," so backticks, $(...), $VAR and quotes are executed or stripped out of the message before lmctl sees it."," If the text contains backticks, quotes, $, newlines, or ANY relayed/pasted/quoted content, do NOT put it in the command.",` Write it to a file with your file-writing tool (NOT echo/heredoc \u2014 those are shell too), then: lmctl chat "${t}" <alias> --prompt-file <path>`,"- lmctl is foreground/background agnostic. Use your provider or host runtime for async command handling when it supports that.","- For delegation, run the lmctl chat command above. If your runtime has a tracked background mode, it may wrap that same blocking command, but check the result with --json or lmctl status.","- Busy receiver ENQUEUES. lmctl chat exits 0 for BOTH delivered and enqueued, so exit code alone CANNOT tell you a reply arrived.",'- lmctl chat ... --json is machine-readable: status="ok" is a delivered reply (with replyText); status="enqueued" (plus path="enqueued") means it was queued, and carries id/sender/receiver.',"- lmctl status shows your identity, members with busy/idle, mail queued TO and FROM you, and why a receiver is busy. Run it when you are unsure whether a delegation landed.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the lmctl chat command above. lmctl exposes no delegation tool you should use \u2014 delegate with lmctl chat.","","Team members:",s,"","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 session \u2014 run it from a different member session or a plain operator shell.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, use lmctl chat.)","","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(`
3209
3209
  `)}function h3(t,e){let n=`lmctl chat "${e}" <alias> "your task here"`;switch(t.toLowerCase()){case"claude":return`- Claude tip: run the blocking command (${n}) as background Bash (run_in_background: true); the runtime re-invokes you with the reply when it completes.`;case"copilot":return`- Copilot tip: run the blocking command (${n}) via bash async mode (mode:"async"); the runtime notifies you with output when it completes.`;case"agy":return`- Antigravity tip: run the blocking command (${n}) via run_command with WaitMsBeforeAsync: 0 (Background Tasks); agy wakes you with the output when it completes.`;case"qwen":return`- Qwen tip: run the blocking command (${n}) via the monitor tool; it notifies you on completion.`;case"codex":return"- Codex note: run lmctl chat as the blocking delegation primitive; use Codex-native tool/background behavior when available.";case"gemini":return"- Gemini note: run lmctl chat as the blocking delegation primitive; use Gemini-native tool/background behavior when available.";case"opencode":return"- OpenCode note: use the provider-native background/task surface when available; otherwise run one blocking lmctl chat turn and wait.";case"kimi":return"- Kimi note: use Kimi native background tools when available; otherwise run one blocking lmctl chat turn and wait.";default:return"- If your provider has native background completion, use it around the blocking command; otherwise run one blocking lmctl chat turn at a time."}}function g3(t){let e=new Map;for(let n=0;n<t.length;n+=1){let r=t[n];if(!/^\s*_MEMBER_\s+\S/.test(r))continue;let s=Fi(r,"alias");s!==void 0&&e.set(s.toLowerCase(),n)}return e}function y3(t,e){let n=e.toLowerCase();for(let r=0;r<t.length;r+=1){let s=t[r];if(/^\s*_MEMBER_\s+\S/u.test(s)&&Fi(s,"alias")?.toLowerCase()===n)return r}}function w3(t,e){for(let n of t.split(`
@@ -3220,11 +3220,11 @@ ${o}`:`
3220
3220
  ${i}`:`${n}
3221
3221
  `:t.length>0?`${n}
3222
3222
  ${t}`:`${n}
3223
- `}function Sx(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="lmplayer"||t==="qwen"||t==="agy"||t==="kimi"||t==="dsh"||t==="hermes"||t==="ClaudeMock"}function We(t,e){return t.stderr.write(`error: ${e}
3223
+ `}function Sx(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="lmplayer"||t==="qwen"||t==="agy"||t==="kimi"||t==="dsh"||t==="hermes"||t==="ClaudeMock"}function qe(t,e){return t.stderr.write(`error: ${e}
3224
3224
  `),1}function Jp(t,e,n){return t.stderr.write(`error: ${e}
3225
3225
  ${n}`),2}function Yp(t,e){for(let n of t)n.teamfile!==void 0&&e.stderr.write(`warning: member "${n.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
3226
3226
  `),n.provider==="gemini"&&e.stderr.write(`${hx.replace("%s",n.alias)}
3227
- `)}var Pi,QY,e3,ic,Xp,hx,Kp,gx,Er,yx,zp,Zp,Wi=E(()=>{"use strict";Dt();fx();vo();At();ad();Ie();vt();en();Bp();Ii();Pi=5,QY=`usage: lmctl lint [--strict] <teamfile.lmctl>
3227
+ `)}var Pi,QY,e3,ic,Xp,hx,Kp,gx,Er,yx,zp,Zp,Wi=E(()=>{"use strict";Dt();fx();vo();At();ad();Ie();Tt();en();Bp();Ii();Pi=5,QY=`usage: lmctl lint [--strict] <teamfile.lmctl>
3228
3228
 
3229
3229
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
3230
3230
  For opencode members with model=, lint also asks the local ACP provider to
@@ -3257,7 +3257,7 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
3257
3257
  re-seed.
3258
3258
  A member cannot refresh its own running session; run the refresh from a
3259
3259
  different member session or a plain operator shell.
3260
- `,hx='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Kp={existsSync:zY,statSync:ZY,accessSync:YY},gx=async t=>{let{seed:e}=await Promise.resolve().then(()=>(gt(),pu)),n=await e(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}},Er=Kp,yx=od});var xx={};oe(xx,{runClone:()=>O3});import{existsSync as Qp,mkdirSync as b3,readFileSync as k3,readdirSync as I3,statSync as Nx,writeFileSync as N3}from"node:fs";import{basename as bx,dirname as A3,extname as x3,join as Ax,resolve as kx}from"node:path";async function O3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(R3),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
3260
+ `,hx='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Kp={existsSync:zY,statSync:ZY,accessSync:YY},gx=async t=>{let{seed:e}=await Promise.resolve().then(()=>(ht(),pu)),n=await e(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}},Er=Kp,yx=od});var xx={};oe(xx,{runClone:()=>O3});import{existsSync as Qp,mkdirSync as b3,readFileSync as k3,readdirSync as I3,statSync as Nx,writeFileSync as N3}from"node:fs";import{basename as bx,dirname as A3,extname as x3,join as Ax,resolve as kx}from"node:path";async function O3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(R3),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
3261
3261
  `),2;let[n,r]=t,s,i=n;try{if(/^http:\/\//i.test(n))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(n))s=await C3(n);else{let c=kx(n);if(!Qp(c))throw new Error(`source not found: ${n}`);let d=Nx(c).isDirectory()?$3(c):c;s=k3(d,"utf8"),i=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
3262
3262
  `),1}let o=kx(r),a=M3(o,i,r);if(Qp(a))return e.stderr.write(`error: ${a} already exists.
3263
3263
  `),1;let l=j3(D3(s));return b3(A3(a),{recursive:!0}),N3(a,l,"utf8"),e.stdout.write(`Cloned ${n} -> ${a}
@@ -3278,11 +3278,11 @@ Examples:
3278
3278
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
3279
3279
  lmctl clone ./backend/ ./backend-v2/backend-v2.lmctl
3280
3280
  lmctl clone https://example.com/backend.lmctl ./backend-v2/backend-v2.lmctl
3281
- `;L3=new Set([301,302,303,307,308]),Ix=10});var Ox,Lx=E(()=>{"use strict";Ox=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","ClaudeMock"])});var Fx={};oe(Fx,{runRestoreTeamfile:()=>G3});import{randomUUID as P3}from"node:crypto";import{existsSync as Dx,linkSync as F3,lstatSync as U3,mkdirSync as W3,realpathSync as q3,renameSync as H3,rmSync as B3,writeFileSync as X3}from"node:fs";import{basename as e_,dirname as t_,extname as J3,isAbsolute as jx,resolve as qi}from"node:path";async function G3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.length===1&&(t[0]==="--help"||t[0]==="-h"))return e.stdout.write(Cx),0;let r=Y(t,[],["--force","--json"]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length!==1)return k(e,Cx.trimEnd());try{return await $(e,s=>K3(r.positionals[0],B(r,"--force"),B(r,"--json"),e,s,n.now?.()??new Date))}catch(s){return Ue(e,s)}}function K3(t,e,n,r,s,i){let o=r.cwd??process.cwd(),a=V3(s,o),l=Y3(a,t,o);if(l.kind==="missing")return k(r,`no usage evidence found for teamfile ${JSON.stringify(t)} in the local event log; optional teamfile reconstruction is unavailable, but lmctl restore can still recover files from native provider sessions`);if(l.kind==="ambiguous"){let _=l.paths.map(y=>` ${y.path} (tracked_invocations=${y.invocations.length}, team_messages=${y.chats.length})`).join(`
3281
+ `;L3=new Set([301,302,303,307,308]),Ix=10});var Ox,Lx=E(()=>{"use strict";Ox=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","ClaudeMock"])});var Fx={};oe(Fx,{runRestoreTeamfile:()=>G3});import{randomUUID as P3}from"node:crypto";import{existsSync as Dx,linkSync as F3,lstatSync as U3,mkdirSync as W3,realpathSync as q3,renameSync as H3,rmSync as B3,writeFileSync as X3}from"node:fs";import{basename as e_,dirname as t_,extname as J3,isAbsolute as jx,resolve as qi}from"node:path";async function G3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.length===1&&(t[0]==="--help"||t[0]==="-h"))return e.stdout.write(Cx),0;let r=Y(t,[],["--force","--json"]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length!==1)return k(e,Cx.trimEnd());try{return await $(e,s=>K3(r.positionals[0],X(r,"--force"),X(r,"--json"),e,s,n.now?.()??new Date))}catch(s){return We(e,s)}}function K3(t,e,n,r,s,i){let o=r.cwd??process.cwd(),a=V3(s,o),l=Y3(a,t,o);if(l.kind==="missing")return k(r,`no usage evidence found for teamfile ${JSON.stringify(t)} in the local event log; optional teamfile reconstruction is unavailable, but lmctl restore can still recover files from native provider sessions`);if(l.kind==="ambiguous"){let _=l.paths.map(y=>` ${y.path} (tracked_invocations=${y.invocations.length}, team_messages=${y.chats.length})`).join(`
3282
3282
  `);return k(r,`ambiguous teamfile name ${JSON.stringify(t)}; specify one exact path:
3283
3283
  ${_}`)}let c=l.path,u=c.path,d=Dx(u);if(d&&!e)return k(r,`refusing to overwrite existing teamfile: ${u} (re-run with --force to reconstruct it from usage evidence)`);let f=e8(c);if(f.members.length===0)return k(r,`usage evidence exists for ${u}, but no member has usable latest provider/session metadata; no teamfile was written. lmctl restore can still recover files from native provider sessions`);let m=`${f.members.map(_=>_.line).join(`
3284
3284
  `)}
3285
- `;try{o8(u,m,e)}catch(_){if(_ instanceof Hi)return k(r,_.message);if(!e&&_?.code==="EEXIST")return k(r,`refusing to overwrite teamfile created during restore: ${u} (inspect it before using --force)`);throw _}let p=s8(c),h={schema_version:1,action:"restored",restored_path:u,overwrote_existing:d,members_restored:f.members.length,bytes_written:Buffer.byteLength(m,"utf8"),latest_evidence_at:p,evidence_age_ms:i8(p,i),evidence:{source:"tracked_invocation",corroboration:"team_chat_log",tracked_invocation_count:c.invocations.length,team_chat_log_count:c.chats.length},members:f.members,ignored_aliases:f.ignored,staleness_note:"Best effort: local event history may be incomplete across lmctl versions; each emitted member uses its latest tracked invocation and unreconstructable aliases are omitted."};return n?X(r,h):a8(r,h),0}function V3(t,e){let n=t.query(`
3285
+ `;try{o8(u,m,e)}catch(_){if(_ instanceof Hi)return k(r,_.message);if(!e&&_?.code==="EEXIST")return k(r,`refusing to overwrite teamfile created during restore: ${u} (inspect it before using --force)`);throw _}let p=s8(c),h={schema_version:1,action:"restored",restored_path:u,overwrote_existing:d,members_restored:f.members.length,bytes_written:Buffer.byteLength(m,"utf8"),latest_evidence_at:p,evidence_age_ms:i8(p,i),evidence:{source:"tracked_invocation",corroboration:"team_chat_log",tracked_invocation_count:c.invocations.length,team_chat_log_count:c.chats.length},members:f.members,ignored_aliases:f.ignored,staleness_note:"Best effort: local event history may be incomplete across lmctl versions; each emitted member uses its latest tracked invocation and unreconstructable aliases are omitted."};return n?J(r,h):a8(r,h),0}function V3(t,e){let n=t.query(`
3286
3286
  SELECT id, target_teamfile, target_alias, started_at, meta
3287
3287
  FROM tracked_invocation
3288
3288
  WHERE target_teamfile IS NOT NULL
@@ -3344,8 +3344,8 @@ Examples:
3344
3344
 
3345
3345
  # Same shape, codex for the Lead and Reviewer2
3346
3346
  lmctl plan ./backend --provider codex
3347
- `});import{execFileSync as y8}from"node:child_process";import{resolve as Xx}from"node:path";function w8(t){return t.filter(e=>e.state!=="retired")}function Jx(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?k(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=y8("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return k(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=Xx(s),o=e.listProjects().find(a=>Xx(a.local_path)===i);return o===void 0?k(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function Gx(t,e,n,r){if(r!==void 0){let i=e.findTeamByName(r);return i===null?k(t,`team not found: ${r}`):i}let s=e.getTeam(n.team_id);return s===null?k(t,`project ${n.name} has no assigned team; use --team <name>`):s}function Kx(t,e,n,r){if(r!==void 0){let i=e.findTeamMemberByAlias(n.id,r);return i===null||i.state==="retired"?k(t,`member not found: ${r}`):i}let s=w8(e.listTeamMembers(n.id)).find(i=>i.role==="agent");return s===void 0?k(t,`team ${n.name} has no active agent member`):s}var Vx=E(()=>{"use strict";Ie()});var Zx={};oe(Zx,{SIZE_WARN_EST_TOKENS:()=>Bi,estimateTokens:()=>zx,runTerminal:()=>S8});import{spawn as E8}from"node:child_process";import{statSync as T8}from"node:fs";async function S8(t,e){if(t.includes("--help")||t.includes("-h"))return R8(e);let n=Y(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return k(e,n.error);let r=M(n,"--run");if(r!==void 0){let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<=0||String(s)!==r)return k(e,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?B(n,o):M(n,o)!==void 0)return k(e,`--run is mutually exclusive with ${o}`);try{return await $(e,async o=>{let a=M(n,"--alias"),l=Zv(o,s,a);return"err"in l?k(e,l.err):n_(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return Ue(e,o)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?B(n,l):M(n,l)!==void 0)return k(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=n.positionals[0],o=n.positionals[1],a=Tt(v8,{target:i,alias:o,flags:{}});return a.mode==="error"?k(e,a.message):a.mode!=="ai-team"?k(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?k(e,"terminal: alias required for the teamfile target"):await $(e,l=>b8(e,a.teamfile,a.alias,l,B(n,"--json")))}try{return await $(e,async s=>{let i=N8(e,s,n);if(typeof i=="number")return i;let o=M(n,"--alias");return B(n,"--size")?x8(e,s,i,o,B(n,"--json")):A8(e,s,i,o)})}catch(s){return Ue(e,s)}}async function b8(t,e,n,r,s){let i;try{i=De(e,n,r)}catch(d){return d instanceof ve?k(t,d.message):Ue(t,d)}let o=br(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:ds()});if(!o.acquired){let d=o.current.holder_pid,f=d===null?null:Re(d)?"live":"dead",m=`${i.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at} `+(d===null?"(holder_pid=unavailable)":`(holder_pid=${d}, ${f})`);return s?(X(t,{status:"error",errorKind:"busy",message:m,holder_pid:d,holder_liveness:f}),1):k(t,m)}let a=mI({teamfile:i.teamfile,alias:i.alias}),l=null,c=null,u=null;try{r.setTerminalLock(a),c=k8(r,i),c!==null&&(process.env.LMCTL_INVOCATION_ID=String(c));let d=r.getRootTeam(i.teamfile)?.name??null;d!==null&&(process.env.LMBEE_TEAM_NAME=d),l=setInterval(()=>{try{let f=new Date().toISOString(),m=r.heartbeatTerminalLock(a.teamfile,a.alias,a.lock_id,f);m&&r.heartbeatAgentInflight(o.lease,o.leaseId,f),!m&&l!==null&&(clearInterval(l),l=null)}catch{}},pI()),l.unref?.();try{ls(t,$e(i.teamfile),i.teamfile)}catch{}return u=await n_(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead}),u}finally{l!==null&&clearInterval(l),r.clearTerminalLock(a.teamfile,a.alias,a.lock_id),r.releaseAgentInflight(o.lease,o.leaseId),I8(r,c,u)}}function k8(t,e){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:process.pid,launch_source:"terminal",parent_invocation_id:pl(process.env.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function I8(t,e,n){if(e!==null)try{t.finishTrackedInvocation(e,{status:n===0?"done":"error",exit_code:n,result_summary:n===0?"terminal session ended":null,error:n===0?null:`terminal exited with code ${n??"unknown"}`})}catch{}}async function n_(t,e){let{provider:n,sessionid:r,sessiondir:s,model:i}=e;if(!wl(n))return k(t,`no resume incantation for provider "${n}"`);if(!zS.test(r))return k(t,"refusing to resume: malformed sessionid");let o=am(n,r,{isLead:e.isLead,model:i,onModelIgnored:c=>{let u=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;t.stderr.write(`${u}
3348
- `),je({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return k(t,`no resume incantation for provider "${n}"`);let[a,...l]=o;return await new Promise(c=>{let u=E8(a,l,{stdio:"inherit",cwd:s,env:Ve(process.env,s,r,"terminal")});u.on("error",d=>{c(k(t,`failed to launch ${a}: ${d.message}`))}),u.on("exit",d=>c(d??0))})}function N8(t,e,n){let r=M(n,"--team");if(r!==void 0){let o=e.findTeamByName(r);return o===null?k(t,`team not found: ${r}`):o}let s=Jx(t,e,M(n,"--project"));return typeof s=="number"?s:Gx(t,e,s,void 0)}async function A8(t,e,n,r){let s=Kx(t,e,n,r);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?k(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${n.name}\` first`):n_(t,{provider:Qe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function zx(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let n=t.messages.reduce((r,s)=>r+(s.content?.length??0),0);return{chars:n,est:Math.ceil(n/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let n=T8(e).size;return{chars:n,est:Math.ceil(n/4),messages:t?.messages?.length??null,bytes:n}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function x8(t,e,n,r,s){let i;if(r!==void 0){let a=e.findTeamMemberByAlias(n.id,r);if(a===null||a.state==="retired")return k(t,`member not found: ${r}`);i=[a]}else i=e.listTeamMembers(n.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let c=Qe(a),u=a.model??null,d=null;wl(c)&&(d=await Ne(l,c));let f=zx(d),m=f.est>Bi;o.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:u,resume_incantation:m?El(c,l,u!==null?{model:u}:{}):null})}if(s)return X(t,{estimate:!0,legend:Yx,guide_tokens:Bi,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
3347
+ `});import{execFileSync as y8}from"node:child_process";import{resolve as Xx}from"node:path";function w8(t){return t.filter(e=>e.state!=="retired")}function Jx(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?k(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=y8("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return k(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=Xx(s),o=e.listProjects().find(a=>Xx(a.local_path)===i);return o===void 0?k(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function Gx(t,e,n,r){if(r!==void 0){let i=e.findTeamByName(r);return i===null?k(t,`team not found: ${r}`):i}let s=e.getTeam(n.team_id);return s===null?k(t,`project ${n.name} has no assigned team; use --team <name>`):s}function Kx(t,e,n,r){if(r!==void 0){let i=e.findTeamMemberByAlias(n.id,r);return i===null||i.state==="retired"?k(t,`member not found: ${r}`):i}let s=w8(e.listTeamMembers(n.id)).find(i=>i.role==="agent");return s===void 0?k(t,`team ${n.name} has no active agent member`):s}var Vx=E(()=>{"use strict";Ie()});var Zx={};oe(Zx,{SIZE_WARN_EST_TOKENS:()=>Bi,estimateTokens:()=>zx,runTerminal:()=>S8});import{spawn as E8}from"node:child_process";import{statSync as T8}from"node:fs";async function S8(t,e){if(t.includes("--help")||t.includes("-h"))return R8(e);let n=Y(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return k(e,n.error);let r=M(n,"--run");if(r!==void 0){let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<=0||String(s)!==r)return k(e,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?X(n,o):M(n,o)!==void 0)return k(e,`--run is mutually exclusive with ${o}`);try{return await $(e,async o=>{let a=M(n,"--alias"),l=Zv(o,s,a);return"err"in l?k(e,l.err):n_(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return We(e,o)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?X(n,l):M(n,l)!==void 0)return k(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=n.positionals[0],o=n.positionals[1],a=Et(v8,{target:i,alias:o,flags:{}});return a.mode==="error"?k(e,a.message):a.mode!=="ai-team"?k(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?k(e,"terminal: alias required for the teamfile target"):await $(e,l=>b8(e,a.teamfile,a.alias,l,X(n,"--json")))}try{return await $(e,async s=>{let i=N8(e,s,n);if(typeof i=="number")return i;let o=M(n,"--alias");return X(n,"--size")?x8(e,s,i,o,X(n,"--json")):A8(e,s,i,o)})}catch(s){return We(e,s)}}async function b8(t,e,n,r,s){let i;try{i=je(e,n,r)}catch(d){return d instanceof ve?k(t,d.message):We(t,d)}let o=br(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:ds()});if(!o.acquired){let d=o.current.holder_pid,f=d===null?null:Re(d)?"live":"dead",m=`${i.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at} `+(d===null?"(holder_pid=unavailable)":`(holder_pid=${d}, ${f})`);return s?(J(t,{status:"error",errorKind:"busy",message:m,holder_pid:d,holder_liveness:f}),1):k(t,m)}let a=mI({teamfile:i.teamfile,alias:i.alias}),l=null,c=null,u=null;try{r.setTerminalLock(a),c=k8(r,i),c!==null&&(process.env.LMCTL_INVOCATION_ID=String(c));let d=r.getRootTeam(i.teamfile)?.name??null;d!==null&&(process.env.LMBEE_TEAM_NAME=d),l=setInterval(()=>{try{let f=new Date().toISOString(),m=r.heartbeatTerminalLock(a.teamfile,a.alias,a.lock_id,f);m&&r.heartbeatAgentInflight(o.lease,o.leaseId,f),!m&&l!==null&&(clearInterval(l),l=null)}catch{}},pI()),l.unref?.();try{ls(t,$e(i.teamfile),i.teamfile)}catch{}return u=await n_(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead}),u}finally{l!==null&&clearInterval(l),r.clearTerminalLock(a.teamfile,a.alias,a.lock_id),r.releaseAgentInflight(o.lease,o.leaseId),I8(r,c,u)}}function k8(t,e){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:process.pid,launch_source:"terminal",parent_invocation_id:pl(process.env.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function I8(t,e,n){if(e!==null)try{t.finishTrackedInvocation(e,{status:n===0?"done":"error",exit_code:n,result_summary:n===0?"terminal session ended":null,error:n===0?null:`terminal exited with code ${n??"unknown"}`})}catch{}}async function n_(t,e){let{provider:n,sessionid:r,sessiondir:s,model:i}=e;if(!wl(n))return k(t,`no resume incantation for provider "${n}"`);if(!zS.test(r))return k(t,"refusing to resume: malformed sessionid");let o=am(n,r,{isLead:e.isLead,model:i,onModelIgnored:c=>{let u=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;t.stderr.write(`${u}
3348
+ `),Pe({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return k(t,`no resume incantation for provider "${n}"`);let[a,...l]=o;return await new Promise(c=>{let u=E8(a,l,{stdio:"inherit",cwd:s,env:Ke(process.env,s,r,"terminal")});u.on("error",d=>{c(k(t,`failed to launch ${a}: ${d.message}`))}),u.on("exit",d=>c(d??0))})}function N8(t,e,n){let r=M(n,"--team");if(r!==void 0){let o=e.findTeamByName(r);return o===null?k(t,`team not found: ${r}`):o}let s=Jx(t,e,M(n,"--project"));return typeof s=="number"?s:Gx(t,e,s,void 0)}async function A8(t,e,n,r){let s=Kx(t,e,n,r);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?k(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${n.name}\` first`):n_(t,{provider:Ze(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function zx(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let n=t.messages.reduce((r,s)=>r+(s.content?.length??0),0);return{chars:n,est:Math.ceil(n/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let n=T8(e).size;return{chars:n,est:Math.ceil(n/4),messages:t?.messages?.length??null,bytes:n}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function x8(t,e,n,r,s){let i;if(r!==void 0){let a=e.findTeamMemberByAlias(n.id,r);if(a===null||a.state==="retired")return k(t,`member not found: ${r}`);i=[a]}else i=e.listTeamMembers(n.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let c=Ze(a),u=a.model??null,d=null;wl(c)&&(d=await Ne(l,c));let f=zx(d),m=f.est>Bi;o.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:u,resume_incantation:m?El(c,l,u!==null?{model:u}:{}):null})}if(s)return J(t,{estimate:!0,legend:Yx,guide_tokens:Bi,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
3349
3349
  `),t.stdout.write(`${Yx}
3350
3350
  `);for(let a of o){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)
3351
3351
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -3386,7 +3386,7 @@ Examples:
3386
3386
  tokens it surfaces the resume incantation so YOU can
3387
3387
  open & self-compact. Nothing is ever changed
3388
3388
  automatically; ${Bi} is a guide, not a gate.
3389
- `),0}var v8,Bi,Yx,Qx=E(()=>{"use strict";mt();St();Ie();Vx();vt();Dt();At();Ii();ft();zm();np();sl();ae();Bt();v8={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bi=2e5,Yx="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{createHash as O8,randomBytes as L8}from"node:crypto";import{readFile as C8}from"node:fs/promises";function e0(t=new Date,e=L8(4)){let n=t.getUTCFullYear().toString().padStart(4,"0"),r=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),i=t.getUTCHours().toString().padStart(2,"0"),o=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-${n}${r}${s}-${i}${o}${a}-${l}`}function $8(t){return O8("sha256").update(t).digest("hex")}async function t0(t){return(await Promise.all(t.map(async({bundlePath:n,absPath:r})=>{let s=await C8(r);return{path:n,sha256:$8(s),size:s.byteLength}}))).sort((n,r)=>n.path<r.path?-1:n.path>r.path?1:0)}function n0(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 r_=E(()=>{"use strict"});import{spawnSync as r0}from"node:child_process";import{mkdir as s_,writeFile as s0,readFile as M8,rm as i0}from"node:fs/promises";import{tmpdir as D8}from"node:os";import{dirname as o0,join as i_}from"node:path";async function a0(t){let e=t.stagingDir??i_(D8(),`lmctl-diag-${t.ticketId}`),n=i_(e,`diagnostic-${t.ticketId}`);await s_(n,{recursive:!0});let r=[],s=async(d,f)=>{let m=i_(n,d);if(await s_(o0(m),{recursive:!0}),typeof f=="string")await s0(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await s0(m,new Uint8Array(p))}r.push({bundlePath:d,absPath:m})},i=d=>`${JSON.stringify(d,null,2)}
3389
+ `),0}var v8,Bi,Yx,Qx=E(()=>{"use strict";ft();vt();Ie();Vx();Tt();Dt();At();Ii();ut();zm();np();sl();ae();Bt();v8={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bi=2e5,Yx="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{createHash as O8,randomBytes as L8}from"node:crypto";import{readFile as C8}from"node:fs/promises";function e0(t=new Date,e=L8(4)){let n=t.getUTCFullYear().toString().padStart(4,"0"),r=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),i=t.getUTCHours().toString().padStart(2,"0"),o=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-${n}${r}${s}-${i}${o}${a}-${l}`}function $8(t){return O8("sha256").update(t).digest("hex")}async function t0(t){return(await Promise.all(t.map(async({bundlePath:n,absPath:r})=>{let s=await C8(r);return{path:n,sha256:$8(s),size:s.byteLength}}))).sort((n,r)=>n.path<r.path?-1:n.path>r.path?1:0)}function n0(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 r_=E(()=>{"use strict"});import{spawnSync as r0}from"node:child_process";import{mkdir as s_,writeFile as s0,readFile as M8,rm as i0}from"node:fs/promises";import{tmpdir as D8}from"node:os";import{dirname as o0,join as i_}from"node:path";async function a0(t){let e=t.stagingDir??i_(D8(),`lmctl-diag-${t.ticketId}`),n=i_(e,`diagnostic-${t.ticketId}`);await s_(n,{recursive:!0});let r=[],s=async(d,f)=>{let m=i_(n,d);if(await s_(o0(m),{recursive:!0}),typeof f=="string")await s0(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await s0(m,new Uint8Array(p))}r.push({bundlePath:d,absPath:m})},i=d=>`${JSON.stringify(d,null,2)}
3390
3390
  `;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
3391
3391
  `:`${d.pid}
3392
3392
  # source=${d.pid_source} alive=${String(d.pid_alive)}
@@ -3416,7 +3416,7 @@ Examples:
3416
3416
  `),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
3417
3417
  `)),c.ok||i==="local"?0:1})}catch(o){return e.stderr.write(`diagnose failed: ${o instanceof Error?o.message:String(o)}
3418
3418
  `),1}}function u0(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},n=[];for(let r=0;r<t.length;r+=1){let s=t[r];if(s==="--output"){let i=t[++r];if(i===void 0||i.startsWith("--"))return"missing value for --output";e.outputPath=i;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let i=t[++r];if(i===void 0||i.startsWith("--"))return"missing value for --hq";e.hqUrl=i,e.upload=!0;continue}if(s==="--include"){let i=t[++r];if(i===void 0||i.startsWith("--"))return"missing value for --include";if(!X8(i))return`unknown section: ${i} (expected one of ${Gi.join(", ")})`;n.push(i);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 n.length>0&&(e.include=n),e}function X8(t){return Gi.includes(t)}function J8(t){return H8(q8(),`lmctl-diag-${t}.tar.gz`)}function G8(){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(`
3419
- `)}var m0=E(()=>{"use strict";bs();l0();r_();Ji();d0();qe();Ie()});var w0={};oe(w0,{ATTENTION_STATES:()=>l_,DAEMON_INTERVAL_FAST_MS:()=>a_,REQUIRED_TEAM_ALIASES:()=>p0,chooseDiagnoses:()=>g0,collectEvidence:()=>h0,diagnose:()=>_0,renderReport:()=>y0,runDiagnosePrompt:()=>Y8});function _0(t,e){let n=h0(t,e),r=g0(n);return y0(n,r)}function h0(t,e){let n=e.trim(),r={promptId:n,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:_i(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(n)}catch{r.dispatch.sectionAvailable=!1}if(s!=null&&(r.dispatch.rowExists=!0,r.prompt.exists=!0,r.prompt.project_id=s.project_id,r.prompt.text_preview=V8(s.text),r.prompt.created_at=s.created_at,r.prompt.completed_at=s.completed_at,r.prompt.job_id=s.job_id),r.prompt.job_id!==void 0)try{let i=t.getJob(r.prompt.job_id);if(i!==null&&(r.job.exists=!0,r.job.status=i.status,r.job.attempt_count=i.attempt_count,r.job.last_error=i.last_error,r.job.available_at=i.available_at,r.job.locked_by=i.locked_by,r.job.run_id=i.run_id,i.run_id!==null))try{let o=t.getRun(i.run_id);if(o!==null){r.run.exists=!0,r.run.id=o.id,r.run.current_state=o.current_state,r.run.terminal_state=o.terminal_state,r.run.started_at=o.started_at,r.run.ended_at=o.ended_at;let a="__paused__:";r.run.paused_step=o.current_state!==null&&o.current_state.startsWith(a)?o.current_state.slice(a.length):null,r.run.paused_at=o.paused_at}}catch{r.run.sectionAvailable=!1}}catch{r.job.sectionAvailable=!1}if(r.prompt.project_id!==void 0)try{let i=t.getProject(r.prompt.project_id);if(i!==null){r.project.exists=!0,r.project.id=i.id,r.project.name=i.name,r.project.local_path=i.local_path,r.project.test_command=i.test_command,r.project.workflow_name=i.workflow_name,r.project.team_id=i.team_id;try{r.project.workflow_name_resolves=t.getWorkflowByName(i.workflow_name)!==null}catch{r.project.workflow_name_resolves=!1}}}catch{r.project.sectionAvailable=!1}if(r.project.id!==void 0)try{let i=t.listProjectWorkflows(r.project.id);r.workflows.count=i.length;for(let o of i){let a=`workflow_id=${o.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===o.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}r.workflows.rows.push({workflow_name:a,version:l,enabled:o.enabled,source_uri:c})}}catch{r.workflows.sectionAvailable=!1}if(r.project.team_id!==void 0)try{r.team.teamId=r.project.team_id;let i=t.listTeamMembers(r.project.team_id);for(let a of i)r.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let o=new Set(i.map(a=>a.alias));r.team.missingAliases=p0.filter(a=>!o.has(a))}catch{r.team.sectionAvailable=!1}return r.daemon.workerPid=null,r.daemon.lastTickAt=null,r}function g0(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>a_&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${a_}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:"The workflow/project CLI surface is retired; inspect the dormant DB rows or migrate this project to a .lmctl teamfile 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 n=t.team.sectionAvailable?t.team.members.filter(s=>l_.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||n.length>0){let s=t.run.paused_step??null,i=n.map(a=>a.alias).join(", "),o=s!==null&&i.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${i} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${i} awaiting operator attention`;e.push({cause:o,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 y0(t,e){let n=[];if(n.push(`DIAGNOSE ${t.promptId}`),n.push(""),n.push("[PROMPT]"),t.prompt.exists?(n.push(` id: ${t.promptId}`),n.push(` project_id: ${t.prompt.project_id??"?"}`),n.push(` text: ${t.prompt.text_preview??"?"}`),n.push(` created_at: ${t.prompt.created_at??"?"}`),n.push(` completed_at: ${t.prompt.completed_at??"null"}`)):n.push(" not present in prompt_dispatch table"),n.push(""),n.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(n.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(n.push(` job_id: ${t.prompt.job_id??"?"}`),n.push(` dispatched_at: ${t.prompt.created_at??"?"}`),n.push(` last_seen_status: ${K8(t)}`))):n.push(" table not present (schema variation)"),n.push(""),n.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(n.push(" row exists in prompt_runs table: YES"),n.push(` run_id: ${t.run.id??"?"}`),n.push(` current_step: ${t.run.current_state??"null"}`),n.push(` status: ${t.run.terminal_state??"in_progress"}`),n.push(` started_at: ${t.run.started_at??"?"}`),n.push(` attempts: ${t.job.attempt_count??0}`)):(n.push(" row exists in prompt_runs table: NO"),n.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),n.push(" -> job enqueued but no run; daemon poll did not consume it")):(n.push(" row exists in prompt_runs table: NO"),n.push(" -> worker never picked up the prompt (job row missing)")):n.push(" job table not accessible"),n.push(""),n.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(n.push(` id: ${t.project.id??"?"}`),n.push(` name: ${t.project.name??"?"}`),n.push(` local_path: ${t.project.local_path??"?"}`),n.push(` test_command: ${t.project.test_command??"null"}`),n.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?n.push(" not resolvable (no project_id on prompt)"):n.push(` not present (id=${t.prompt.project_id})`):n.push(" project table not accessible"),n.push(""),n.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)n.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)n.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),n.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{n.push(` count: ${t.workflows.count}`);for(let i of t.workflows.rows)n.push(` - ${i.workflow_name} v${i.version} enabled=${i.enabled===1?"true":"false"} source=${i.source_uri??"null"}`)}if(n.push(""),n.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)n.push(" team_member table not accessible");else if(t.team.teamId===void 0)n.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&n.push(" (no members)");for(let i of t.team.members)n.push(` - alias=${i.alias} provider=${i.provider} state=${i.state} sessionid=${i.sessionid??"null"} sessiondir=${i.sessiondir}`);t.team.missingAliases.length>0&&n.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}n.push("");let r=t.team.sectionAvailable?t.team.members.filter(i=>l_.has(i.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||r.length>0){if(n.push("[ATTENTION/ESCALATION]"),s!==null){let i=t.run.paused_at??t.run.started_at??"?";n.push(` paused_step: ${s} (started: ${i})`)}if(r.length>0){let i=r.map(o=>`${o.alias} (state=${o.state}${o.state_updated_at?` since ${o.state_updated_at}`:""}${o.state_reason?`, reason="${o.state_reason}"`:""})`).join(", ");n.push(` members awaiting operator: ${i}`)}else n.push(" members awaiting operator: (none flagged on team)");n.push(" next action expected: operator response via /admin or webcli escalations verb"),n.push("")}if(n.push("[DAEMON STATE]"),n.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),n.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),n.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),n.push(""),n.push("[DIAGNOSIS]"),e.length===0)n.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let i of e)n.push(` - ${i.cause}`),n.push(` -> ${i.action}`);return n.join(`
3419
+ `)}var m0=E(()=>{"use strict";bs();l0();r_();Ji();d0();He();Ie()});var w0={};oe(w0,{ATTENTION_STATES:()=>l_,DAEMON_INTERVAL_FAST_MS:()=>a_,REQUIRED_TEAM_ALIASES:()=>p0,chooseDiagnoses:()=>g0,collectEvidence:()=>h0,diagnose:()=>_0,renderReport:()=>y0,runDiagnosePrompt:()=>Y8});function _0(t,e){let n=h0(t,e),r=g0(n);return y0(n,r)}function h0(t,e){let n=e.trim(),r={promptId:n,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:_i(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(n)}catch{r.dispatch.sectionAvailable=!1}if(s!=null&&(r.dispatch.rowExists=!0,r.prompt.exists=!0,r.prompt.project_id=s.project_id,r.prompt.text_preview=V8(s.text),r.prompt.created_at=s.created_at,r.prompt.completed_at=s.completed_at,r.prompt.job_id=s.job_id),r.prompt.job_id!==void 0)try{let i=t.getJob(r.prompt.job_id);if(i!==null&&(r.job.exists=!0,r.job.status=i.status,r.job.attempt_count=i.attempt_count,r.job.last_error=i.last_error,r.job.available_at=i.available_at,r.job.locked_by=i.locked_by,r.job.run_id=i.run_id,i.run_id!==null))try{let o=t.getRun(i.run_id);if(o!==null){r.run.exists=!0,r.run.id=o.id,r.run.current_state=o.current_state,r.run.terminal_state=o.terminal_state,r.run.started_at=o.started_at,r.run.ended_at=o.ended_at;let a="__paused__:";r.run.paused_step=o.current_state!==null&&o.current_state.startsWith(a)?o.current_state.slice(a.length):null,r.run.paused_at=o.paused_at}}catch{r.run.sectionAvailable=!1}}catch{r.job.sectionAvailable=!1}if(r.prompt.project_id!==void 0)try{let i=t.getProject(r.prompt.project_id);if(i!==null){r.project.exists=!0,r.project.id=i.id,r.project.name=i.name,r.project.local_path=i.local_path,r.project.test_command=i.test_command,r.project.workflow_name=i.workflow_name,r.project.team_id=i.team_id;try{r.project.workflow_name_resolves=t.getWorkflowByName(i.workflow_name)!==null}catch{r.project.workflow_name_resolves=!1}}}catch{r.project.sectionAvailable=!1}if(r.project.id!==void 0)try{let i=t.listProjectWorkflows(r.project.id);r.workflows.count=i.length;for(let o of i){let a=`workflow_id=${o.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===o.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}r.workflows.rows.push({workflow_name:a,version:l,enabled:o.enabled,source_uri:c})}}catch{r.workflows.sectionAvailable=!1}if(r.project.team_id!==void 0)try{r.team.teamId=r.project.team_id;let i=t.listTeamMembers(r.project.team_id);for(let a of i)r.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let o=new Set(i.map(a=>a.alias));r.team.missingAliases=p0.filter(a=>!o.has(a))}catch{r.team.sectionAvailable=!1}return r.daemon.workerPid=null,r.daemon.lastTickAt=null,r}function g0(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>a_&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${a_}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:"The workflow/project CLI surface is retired; inspect the dormant DB rows or migrate this project to a .lmctl teamfile 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 n=t.team.sectionAvailable?t.team.members.filter(s=>l_.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||n.length>0){let s=t.run.paused_step??null,i=n.map(a=>a.alias).join(", "),o=s!==null&&i.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${i} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${i} awaiting operator attention`;e.push({cause:o,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 y0(t,e){let n=[];if(n.push(`DIAGNOSE ${t.promptId}`),n.push(""),n.push("[PROMPT]"),t.prompt.exists?(n.push(` id: ${t.promptId}`),n.push(` project_id: ${t.prompt.project_id??"?"}`),n.push(` text: ${t.prompt.text_preview??"?"}`),n.push(` created_at: ${t.prompt.created_at??"?"}`),n.push(` completed_at: ${t.prompt.completed_at??"null"}`)):n.push(" not present in prompt_dispatch table"),n.push(""),n.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(n.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(n.push(` job_id: ${t.prompt.job_id??"?"}`),n.push(` dispatched_at: ${t.prompt.created_at??"?"}`),n.push(` last_seen_status: ${K8(t)}`))):n.push(" table not present (schema variation)"),n.push(""),n.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(n.push(" row exists in prompt_runs table: YES"),n.push(` run_id: ${t.run.id??"?"}`),n.push(` current_step: ${t.run.current_state??"null"}`),n.push(` status: ${t.run.terminal_state??"in_progress"}`),n.push(` started_at: ${t.run.started_at??"?"}`),n.push(` attempts: ${t.job.attempt_count??0}`)):(n.push(" row exists in prompt_runs table: NO"),n.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),n.push(" -> job enqueued but no run; daemon poll did not consume it")):(n.push(" row exists in prompt_runs table: NO"),n.push(" -> worker never picked up the prompt (job row missing)")):n.push(" job table not accessible"),n.push(""),n.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(n.push(` id: ${t.project.id??"?"}`),n.push(` name: ${t.project.name??"?"}`),n.push(` local_path: ${t.project.local_path??"?"}`),n.push(` test_command: ${t.project.test_command??"null"}`),n.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?n.push(" not resolvable (no project_id on prompt)"):n.push(` not present (id=${t.prompt.project_id})`):n.push(" project table not accessible"),n.push(""),n.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)n.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)n.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),n.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{n.push(` count: ${t.workflows.count}`);for(let i of t.workflows.rows)n.push(` - ${i.workflow_name} v${i.version} enabled=${i.enabled===1?"true":"false"} source=${i.source_uri??"null"}`)}if(n.push(""),n.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)n.push(" team_member table not accessible");else if(t.team.teamId===void 0)n.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&n.push(" (no members)");for(let i of t.team.members)n.push(` - alias=${i.alias} provider=${i.provider} state=${i.state} sessionid=${i.sessionid??"null"} sessiondir=${i.sessiondir}`);t.team.missingAliases.length>0&&n.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}n.push("");let r=t.team.sectionAvailable?t.team.members.filter(i=>l_.has(i.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||r.length>0){if(n.push("[ATTENTION/ESCALATION]"),s!==null){let i=t.run.paused_at??t.run.started_at??"?";n.push(` paused_step: ${s} (started: ${i})`)}if(r.length>0){let i=r.map(o=>`${o.alias} (state=${o.state}${o.state_updated_at?` since ${o.state_updated_at}`:""}${o.state_reason?`, reason="${o.state_reason}"`:""})`).join(", ");n.push(` members awaiting operator: ${i}`)}else n.push(" members awaiting operator: (none flagged on team)");n.push(" next action expected: operator response via /admin or webcli escalations verb"),n.push("")}if(n.push("[DAEMON STATE]"),n.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),n.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),n.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),n.push(""),n.push("[DIAGNOSIS]"),e.length===0)n.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let i of e)n.push(` - ${i.cause}`),n.push(` -> ${i.action}`);return n.join(`
3420
3420
  `)+`
3421
3421
  `}function K8(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 V8(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function Y8(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${o_()}
3422
3422
  `),0;let n=[];for(let s of t){if(s.startsWith("--"))return e.stderr.write(`error: unknown flag: ${s}
@@ -3425,7 +3425,7 @@ Examples:
3425
3425
  `),e.stderr.write(`${o_()}
3426
3426
  `),2;let r=n[0];try{return await $(e,s=>(e.stdout.write(_0(s,r)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
3427
3427
  `),1}}function o_(){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(`
3428
- `)}var p0,a_,l_,E0=E(()=>{"use strict";Vf();Ie();p0=["Coder","Reviewer1","Polisher"],a_=3e4,l_=new Set(["attention_needed","paused","escalation"])});qe();bs();ae();import{pathToFileURL as z8}from"node:url";import{mkdirSync as cR,readFileSync as dR,renameSync as uR,writeFileSync as fR}from"node:fs";import{homedir as mR}from"node:os";import{dirname as pR,join as _R}from"node:path";function R_(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function aR(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function lR(t,e){return!aR(t)||R_(t)?null:`${e} must use https://: ${t}`}async function O_(t,e){let n=lR(t,e.description);if(n!==null||!R_(t))throw new Error(n??`${e.description} must use https://: ${t}`);let r=e.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),r);try{let o;try{o=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw x_(t,e.description,r,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.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(!o.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw x_(t,e.description,r,a)}}finally{clearTimeout(i)}}function x_(t,e,n,r){let i=r instanceof Error&&r.name==="AbortError"?`timed out after ${n}ms`:r instanceof Error?r.message:String(r);return new Error(`failed to fetch ${e} ${t}: ${i}`)}bs();var hR="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",gR=60*60*1e3,yR=1500;function wR(){let t=process.env.HOME??mR();return _R(t,".lmctl",".update-check.json")}function ER(t){return t.isTTY===!0}function TR(t,e){let n=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},r=n(t),s=n(e);if(r===null||s===null)return 0;for(let i=0;i<3;i+=1){if(r[i]>s[i])return 1;if(r[i]<s[i])return-1}return 0}function pc(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!ER(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function vR(t,e){try{let n=JSON.parse(dR(t,"utf8"));if(typeof n.checkedAt=="number"&&Number.isFinite(n.checkedAt)&&typeof n.latest=="string"&&e-n.checkedAt<gR)return n.latest}catch{}return null}function SR(t,e){cR(pR(t),{recursive:!0});let n=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;fR(n,`${JSON.stringify(e)}
3428
+ `)}var p0,a_,l_,E0=E(()=>{"use strict";Vf();Ie();p0=["Coder","Reviewer1","Polisher"],a_=3e4,l_=new Set(["attention_needed","paused","escalation"])});He();bs();ae();import{pathToFileURL as z8}from"node:url";import{mkdirSync as cR,readFileSync as dR,renameSync as uR,writeFileSync as fR}from"node:fs";import{homedir as mR}from"node:os";import{dirname as pR,join as _R}from"node:path";function R_(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function aR(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function lR(t,e){return!aR(t)||R_(t)?null:`${e} must use https://: ${t}`}async function O_(t,e){let n=lR(t,e.description);if(n!==null||!R_(t))throw new Error(n??`${e.description} must use https://: ${t}`);let r=e.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),r);try{let o;try{o=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw x_(t,e.description,r,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.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(!o.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw x_(t,e.description,r,a)}}finally{clearTimeout(i)}}function x_(t,e,n,r){let i=r instanceof Error&&r.name==="AbortError"?`timed out after ${n}ms`:r instanceof Error?r.message:String(r);return new Error(`failed to fetch ${e} ${t}: ${i}`)}bs();var hR="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",gR=60*60*1e3,yR=1500;function wR(){let t=process.env.HOME??mR();return _R(t,".lmctl",".update-check.json")}function ER(t){return t.isTTY===!0}function TR(t,e){let n=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},r=n(t),s=n(e);if(r===null||s===null)return 0;for(let i=0;i<3;i+=1){if(r[i]>s[i])return 1;if(r[i]<s[i])return-1}return 0}function pc(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!ER(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function vR(t,e){try{let n=JSON.parse(dR(t,"utf8"));if(typeof n.checkedAt=="number"&&Number.isFinite(n.checkedAt)&&typeof n.latest=="string"&&e-n.checkedAt<gR)return n.latest}catch{}return null}function SR(t,e){cR(pR(t),{recursive:!0});let n=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;fR(n,`${JSON.stringify(e)}
3429
3429
  `,"utf8"),uR(n,t)}async function bR(){let t=await O_(hR,{description:"lmctl npm metadata",timeoutMs:yR}),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 L_(t,e=[],n={}){try{if(pc(e,t))return;let r=n.now?.()??Date.now(),s=n.cachePath??wR();if(vR(s,r)!==null)return;let o=await(n.fetchLatest??bR)();try{SR(s,{checkedAt:r,latest:o})}catch{return}let a=n.currentVersion?.()??Ut();TR(o,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
3430
3430
  `)}catch{}}hc();Is();var ws=`usage: lmctl [--db PATH] [--debug] <command> [args]
3431
3431
  `,c_=`${ws}
@@ -3482,7 +3482,7 @@ ${ws}Run 'lmctl help' for usage.
3482
3482
  `),1):(t.stderr.write(`error: unknown command: ${e}
3483
3483
  ${ws}Run 'lmctl help' for usage.
3484
3484
  `),1)}async function Z8(t,e={stdout:process.stdout,stderr:process.stderr}){let n=I_();try{return await Q8(t,e)}finally{N_(n)}}async function Q8(t,e={stdout:process.stdout,stderr:process.stderr}){let n=[],r;for(let l=0;l<t.length;l+=1){let c=t[l];if(c==="--db"){let u=t[++l];if(u===void 0||u.startsWith("--"))return v0(e,"missing value for --db");r=u;continue}if(c==="--debug"){k_();continue}if(c==="--allow-schema-skew"){process.env.LMCTL_ALLOW_SCHEMA_SKEW="1";continue}n.push(c)}if(r!==void 0){let l=n[0];if(Yi()&&l!==void 0&&zi(l))return v0(e,"--db cannot be combined with an infra command (lmctl and lmauto use separate databases)");process.env.LMCTL_DB=r}let s=n[0];if(s==="--version"||s==="-v"||s==="-V")return e.stdout.write(`lmctl ${Ut()}
3485
- `),0;if(s==="--help"||s==="-h"||s===void 0)return e.stdout.write(c_),0;if(s==="help"){let[l,...c]=n.slice(1);return l===void 0||l==="--help"||l==="-h"?(e.stdout.write(c_),0):T0.has(l)?S0(l,[...c,"--help"],e):b0(e,l)}cc(Q(),e.stderr);let[i,...o]=n;if(i===void 0)return e.stdout.write(c_),0;let a=Date.now();d_(i,o,{phase:"start",started_at:new Date(a).toISOString()});try{let l=await S0(i,o,e);return d_(i,o,{phase:"finish",outcome:l===0?"ok":"error",exit_code:l,duration_ms:Date.now()-a}),T0.has(i)&&!pc(n,e)&&await L_(e,n),l}catch(l){let c=l instanceof Error?l:new Error(String(l));return d_(i,o,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-a,error_class:c.name,error_message:c.message,error_stack:c.stack??null,causes:tz(c)}),ez(l,i,o,e)}}function d_(t,e,n){je({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:Q(),lmctl_version:Ut(),node_version:process.version,...n})}function ez(t,e,n,r){let s=t instanceof Error?t:new Error(String(t));return s instanceof qt&&n.includes("--json")?(r.stdout.write(`${JSON.stringify({error:s.message,schema_skew:{db_version:s.dbVersion,build_version:s.buildVersion,mode:"refused"}},null,2)}
3485
+ `),0;if(s==="--help"||s==="-h"||s===void 0)return e.stdout.write(c_),0;if(s==="help"){let[l,...c]=n.slice(1);return l===void 0||l==="--help"||l==="-h"?(e.stdout.write(c_),0):T0.has(l)?S0(l,[...c,"--help"],e):b0(e,l)}cc(Q(),e.stderr);let[i,...o]=n;if(i===void 0)return e.stdout.write(c_),0;let a=Date.now();d_(i,o,{phase:"start",started_at:new Date(a).toISOString()});try{let l=await S0(i,o,e);return d_(i,o,{phase:"finish",outcome:l===0?"ok":"error",exit_code:l,duration_ms:Date.now()-a}),T0.has(i)&&!pc(n,e)&&await L_(e,n),l}catch(l){let c=l instanceof Error?l:new Error(String(l));return d_(i,o,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-a,error_class:c.name,error_message:c.message,error_stack:c.stack??null,causes:tz(c)}),ez(l,i,o,e)}}function d_(t,e,n){Pe({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:Q(),lmctl_version:Ut(),node_version:process.version,...n})}function ez(t,e,n,r){let s=t instanceof Error?t:new Error(String(t));return s instanceof qt&&n.includes("--json")?(r.stdout.write(`${JSON.stringify({error:s.message,schema_skew:{db_version:s.dbVersion,build_version:s.buildVersion,mode:"refused"}},null,2)}
3486
3486
  `),1):(r.stderr.write(`error: ${s.message}
3487
3487
  `),A_()?(r.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
3488
3488
  `),1):(r.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
@@ -3494,7 +3494,7 @@ ${ws}Run 'lmctl help' for usage.
3494
3494
  downgrade --to <version> --confirm Documented stub (restore from backup).
3495
3495
  `),0):n==="backfill-events"?rz(r,e):n==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
3496
3496
  `),1):(e.stderr.write(`usage: lmctl db <subcommand> (backfill-events | downgrade)
3497
- `),1)}async function rz(t,e){let{resolveDbPath:n}=await Promise.resolve().then(()=>(qe(),__)),r=n();if(!((process.env.LMCTL_DB??"").length>0)&&!t.includes("--allow-live"))return e.stderr.write(`refusing to backfill the default live DB.
3497
+ `),1)}async function rz(t,e){let{resolveDbPath:n}=await Promise.resolve().then(()=>(He(),__)),r=n();if(!((process.env.LMCTL_DB??"").length>0)&&!t.includes("--allow-live"))return e.stderr.write(`refusing to backfill the default live DB.
3498
3498
  resolved target: ${r}
3499
3499
  run against a COPY: cp <state.db> copy.db && lmctl --db copy.db db backfill-events
3500
3500
  (or pass --allow-live to target the resolved DB deliberately).