@lmctl-ai/lmctl 0.1.9 → 0.1.10

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 +331 -329
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -1,18 +1,18 @@
1
- var UT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{for(var r in e)UT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Ir,readdirSync as qT,readFileSync as HT}from"node:fs";import{homedir as JT,platform as Wd}from"node:os";import{join as _t}from"node:path";function tr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:_t(JT(),XT)}function mn(){return _t(tr(),Bd)}function rr(){return _t(tr(),GT)}function gt(t){return _t(rr(),t)}function Ot(t){return _t(gt(t),Bd)}function da(){let t=[],e=new Set,r=o=>{Ir(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:mn(),kind:"legacy"});let n=rr();if(!Ir(n))return t;let s;try{s=qT(n)}catch{return t}for(let o of s.sort())Pe(o)&&r({workspace_name:o,db_path:Ot(o),kind:"workspace"});return t}function fa(t){return _t(gt(t),"projects")}function Ss(){return _t(tr(),VT)}function Pe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function ks(){let t=Ss();if(!Ir(t))return null;try{let e=HT(t,"utf8").trim();return e.length===0||!Pe(e)?null:e}catch{return null}}function pn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Pe(t)?t:ks()}function de(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=pn();if(e!==null)return Ot(e);let r=mn();return Ir(r)||!Ir(rr())?r:Ot(qd)}function zT(t,e=Wd()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Hd(t,e=process.stderr,r=Wd()){zT(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
- `)}function ma(){return _t(tr(),KT)}function Jd(){return _t(tr(),YT)}function ZT(){try{return Ir(ma())}catch{return!1}}function Xd(t=process.stderr){ZT()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
- `)}var XT,Bd,GT,VT,qd,KT,YT,nr,qe=E(()=>{"use strict";XT=".lmctl",Bd="state.db",GT="workspaces",VT="active-workspace",qd="default",KT="profiles",YT="active-profile";nr={default:qd}});function rS(t){for(let e of tS)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 nS(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function iS(t){let e=t.split(".");if(e.length!==4)return!1;for(let r of e){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function hn(t){let e=t;for(let{re:r,replacement:n}of eS)e=e.replace(r,n);return e=e.replace(sS,r=>!iS(r)||rS(r)?r:Gd),e=e.replace(oS,r=>nS(r)?r:Gd),e}function _n(t){return t.split(`
1
+ var UT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{for(var r in e)UT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Ir,readdirSync as qT,readFileSync as HT}from"node:fs";import{homedir as JT,platform as qd}from"node:os";import{join as _t}from"node:path";function tr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:_t(JT(),XT)}function mn(){return _t(tr(),Hd)}function rr(){return _t(tr(),GT)}function gt(t){return _t(rr(),t)}function Ot(t){return _t(gt(t),Hd)}function fa(){let t=[],e=new Set,r=o=>{Ir(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:mn(),kind:"legacy"});let n=rr();if(!Ir(n))return t;let s;try{s=qT(n)}catch{return t}for(let o of s.sort())Pe(o)&&r({workspace_name:o,db_path:Ot(o),kind:"workspace"});return t}function ma(t){return _t(gt(t),"projects")}function Ss(){return _t(tr(),VT)}function Pe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function ks(){let t=Ss();if(!Ir(t))return null;try{let e=HT(t,"utf8").trim();return e.length===0||!Pe(e)?null:e}catch{return null}}function pn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Pe(t)?t:ks()}function de(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=pn();if(e!==null)return Ot(e);let r=mn();return Ir(r)||!Ir(rr())?r:Ot(Jd)}function zT(t,e=qd()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Xd(t,e=process.stderr,r=qd()){zT(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
+ `)}function pa(){return _t(tr(),KT)}function Gd(){return _t(tr(),YT)}function ZT(){try{return Ir(pa())}catch{return!1}}function Vd(t=process.stderr){ZT()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
+ `)}var XT,Hd,GT,VT,Jd,KT,YT,nr,qe=E(()=>{"use strict";XT=".lmctl",Hd="state.db",GT="workspaces",VT="active-workspace",Jd="default",KT="profiles",YT="active-profile";nr={default:Jd}});function rS(t){for(let e of tS)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 nS(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function iS(t){let e=t.split(".");if(e.length!==4)return!1;for(let r of e){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function hn(t){let e=t;for(let{re:r,replacement:n}of eS)e=e.replace(r,n);return e=e.replace(sS,r=>!iS(r)||rS(r)?r:Kd),e=e.replace(oS,r=>nS(r)?r:Kd),e}function _n(t){return t.split(`
4
4
  `).map(e=>hn(e)).join(`
5
- `)}function Kd(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:ze}:{key:t,value:hn(e)}}function Lt(t){if(typeof t=="string")return hn(t);if(Array.isArray(t))return t.map(e=>Lt(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?ze:Lt(n):e[r]=Lt(n)}return e}return t}function Yd(t,e){for(let{name:r,re:n}of aS){let s=e.match(n);if(s!==null&&!s[0].includes(ze))throw new sr(t,r)}}var ze,QT,Gd,Vd,eS,tS,sS,oS,aS,sr,vs=E(()=>{"use strict";ze="[REDACTED]",QT="[REDACTED_EMAIL]",Gd="[REDACTED_IP]",Vd="[USER]",eS=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${ze}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${ze}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${ze}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:ze},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:ze},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:ze},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:ze},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${ze}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Vd}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Vd}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:QT}],tS=["127.","10.","192.168.","0.0.0.0"];sS=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,oS=/\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;aS=[{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"'`]+/}],sr=class extends Error{bundlePath;patternName;constructor(e,r){super(`sanitization failed: ${r} pattern matched in ${e}`),this.bundlePath=e,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as pa}from"node:child_process";import{readFileSync as lS}from"node:fs";import{readFile as _a,stat as zd}from"node:fs/promises";import{homedir as cS}from"node:os";import{join as uS}from"node:path";import{fileURLToPath as dS}from"node:url";function or(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(lS(dS(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Zd(t){let e=new Set(t.include??Is),r={};return e.has("serve")&&(r.serve=await mS(t)),e.has("db")&&(r.db=pS(t)),e.has("runs")&&(r.runs=hS(t)),e.has("jobs")&&(r.jobs=_S(t)),e.has("attentions")&&(r.attentions=gS(t)),e.has("env")&&(r.env=await wS(t)),e.has("intents")&&(r.intents=await ES(t)),r}async function mS(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await _a(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,o="pidfile")}catch{}let i=null;if(s!==null)try{process.kill(s,0),i=!0}catch{i=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let d=(await _a(r,"utf8")).split(`
5
+ `)}function zd(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:ze}:{key:t,value:hn(e)}}function Lt(t){if(typeof t=="string")return hn(t);if(Array.isArray(t))return t.map(e=>Lt(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?ze:Lt(n):e[r]=Lt(n)}return e}return t}function Zd(t,e){for(let{name:r,re:n}of aS){let s=e.match(n);if(s!==null&&!s[0].includes(ze))throw new sr(t,r)}}var ze,QT,Kd,Yd,eS,tS,sS,oS,aS,sr,vs=E(()=>{"use strict";ze="[REDACTED]",QT="[REDACTED_EMAIL]",Kd="[REDACTED_IP]",Yd="[USER]",eS=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${ze}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${ze}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${ze}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:ze},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:ze},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:ze},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:ze},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${ze}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Yd}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Yd}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:QT}],tS=["127.","10.","192.168.","0.0.0.0"];sS=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,oS=/\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;aS=[{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"'`]+/}],sr=class extends Error{bundlePath;patternName;constructor(e,r){super(`sanitization failed: ${r} pattern matched in ${e}`),this.bundlePath=e,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as ha}from"node:child_process";import{readFileSync as lS}from"node:fs";import{readFile as ga,stat as Qd}from"node:fs/promises";import{homedir as cS}from"node:os";import{join as uS}from"node:path";import{fileURLToPath as dS}from"node:url";function or(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(lS(dS(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function ef(t){let e=new Set(t.include??Is),r={};return e.has("serve")&&(r.serve=await mS(t)),e.has("db")&&(r.db=pS(t)),e.has("runs")&&(r.runs=hS(t)),e.has("jobs")&&(r.jobs=_S(t)),e.has("attentions")&&(r.attentions=gS(t)),e.has("env")&&(r.env=await wS(t)),e.has("intents")&&(r.intents=await ES(t)),r}async function mS(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await ga(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,o="pidfile")}catch{}let i=null;if(s!==null)try{process.kill(s,0),i=!0}catch{i=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let d=(await ga(r,"utf8")).split(`
6
6
  `),f=d.slice(Math.max(0,d.length-n));c=f.length,a=_n(f.join(`
7
7
  `))}catch(u){l=`serve log unreadable: ${u instanceof Error?u.message:String(u)}`}return{pid:s,pid_source:o,pid_alive:i,log_tail_lines:c,log_tail:a,log_note:l}}function pS(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(i=>i.integrity_check??JSON.stringify(i)).join(`
8
- `)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function hS(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),o=e.query(`SELECT ${ha} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${ha} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${ha} FROM run
8
+ `)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function hS(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),o=e.query(`SELECT ${_a} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${_a} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${_a} FROM run
9
9
  WHERE terminal_state IS NULL
10
10
  AND started_at < ?
11
11
  ORDER BY started_at ASC LIMIT 50`,s);return{last_50:Lt(o),stale:Lt(a),paused:Lt(i)}}function _S(t){let{dal:e}=t,r=e.query("SELECT status, COUNT(*) AS c FROM job GROUP BY status"),n={pending:0,running:0,done:0,failed:0,paused:0};for(let{status:i,c:a}of r)i==="queued"?n.pending+=a:i==="running"?n.running+=a:i==="done"||i==="succeeded"?n.done+=a:i==="failed"?n.failed+=a:i==="paused"&&(n.paused+=a);let s=e.query("SELECT id FROM job WHERE status IN ('queued', 'available') ORDER BY id DESC LIMIT 100"),o=e.query("SELECT id FROM job WHERE status = 'running' ORDER BY id DESC LIMIT 100");return{queue_state:n,pending_ids:s.map(i=>i.id),running_ids:o.map(i=>i.id)}}function gS(t){let{dal:e}=t,r=e.query(`SELECT id, kind, severity, project_id, run_id, external_object_id, requires_user, created_at
12
- FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:Lt(r)}}async function wS(t){let e=or(),r=process.version,n=pa("uname",["-a"],{encoding:"utf8"}),s=_n((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await zd(i);let u=pa("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await zd(a);let u=pa("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":_n(o.join(`
13
- `)),c=[];for(let u of fS){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Kd(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function yS(){return process.env.LMCTL_INTENT_LOG??uS(cS(),".lmctl","recent-intents.log")}async function ES(t){let e=t.intentLog??yS(),r=t.intentLogTailLines??500;try{let s=(await _a(e,"utf8")).split(`
12
+ FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:Lt(r)}}async function wS(t){let e=or(),r=process.version,n=ha("uname",["-a"],{encoding:"utf8"}),s=_n((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Qd(i);let u=ha("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Qd(a);let u=ha("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":_n(o.join(`
13
+ `)),c=[];for(let u of fS){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(zd(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function yS(){return process.env.LMCTL_INTENT_LOG??uS(cS(),".lmctl","recent-intents.log")}async function ES(t){let e=t.intentLog??yS(),r=t.intentLogTailLines??500;try{let s=(await ga(e,"utf8")).split(`
14
14
  `).filter(i=>i.length>0),o=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:o.length,tail:_n(o.join(`
15
- `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Is,fS,ha,$s=E(()=>{"use strict";vs();Is=["serve","db","runs","jobs","attentions","env","intents"];fS=["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"];ha=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import bS from"better-sqlite3";import{existsSync as TS,mkdirSync as SS,readFileSync as kS}from"node:fs";import{homedir as vS}from"node:os";import{dirname as Qd,join as IS,resolve as ef}from"node:path";import{fileURLToPath as $S,pathToFileURL as NS}from"node:url";function wa(t){t.dbPath!==":memory:"&&SS(Qd(t.dbPath),{recursive:!0});let e=new bS(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=rf(e);return r===0&&(e.exec(kS(xS,"utf8")),e.pragma(`user_version = ${ga}`)),AS(e,r),e}function AS(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
15
+ `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Is,fS,_a,$s=E(()=>{"use strict";vs();Is=["serve","db","runs","jobs","attentions","env","intents"];fS=["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"];_a=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import bS from"better-sqlite3";import{existsSync as TS,mkdirSync as SS,readFileSync as kS}from"node:fs";import{homedir as vS}from"node:os";import{dirname as tf,join as IS,resolve as rf}from"node:path";import{fileURLToPath as $S,pathToFileURL as NS}from"node:url";function ya(t){t.dbPath!==":memory:"&&SS(tf(t.dbPath),{recursive:!0});let e=new bS(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=sf(e);return r===0&&(e.exec(kS(xS,"utf8")),e.pragma(`user_version = ${wa}`)),AS(e,r),e}function AS(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
16
16
  CREATE TABLE IF NOT EXISTS session_size (
17
17
  id INTEGER PRIMARY KEY AUTOINCREMENT,
18
18
  team_name TEXT NOT NULL,
@@ -463,9 +463,9 @@ var UT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{f
463
463
  ORDER BY id ASC;
464
464
  DROP TABLE team_connection;
465
465
  ALTER TABLE team_connection_v37 RENAME TO team_connection;
466
- `),t.pragma("user_version = 37"),r=37),TS(jS)}function xe(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function rf(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function RS(){return process.env.LMCTL_DB??IS(vS(),".lmctl","state.db")}var tf,xS,jS,ga,ya=E(()=>{"use strict";tf=Qd($S(import.meta.url)),xS=ef(tf,"schema.sql"),jS=ef(tf,"migrations"),ga=37;if(process.argv[1]&&import.meta.url===NS(process.argv[1]).href){let t=wa({dbPath:process.argv[2]??RS()});try{process.stdout.write(`migrated user_version=${rf(t)}
467
- `)}finally{t.close()}}});function $r(t){return typeof t=="string"&&OS.has(t)}function of(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: ${Ns[0]}`,` STANCE: ${Ns[1]}`,` STANCE: ${Ns[2]}`,` STANCE: ${nf}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
468
- `)}var nf,Ns,OS,gn,sf,Ea,xs,wn=E(()=>{"use strict";nf="other",Ns=["not_enough_information","dont_know","other_work"],OS=new Set([nf,...Ns]),gn="@abort",sf="invalid_decision",Ea="escalation_aborted",xs="workflow_escalation"});import{randomUUID as LS}from"node:crypto";function ke(t){return t.provider_resolved??t.provider}function D(){return new Date().toISOString()}function pe(t){return new ba(wa({dbPath:t.path}))}function af(t,e,r){let n=lf(e);if(n.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return lf(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let u of i(l))a(u)}finally{o.pop()}s.add(l)}};a(t)}function lf(t){let e=CS(t),r=e===null?null:MS(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))Ta(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function CS(t){try{let e=JSON.parse(t);return Ta(e)?e:null}catch{return null}}function MS(t,e){let r=t[e];return Ta(r)?r:null}function Ta(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function DS(t){return{insertWorkflow:t.prepare(`
466
+ `),t.pragma("user_version = 37"),r=37),TS(jS)}function xe(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function sf(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function RS(){return process.env.LMCTL_DB??IS(vS(),".lmctl","state.db")}var nf,xS,jS,wa,Ea=E(()=>{"use strict";nf=tf($S(import.meta.url)),xS=rf(nf,"schema.sql"),jS=rf(nf,"migrations"),wa=37;if(process.argv[1]&&import.meta.url===NS(process.argv[1]).href){let t=ya({dbPath:process.argv[2]??RS()});try{process.stdout.write(`migrated user_version=${sf(t)}
467
+ `)}finally{t.close()}}});function $r(t){return typeof t=="string"&&OS.has(t)}function lf(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: ${Ns[0]}`,` STANCE: ${Ns[1]}`,` STANCE: ${Ns[2]}`,` STANCE: ${of}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
468
+ `)}var of,Ns,OS,gn,af,ba,xs,wn=E(()=>{"use strict";of="other",Ns=["not_enough_information","dont_know","other_work"],OS=new Set([of,...Ns]),gn="@abort",af="invalid_decision",ba="escalation_aborted",xs="workflow_escalation"});import{randomUUID as LS}from"node:crypto";function ke(t){return t.provider_resolved??t.provider}function D(){return new Date().toISOString()}function pe(t){return new Ta(ya({dbPath:t.path}))}function cf(t,e,r){let n=uf(e);if(n.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return uf(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let u of i(l))a(u)}finally{o.pop()}s.add(l)}};a(t)}function uf(t){let e=CS(t),r=e===null?null:MS(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))Sa(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function CS(t){try{let e=JSON.parse(t);return Sa(e)?e:null}catch{return null}}function MS(t,e){let r=t[e];return Sa(r)?r:null}function Sa(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function DS(t){return{insertWorkflow:t.prepare(`
469
469
  INSERT INTO workflow (name, version, definition_schema_version, definition, created_at)
470
470
  VALUES (?, ?, ?, ?, ?)
471
471
  `),setWorkflowSource:t.prepare("UPDATE workflow SET source_uri = ?, source_sha256 = ? WHERE id = ?"),getWorkflow:t.prepare("SELECT * FROM workflow WHERE id = ?"),findWorkflowVersion:t.prepare("SELECT * FROM workflow WHERE name = ? AND version = ?"),findWorkflowLatest:t.prepare("SELECT * FROM workflow WHERE name = ? ORDER BY version DESC LIMIT 1"),updateWorkflowActiveVersion:t.prepare("UPDATE workflow SET active_version_id = ? WHERE id = ?"),updateWorkflowActiveVersionAndDefinition:t.prepare(`
@@ -921,11 +921,11 @@ var UT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{f
921
921
  AND sender_teamfile = ?
922
922
  AND sender_alias = ?
923
923
  AND active_count > 1
924
- `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function PS(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var ba,Ce=E(()=>{"use strict";ya();wn();ba=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;replaceTeamConnectionsTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=DS(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,o,i)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=o)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>PS("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==xs)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==gn&&!a.includes(n))return{resumed:!1,reason:sf};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.replaceTeamConnectionsTxn=e.transaction((r,n)=>{this.stmts.deleteTeamConnectionsForSource.run(r);for(let s of n)this.stmts.insertTeamConnection.run(r,s.target_name,s.target_teamfile,s.created_at)}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.stmts.acquireAgentInflight.get({...r,stale_before:n.stale_before??null,force:n.force===!0?1:0}),o=s!==void 0?{acquired:!0,current:s}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){af(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,D()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,D());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){af(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,D());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,D())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,D());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,D()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,D(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(D(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,D());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,D());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,D(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,D());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",D());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,D());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=D(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,D(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,D(),e)??null}closeIssue(e,r,n){let s=D(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,D(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,D(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=D();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=LS(),s=D();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=D(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,D())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??D(),e.dedupe_key??null,e.concurrency_key??null,D());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:D();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,D()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,D()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??D(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,D());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=D(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,D(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(D(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}replaceTeamConnections(e,r){this.replaceTeamConnectionsTxn(e,r)}listTeamConnections(e){return this.stmts.listTeamConnections.all(e)}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,D(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,D())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,D());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,D(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??D(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,D());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,D()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,D()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,D());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(D(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=D();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??D());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,D())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,D())}}});import{realpathSync as FS}from"node:fs";import{resolve as US}from"node:path";function Sa(t){let e=US(t);try{return FS(e)}catch{return e}}var cf=E(()=>{"use strict"});import{platform as uf}from"node:os";function it(t){let e=new yn;for(let r of t)e.registerAdapter(r);return e}var yn,ka=E(()=>{"use strict";cf();yn=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=Sa(e.workspace);o=o.filter(a=>Sa(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=uf()==="darwin"||uf()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as df}from"node:fs";import{createInterface as ff}from"node:readline";import{stat as WS}from"node:fs/promises";import{homedir as BS}from"node:os";async function*Me(t){let e=df(t,{encoding:"utf-8"}),r=ff({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Ae(t,e){let r=[],n=df(t,{encoding:"utf-8"}),s=ff({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function ve(t){let e=await WS(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function ce(t){return t.replace(/\\n/g,`
925
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var be,Ct=E(()=>{"use strict";be=BS()});import{readdir as js,stat as mf,unlink as qS}from"node:fs/promises";import{join as Nr,basename as pf}from"node:path";function HS(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function JS(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return ce(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 hf(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Me(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var As,_f=E(()=>{"use strict";Ct();As=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Nr(be,".claude"),this.projectsDir=Nr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await js(this.projectsDir)}catch{return e}for(let n of r){let s=Nr(this.projectsDir,n);if(!(await mf(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await js(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=pf(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Nr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Ae(e,50),s=await ve(e),o="",i,a,l,c,u,d;for(let m of n)if(!HS(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=G(p.trim(),80)),u=G(p.trim(),80)}}if(!o)return null;let f=await hf(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await ve(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Me(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:JS(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=G(_.trim(),80)),d=G(_.trim(),80),s.push({role:"user",timestamp:g,content:ce(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let S=typeof T.content=="string"?ce(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:S,toolCallId:T.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:ce(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await hf(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await qS(r),!0):!1}async resolveSessionFile(e){let r;try{r=await js(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Nr(this.projectsDir,i);if(!(await mf(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await js(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=pf(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Nr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Ae(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function Rs(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function GS(t,e,r){if(!r)return"";let n=t.tools[e]??va[e],s=n?.profiles?.[r]?.flags??va[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function gf(t,e){return!!t.tools[e]}function wf(t,e,r,n,s){let o=t.tools[e]??va[e],i;if(o?.agent){let l=Rs(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=XS[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(Rs).join(" ");i=`printf '%s\\n' ${Rs(n)} | ${u}`}else i=c.map(Rs).join(" ")}let a=GS(t,e,s);return a&&(i+=" "+a),i}var va,XS,yf=E(()=>{"use strict";va={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:""}}}},XS={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]}}});function Ef(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var bf=E(()=>{"use strict"});var VS,Ie,Os,wt=E(()=>{"use strict";VS="ACK: waiting for explicit lmctl task.",Ie=`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: ${VS}`,Os=`send this exact lmctl seed instruction: "${Ie}"`});import{spawn as Tf}from"node:child_process";import{mkdirSync as KS}from"node:fs";var Ia,je,Mt=E(()=>{"use strict";yf();bf();wt();Ia=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},je=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===Ie?r:n)}seed(e,r){return KS(e,{recursive:!0}),new Promise(n=>{let s;try{s=Tf(this.binary,this.seedArgsFor(r),{cwd:e,stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
926
- `:this.seedStdin;i&&s.stdin?.write(i),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:o.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:Os,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&gf(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,o,i,a="",l,c=()=>{e<=0||(clearTimeout(o),o=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(o)};n.signal&&(n.signal.aborted?(i="external",s.abort()):n.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),c();let d={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),i==="external"?new Ia("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=wf(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=Ef(r.env),c=Tf(s,{shell:!0,cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function Cs(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Et(t,r,e)}var He,ye,yt,Ls,Et,xr=E(()=>{"use strict";He=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends He{},yt=class extends He{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},Ls=class extends He{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Et=class extends He{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Na from"node:child_process";function zS(t){if(typeof Na.spawnSync=="function")try{Na.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Sf(t){return t.exitCode!==null||t.signalCode!==null}function $a(t,e){return Sf(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(o),r(!0))},o=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function Ze(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,o=e.killDelayMs??5e3,i=e.platform??process.platform,a=e.runTaskkill??zS;if(Sf(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await $a(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await $a(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await $a(t,YS)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var YS,Ms=E(()=>{"use strict";YS=1e3});import{readFileSync as ZS,appendFileSync as QS,mkdirSync as ek,existsSync as aB,readdirSync as lB,unlinkSync as cB}from"node:fs";import{join as If,dirname as tk}from"node:path";import{homedir as $f}from"node:os";function at(){if(Nf)return!0;let t=Date.now();return t-vf>=rk&&(kf=ik(),vf=t),kf}function sk(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Dt(t,e){if(e?.verbose){if(!Nf)return}else if(!e?.always&&!at())return;try{ok();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...t};QS(Ds,JSON.stringify(r)+`
927
- `)}catch{}}function ok(){if(!Ds){let e=sk().slice(0,13).replace("T","-");Ds=If($f(),".lmctl",`debug-${e}.log`)}ek(tk(Ds),{recursive:!0})}function bt(...t){Dt({event:"legacy",msg:t.join(" ")},{verbose:!0})}function te(t){Dt(t,{always:!0})}function ik(){try{let t=ZS(nk,"utf-8");for(let e of t.split(`
928
- `)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}var Nf,kf,vf,rk,nk,Ds,Je=E(()=>{"use strict";Nf=!1,kf=!1,vf=0,rk=5e3,nk=If($f(),".lmctl","config.toml");Ds=null});function jr(t,e){let r=lk[t];if(r)return r[e]??r.yolo}function uk(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function Pt(t,e,r="yolo"){if(ck.has(t))return;let n=r==="plan"?jr(t,"plan"):ak[t];if(!n){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw te({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ye(s)}if(!uk(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw te({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new ye(o)}}var ak,lk,ck,En=E(()=>{"use strict";xr();Je();ak={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},lk={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"]}};ck=new Set(["codex","opencode"])});import{spawn as dk}from"node:child_process";import{existsSync as fk}from"node:fs";function pk(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
924
+ `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function PS(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Ta,Ce=E(()=>{"use strict";Ea();wn();Ta=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;replaceTeamConnectionsTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=DS(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,o,i)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=o)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>PS("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==xs)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==gn&&!a.includes(n))return{resumed:!1,reason:af};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.replaceTeamConnectionsTxn=e.transaction((r,n)=>{this.stmts.deleteTeamConnectionsForSource.run(r);for(let s of n)this.stmts.insertTeamConnection.run(r,s.target_name,s.target_teamfile,s.created_at)}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.stmts.acquireAgentInflight.get({...r,stale_before:n.stale_before??null,force:n.force===!0?1:0}),o=s!==void 0?{acquired:!0,current:s}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){cf(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,D()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,D());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){cf(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,D());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,D())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,D());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,D()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,D(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(D(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,D());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,D());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,D(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,D());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",D());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,D());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=D(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,D(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,D(),e)??null}closeIssue(e,r,n){let s=D(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,D(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,D(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=D();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=LS(),s=D();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=D(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,D())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??D(),e.dedupe_key??null,e.concurrency_key??null,D());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:D();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,D()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,D()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??D(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,D());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=D(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,D(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(D(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}replaceTeamConnections(e,r){this.replaceTeamConnectionsTxn(e,r)}listTeamConnections(e){return this.stmts.listTeamConnections.all(e)}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,D(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,D())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,D());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,D(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??D(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,D());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,D()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,D()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,D());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(D(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=D();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??D());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,D())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,D())}}});import{realpathSync as FS}from"node:fs";import{resolve as US}from"node:path";function ka(t){let e=US(t);try{return FS(e)}catch{return e}}var df=E(()=>{"use strict"});import{platform as ff}from"node:os";function it(t){let e=new yn;for(let r of t)e.registerAdapter(r);return e}var yn,va=E(()=>{"use strict";df();yn=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=ka(e.workspace);o=o.filter(a=>ka(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=ff()==="darwin"||ff()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as mf}from"node:fs";import{createInterface as pf}from"node:readline";import{stat as WS}from"node:fs/promises";import{homedir as BS}from"node:os";async function*Me(t){let e=mf(t,{encoding:"utf-8"}),r=pf({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Ae(t,e){let r=[],n=mf(t,{encoding:"utf-8"}),s=pf({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function ve(t){let e=await WS(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function ce(t){return t.replace(/\\n/g,`
925
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var be,Ct=E(()=>{"use strict";be=BS()});import{readdir as js,stat as hf,unlink as qS}from"node:fs/promises";import{join as Nr,basename as _f}from"node:path";function HS(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function JS(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return ce(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 gf(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Me(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var As,wf=E(()=>{"use strict";Ct();As=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Nr(be,".claude"),this.projectsDir=Nr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await js(this.projectsDir)}catch{return e}for(let n of r){let s=Nr(this.projectsDir,n);if(!(await hf(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await js(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=_f(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Nr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Ae(e,50),s=await ve(e),o="",i,a,l,c,u,d;for(let m of n)if(!HS(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=G(p.trim(),80)),u=G(p.trim(),80)}}if(!o)return null;let f=await gf(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await ve(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Me(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:JS(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=G(_.trim(),80)),d=G(_.trim(),80),s.push({role:"user",timestamp:g,content:ce(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let S=typeof T.content=="string"?ce(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:S,toolCallId:T.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:ce(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await gf(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await qS(r),!0):!1}async resolveSessionFile(e){let r;try{r=await js(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Nr(this.projectsDir,i);if(!(await hf(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await js(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=_f(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Nr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Ae(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function Rs(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function GS(t,e,r){if(!r)return"";let n=t.tools[e]??Ia[e],s=n?.profiles?.[r]?.flags??Ia[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function yf(t,e){return!!t.tools[e]}function Ef(t,e,r,n,s){let o=t.tools[e]??Ia[e],i;if(o?.agent){let l=Rs(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=XS[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(Rs).join(" ");i=`printf '%s\\n' ${Rs(n)} | ${u}`}else i=c.map(Rs).join(" ")}let a=GS(t,e,s);return a&&(i+=" "+a),i}var Ia,XS,bf=E(()=>{"use strict";Ia={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:""}}}},XS={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]}}});function Tf(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var Sf=E(()=>{"use strict"});var VS,Ie,Os,wt=E(()=>{"use strict";VS="ACK: waiting for explicit lmctl task.",Ie=`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: ${VS}`,Os=`send this exact lmctl seed instruction: "${Ie}"`});import{spawn as kf}from"node:child_process";import{mkdirSync as KS}from"node:fs";var $a,je,Mt=E(()=>{"use strict";bf();Sf();wt();$a=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},je=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===Ie?r:n)}seed(e,r){return KS(e,{recursive:!0}),new Promise(n=>{let s;try{s=kf(this.binary,this.seedArgsFor(r),{cwd:e,stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
926
+ `:this.seedStdin;i&&s.stdin?.write(i),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:o.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:Os,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&yf(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,o,i,a="",l,c=()=>{e<=0||(clearTimeout(o),o=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(o)};n.signal&&(n.signal.aborted?(i="external",s.abort()):n.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),c();let d={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),i==="external"?new $a("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=Ef(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=Tf(r.env),c=kf(s,{shell:!0,cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function Cs(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Et(t,r,e)}var He,ye,yt,Ls,Et,xr=E(()=>{"use strict";He=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends He{},yt=class extends He{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},Ls=class extends He{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Et=class extends He{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as xa from"node:child_process";function zS(t){if(typeof xa.spawnSync=="function")try{xa.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function vf(t){return t.exitCode!==null||t.signalCode!==null}function Na(t,e){return vf(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(o),r(!0))},o=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function Ze(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,o=e.killDelayMs??5e3,i=e.platform??process.platform,a=e.runTaskkill??zS;if(vf(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Na(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await Na(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await Na(t,YS)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var YS,Ms=E(()=>{"use strict";YS=1e3});import{readFileSync as ZS,appendFileSync as QS,mkdirSync as ek,existsSync as aB,readdirSync as lB,unlinkSync as cB}from"node:fs";import{join as Nf,dirname as tk}from"node:path";import{homedir as xf}from"node:os";function at(){if(jf)return!0;let t=Date.now();return t-$f>=rk&&(If=ik(),$f=t),If}function sk(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Dt(t,e){if(e?.verbose){if(!jf)return}else if(!e?.always&&!at())return;try{ok();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...t};QS(Ds,JSON.stringify(r)+`
927
+ `)}catch{}}function ok(){if(!Ds){let e=sk().slice(0,13).replace("T","-");Ds=Nf(xf(),".lmctl",`debug-${e}.log`)}ek(tk(Ds),{recursive:!0})}function bt(...t){Dt({event:"legacy",msg:t.join(" ")},{verbose:!0})}function te(t){Dt(t,{always:!0})}function ik(){try{let t=ZS(nk,"utf-8");for(let e of t.split(`
928
+ `)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}var jf,If,$f,rk,nk,Ds,Je=E(()=>{"use strict";jf=!1,If=!1,$f=0,rk=5e3,nk=Nf(xf(),".lmctl","config.toml");Ds=null});function jr(t,e){let r=lk[t];if(r)return r[e]??r.yolo}function uk(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function Pt(t,e,r="yolo"){if(ck.has(t))return;let n=r==="plan"?jr(t,"plan"):ak[t];if(!n){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw te({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ye(s)}if(!uk(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw te({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new ye(o)}}var ak,lk,ck,En=E(()=>{"use strict";xr();Je();ak={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},lk={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"]}};ck=new Set(["codex","opencode"])});import{spawn as dk}from"node:child_process";import{existsSync as fk}from"node:fs";function pk(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
929
929
 
930
930
  --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
931
931
 
@@ -933,57 +933,57 @@ var UT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{f
933
933
  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:
934
934
  ${e}
935
935
 
936
- ${r}`:r}function xf(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||mk[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=jr(s,a)??wk[s]??["--dangerously-skip-permissions"];i.push(...l);try{Pt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!fk(e.cwd))return te({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=dk(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:e.env||process.env}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,te({event:"transport_abort",provider:s,phase:"pre_spawn"}),Ze(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,te({event:"transport_abort",provider:s}),Ze(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=hk({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=d.sawResult();d.processLine(g),!_&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
936
+ ${r}`:r}function Af(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||mk[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=jr(s,a)??wk[s]??["--dangerously-skip-permissions"];i.push(...l);try{Pt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!fk(e.cwd))return te({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=dk(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:e.env||process.env}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,te({event:"transport_abort",provider:s,phase:"pre_spawn"}),Ze(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,te({event:"transport_abort",provider:s}),Ze(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=hk({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=d.sawResult();d.processLine(g),!_&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
937
937
  `);f=_.pop()||"";for(let T of _)m(T)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{te({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new ye(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(bt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(te({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(gk({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
938
- `),bt(`stream-json: prompt sent (${t.length} chars)`)})}var mk,wk,jf=E(()=>{"use strict";xr();Ms();En();Je();mk={claude:"claude",qwen:"qwen"};wk={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as yk,constants as Ek}from"node:fs";import{delimiter as bk,join as Tk}from"node:path";function Sk(t,e=process.env){let r=e.PATH??"";for(let n of r.split(bk))if(n)try{return yk(Tk(n,t),Ek.X_OK),!0}catch{}return!1}function kk(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Ar(t,e,r={}){if(Sk(t,r.env))return;(r.warn??console.warn)(kk(t,e))}var Ps=E(()=>{"use strict"});function Af(t={}){return Ar("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${Ik}`]}var vk,Ik,Rf=E(()=>{"use strict";Ps();vk=864e5,Ik=vk/1e3});import{spawn as $k}from"node:child_process";import{createInterface as Nk}from"node:readline";import{existsSync as xk,readFileSync as jk}from"node:fs";import{fileURLToPath as Ak}from"node:url";function Rk(t){return t==="plan"?"read-only":"danger-full-access"}function Lk(){return{clientInfo:{name:"lmctl",title:"lmctl",version:Ok},capabilities:{experimentalApi:!1}}}function Ft(t,e){bt(`[codex:${t}] ${JSON.stringify(e)}`)}function Ck(){return{agentItems:new Map,resultText:""}}function Of(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function Mk(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function Dk(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Pk(){return{pendingCodexError:null}}function Fk(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
938
+ `),bt(`stream-json: prompt sent (${t.length} chars)`)})}var mk,wk,Rf=E(()=>{"use strict";xr();Ms();En();Je();mk={claude:"claude",qwen:"qwen"};wk={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as yk,constants as Ek}from"node:fs";import{delimiter as bk,join as Tk}from"node:path";function Sk(t,e=process.env){let r=e.PATH??"";for(let n of r.split(bk))if(n)try{return yk(Tk(n,t),Ek.X_OK),!0}catch{}return!1}function kk(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Ar(t,e,r={}){if(Sk(t,r.env))return;(r.warn??console.warn)(kk(t,e))}var Ps=E(()=>{"use strict"});function Of(t={}){return Ar("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${Ik}`]}var vk,Ik,Lf=E(()=>{"use strict";Ps();vk=864e5,Ik=vk/1e3});import{spawn as $k}from"node:child_process";import{createInterface as Nk}from"node:readline";import{existsSync as xk,readFileSync as jk}from"node:fs";import{fileURLToPath as Ak}from"node:url";function Rk(t){return t==="plan"?"read-only":"danger-full-access"}function Lk(){return{clientInfo:{name:"lmctl",title:"lmctl",version:Ok},capabilities:{experimentalApi:!1}}}function Ft(t,e){bt(`[codex:${t}] ${JSON.stringify(e)}`)}function Ck(){return{agentItems:new Map,resultText:""}}function Cf(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function Mk(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function Dk(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Pk(){return{pendingCodexError:null}}function Fk(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
939
939
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
940
940
  ${e}
941
941
 
942
- ${r}`:r}function Uk(t,e){let r=Dk(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function Wk(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function Lf(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`),e.alias?.toLowerCase()==="lead"&&o.push(...Af());let i=e.permissionMode??"yolo",a=Rk(i);try{Pt("codex",o,i)}catch(R){return n(R)}if(e.cwd&&!xk(e.cwd))return te({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let l=$k(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:e.env||process.env}),c=!1;if(e.signal){if(e.signal.aborted)return c=!0,te({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),Ze(l).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,te({event:"transport_abort",provider:"codex"}),Ze(l).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=Nk({input:l.stdout}),d=new Map,f=1,m=e.threadId||"",p="",h=!1,g=!1,_=Date.now(),T=Ck(),S=Pk();function I(R,L={}){return new Promise((B,ee)=>{let x=f++;d.set(x,{resolve:B,reject:ee});let H=JSON.stringify({jsonrpc:"2.0",id:x,method:R,params:L});l.stdin?.write(H+`
942
+ ${r}`:r}function Uk(t,e){let r=Dk(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function Wk(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function Mf(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`),e.alias?.toLowerCase()==="lead"&&o.push(...Of());let i=e.permissionMode??"yolo",a=Rk(i);try{Pt("codex",o,i)}catch(R){return n(R)}if(e.cwd&&!xk(e.cwd))return te({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let l=$k(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:e.env||process.env}),c=!1;if(e.signal){if(e.signal.aborted)return c=!0,te({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),Ze(l).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,te({event:"transport_abort",provider:"codex"}),Ze(l).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=Nk({input:l.stdout}),d=new Map,f=1,m=e.threadId||"",p="",h=!1,g=!1,_=Date.now(),T=Ck(),S=Pk();function I(R,L={}){return new Promise((B,ee)=>{let x=f++;d.set(x,{resolve:B,reject:ee});let H=JSON.stringify({jsonrpc:"2.0",id:x,method:R,params:L});l.stdin?.write(H+`
943
943
  `)})}function v(R,L={}){let B=JSON.stringify({jsonrpc:"2.0",method:R,params:L});l.stdin?.write(B+`
944
- `)}u.on("line",R=>{let L;try{L=JSON.parse(R)}catch{return}if(typeof L.id=="number"&&d.has(L.id)){let x=d.get(L.id);if(d.delete(L.id),L.error){let H=L.error,me=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(L.error);x.reject(Cs(`codex app-server error: ${me}`,H))}else x.resolve(L);e.onEvent?.(L);return}let B=L.method;if(!B){e.onEvent?.(L);return}if(B==="thread/started"){let H=L.params?.thread;H?.id&&(m=H.id)}let ee=at()?x=>{Ft("item.text/buffer-mismatch",{itemId:x.itemId,threadId:x.threadId??null,turnId:x.turnId??null,expectedFromItemText:x.expectedFromItemText,gotFromBuffer:x.gotFromBuffer,expectedLen:x.expectedFromItemText.length,gotLen:x.gotFromBuffer.length})}:void 0;if(B==="turn/started"){let x=L.params,H=x?.turn;H?.id&&(p=H.id),Of(L,T,e.onDelta,ee),at()&&Ft("turn/started",{params:x??null})}if(at()&&(B==="item/started"||B==="item/completed")){let x=L.params;x?.item?.type==="agentMessage"&&Ft(B,{params:x??null})}if(B==="item/started"||B==="item/agentMessage/delta"||B==="item/completed"){if(B==="item/agentMessage/delta"){let x=L.params;at()&&Ft("agentMessage/delta",{params:x??null})}Of(L,T,e.onDelta,ee)}if(B==="turn/completed"){let x=L.params;if(at())for(let[me,$]of T.agentItems.entries())$.buffer&&Ft("turn/completed/unflushed-item",{itemId:me,phase:$.phase,bufferLen:$.buffer.length});Mk(T),at()&&Ft("turn/completed",{params:x??null});let H=Wk(L,S);H.shouldReject?(at()&&Ft("turn/completed/terminal-reject",{message:H.turnError.message}),g=!0,h=!0,l.stdin?.end(),n(H.turnError)):(h=!0,l.stdin?.end())}if(B==="error"){let x=Uk(L,S);if(at()){let H=L.params,me=H?.error,$=typeof me?.message=="string"?me.message:"(no message)";Ft(x.willRetry?"error/retry":"error/terminal-deferred",{message:$,willRetry:x.willRetry,params:H??null})}}e.onEvent?.(L)});let k="";l.stderr?.on("data",R=>{k+=R.toString()}),l.on("error",R=>{te({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:R.message}),n(new ye(`Failed to spawn codex app-server: ${R.message}`,{cause:R}))}),l.on("exit",R=>{if(!c&&!g){if(h){r({result:T.resultText,threadId:m,turnId:p,durationMs:Date.now()-_,exitCode:R});return}if(S.pendingCodexError){n(S.pendingCodexError);return}te({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:R,stderr_tail:k.slice(0,500)}),n(new Error(Fk({exitCode:R,stderr:k})))}}),(async()=>{try{if(await I("initialize",Lk()),v("initialized",{}),e.threadId)try{let R=I("thread/resume",{threadId:e.threadId,sandbox:a,approvalPolicy:"never",...e.model?{model:e.model}:{}}),L=new Promise((B,ee)=>setTimeout(()=>ee(new Error("resume timeout")),5e3));await Promise.race([R,L]),m=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
945
- `);let L=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(m=L.id)}else{let L=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(m=L.id)}await I("turn/start",{threadId:m,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(R){Ze(l).catch(()=>{}),n(R instanceof Error?R:new Error(String(R)))}})()})}var Ok,Cf=E(()=>{"use strict";Je();Je();xr();Ms();En();Rf();Je();Ok=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(jk(Ak(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function xa(){return{deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Mf.map(t=>[t,{name:t}]))},openrouter:{npm:"@ai-sdk/openai-compatible",name:"OpenRouter",options:{baseURL:"https://openrouter.ai/api/v1",apiKey:"{env:OPENROUTER_API_KEY}"},models:Object.fromEntries(Df.map(t=>[t,{name:t}]))}}}function Pf(){return[...Bk,...Mf.map(t=>`deepseek/${t}`),...Df.map(t=>`openrouter/${t}`)].sort()}var Bk,Mf,Df,ja=E(()=>{"use strict";Bk=["github-copilot/claude-haiku-4.5","github-copilot/gpt-5-mini"],Mf=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],Df=["qwen/qwen3-coder","qwen/qwen3-coder-plus","qwen/qwen3-coder-flash","qwen/qwen3.5-9b","qwen/qwen3.5-397b-a17b","qwen/qwen3.5-plus-20260420","qwen/qwen3.6-flash","qwen/qwen3.6-plus","qwen/qwen3.6-max-preview","qwen/qwen3.7-plus"]});import{existsSync as qk,mkdirSync as Hk,readFileSync as Jk,writeFileSync as Ff}from"node:fs";import{join as Uf}from"node:path";function Bf(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:Xk}}function Gk(t,e){return JSON.stringify(t)===JSON.stringify(e)}function Vk(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 Fs(t,e={}){let r=Uf(t,".opencode"),n=Uf(r,"opencode.json");if(Ar("lmctl","lmctl_chat",e),!qk(n)){Hk(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:xa(),mcp:{lmctl:Bf()}},null,2);return Ff(n,l+`
946
- `,"utf-8"),!0}let s;try{s=JSON.parse(Jk(n,"utf-8"))}catch{return console.log(Wf.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Wf.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;s.permission===void 0&&(s.permission="allow",o=!0),Vk(s.permission)||te({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),Kk(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=Bf();return Gk(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&Ff(n,JSON.stringify(s,null,2)+`
947
- `,"utf-8"),o}function Kk(t){let e=xa(),r=bn(t.provider)?t.provider:{},n=!bn(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=o,n=!0;continue}if(!bn(i))continue;let a={...i};a.npm===void 0&&(a.npm=o.npm,n=!0),a.name===void 0&&(a.name=o.name,n=!0);let l=bn(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=d,n=!0);a.options=l;let c=bn(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models))c[u]===void 0&&(c[u]=d,n=!0);a.models=c,r[s]=a}return n&&(t.provider=r),n}function bn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Wf,Xk,Aa=E(()=>{"use strict";Je();ja();Ps();Wf={yellow:t=>t},Xk=864e5});import{spawn as Yk}from"node:child_process";import{existsSync as zk}from"node:fs";import{createInterface as Zk}from"node:readline";function Qk(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
944
+ `)}u.on("line",R=>{let L;try{L=JSON.parse(R)}catch{return}if(typeof L.id=="number"&&d.has(L.id)){let x=d.get(L.id);if(d.delete(L.id),L.error){let H=L.error,me=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(L.error);x.reject(Cs(`codex app-server error: ${me}`,H))}else x.resolve(L);e.onEvent?.(L);return}let B=L.method;if(!B){e.onEvent?.(L);return}if(B==="thread/started"){let H=L.params?.thread;H?.id&&(m=H.id)}let ee=at()?x=>{Ft("item.text/buffer-mismatch",{itemId:x.itemId,threadId:x.threadId??null,turnId:x.turnId??null,expectedFromItemText:x.expectedFromItemText,gotFromBuffer:x.gotFromBuffer,expectedLen:x.expectedFromItemText.length,gotLen:x.gotFromBuffer.length})}:void 0;if(B==="turn/started"){let x=L.params,H=x?.turn;H?.id&&(p=H.id),Cf(L,T,e.onDelta,ee),at()&&Ft("turn/started",{params:x??null})}if(at()&&(B==="item/started"||B==="item/completed")){let x=L.params;x?.item?.type==="agentMessage"&&Ft(B,{params:x??null})}if(B==="item/started"||B==="item/agentMessage/delta"||B==="item/completed"){if(B==="item/agentMessage/delta"){let x=L.params;at()&&Ft("agentMessage/delta",{params:x??null})}Cf(L,T,e.onDelta,ee)}if(B==="turn/completed"){let x=L.params;if(at())for(let[me,$]of T.agentItems.entries())$.buffer&&Ft("turn/completed/unflushed-item",{itemId:me,phase:$.phase,bufferLen:$.buffer.length});Mk(T),at()&&Ft("turn/completed",{params:x??null});let H=Wk(L,S);H.shouldReject?(at()&&Ft("turn/completed/terminal-reject",{message:H.turnError.message}),g=!0,h=!0,l.stdin?.end(),n(H.turnError)):(h=!0,l.stdin?.end())}if(B==="error"){let x=Uk(L,S);if(at()){let H=L.params,me=H?.error,$=typeof me?.message=="string"?me.message:"(no message)";Ft(x.willRetry?"error/retry":"error/terminal-deferred",{message:$,willRetry:x.willRetry,params:H??null})}}e.onEvent?.(L)});let k="";l.stderr?.on("data",R=>{k+=R.toString()}),l.on("error",R=>{te({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:R.message}),n(new ye(`Failed to spawn codex app-server: ${R.message}`,{cause:R}))}),l.on("exit",R=>{if(!c&&!g){if(h){r({result:T.resultText,threadId:m,turnId:p,durationMs:Date.now()-_,exitCode:R});return}if(S.pendingCodexError){n(S.pendingCodexError);return}te({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:R,stderr_tail:k.slice(0,500)}),n(new Error(Fk({exitCode:R,stderr:k})))}}),(async()=>{try{if(await I("initialize",Lk()),v("initialized",{}),e.threadId)try{let R=I("thread/resume",{threadId:e.threadId,sandbox:a,approvalPolicy:"never",...e.model?{model:e.model}:{}}),L=new Promise((B,ee)=>setTimeout(()=>ee(new Error("resume timeout")),5e3));await Promise.race([R,L]),m=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
945
+ `);let L=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(m=L.id)}else{let L=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(m=L.id)}await I("turn/start",{threadId:m,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(R){Ze(l).catch(()=>{}),n(R instanceof Error?R:new Error(String(R)))}})()})}var Ok,Df=E(()=>{"use strict";Je();Je();xr();Ms();En();Lf();Je();Ok=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(jk(Ak(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function ja(){return{deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Pf.map(t=>[t,{name:t}]))},openrouter:{npm:"@ai-sdk/openai-compatible",name:"OpenRouter",options:{baseURL:"https://openrouter.ai/api/v1",apiKey:"{env:OPENROUTER_API_KEY}"},models:Object.fromEntries(Ff.map(t=>[t,{name:t}]))}}}function Uf(){return[...Bk,...Pf.map(t=>`deepseek/${t}`),...Ff.map(t=>`openrouter/${t}`)].sort()}var Bk,Pf,Ff,Aa=E(()=>{"use strict";Bk=["github-copilot/claude-haiku-4.5","github-copilot/gpt-5-mini"],Pf=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],Ff=["qwen/qwen3-coder","qwen/qwen3-coder-plus","qwen/qwen3-coder-flash","qwen/qwen3.5-9b","qwen/qwen3.5-397b-a17b","qwen/qwen3.5-plus-20260420","qwen/qwen3.6-flash","qwen/qwen3.6-plus","qwen/qwen3.6-max-preview","qwen/qwen3.7-plus"]});import{existsSync as qk,mkdirSync as Hk,readFileSync as Jk,writeFileSync as Wf}from"node:fs";import{join as Bf}from"node:path";function Hf(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:Xk}}function Gk(t,e){return JSON.stringify(t)===JSON.stringify(e)}function Vk(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 Fs(t,e={}){let r=Bf(t,".opencode"),n=Bf(r,"opencode.json");if(Ar("lmctl","lmctl_chat",e),!qk(n)){Hk(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:ja(),mcp:{lmctl:Hf()}},null,2);return Wf(n,l+`
946
+ `,"utf-8"),!0}let s;try{s=JSON.parse(Jk(n,"utf-8"))}catch{return console.log(qf.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(qf.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;s.permission===void 0&&(s.permission="allow",o=!0),Vk(s.permission)||te({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),Kk(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=Hf();return Gk(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&Wf(n,JSON.stringify(s,null,2)+`
947
+ `,"utf-8"),o}function Kk(t){let e=ja(),r=bn(t.provider)?t.provider:{},n=!bn(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=o,n=!0;continue}if(!bn(i))continue;let a={...i};a.npm===void 0&&(a.npm=o.npm,n=!0),a.name===void 0&&(a.name=o.name,n=!0);let l=bn(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=d,n=!0);a.options=l;let c=bn(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models))c[u]===void 0&&(c[u]=d,n=!0);a.models=c,r[s]=a}return n&&(t.provider=r),n}function bn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var qf,Xk,Ra=E(()=>{"use strict";Je();Aa();Ps();qf={yellow:t=>t},Xk=864e5});import{spawn as Yk}from"node:child_process";import{existsSync as zk}from"node:fs";import{createInterface as Zk}from"node:readline";function Qk(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
948
948
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
949
949
  ${e}
950
950
 
951
- ${r}`:r}function av(t){let e=[...t.matchAll(rv)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return qf(t.slice(n).trimStart())}return qf(lv(t.replace(nv,"")))}function lv(t){let e=sv.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(ov)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function qf(t){let e=[...t.matchAll(iv)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function Jf(t,e){let r=ev[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{Fs(e.cwd)}catch(v){te({event:"opencode_config_install_failed",cwd:e.cwd,error_message:v instanceof Error?v.message:String(v)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let v=jr("gemini","plan"),k=jr("gemini","yolo");a=a.filter(R=>!(k??[]).includes(R)),v&&a.push(...v)}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.
951
+ ${r}`:r}function av(t){let e=[...t.matchAll(rv)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Jf(t.slice(n).trimStart())}return Jf(lv(t.replace(nv,"")))}function lv(t){let e=sv.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(ov)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Jf(t){let e=[...t.matchAll(iv)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function Gf(t,e){let r=ev[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{Fs(e.cwd)}catch(v){te({event:"opencode_config_install_failed",cwd:e.cwd,error_message:v instanceof Error?v.message:String(v)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let v=jr("gemini","plan"),k=jr("gemini","yolo");a=a.filter(R=>!(k??[]).includes(R)),v&&a.push(...v)}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.
952
952
  `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Pt(e.tool,a,l)}catch(v){return s(v)}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.
953
953
  `),e.cwd&&!zk(e.cwd))return te({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Yk(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:e.env||process.env}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,te({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),Ze(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,te({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),Ze(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=Zk({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1;function T(v,k={}){return new Promise((R,L)=>{let B=tv++;m.set(B,{resolve:R,reject:L});let ee=JSON.stringify({jsonrpc:"2.0",id:B,method:v,params:k});Dt({event:"acp_send",direction:"SEND",provider:e.tool,method:v,id:B,params:k}),c.stdin?.write(ee+`
954
954
  `)})}f.on("line",v=>{let k;try{k=JSON.parse(v)}catch{return}if(Dt({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof k.id=="number"?k.id:void 0,method:typeof k.method=="string"?k.method:void 0,preview:JSON.stringify(k).slice(0,300)}),e.onEvent?.(k),typeof k.id=="number"&&m.has(k.id)){let L=m.get(k.id);if(m.delete(k.id),k.error){let B=k.error,ee=typeof B?.message=="string"&&B.message.length>0?B.message:JSON.stringify(k.error);L.reject(Cs(`ACP RPC error: ${ee}`,B))}else L.resolve(k);return}let R=k.method;if(R){if(typeof k.id=="number"){te({event:"acp_unhandled_request",provider:e.tool,method:R,id:k.id,params:k.params});let L=JSON.stringify({jsonrpc:"2.0",id:k.id,error:{code:-32601,message:`Method not found: ${R} (lmctl does not implement server-side ACP methods)`}});Dt({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:k.id,error:"method not found"}),c.stdin?.write(L+`
955
955
  `);return}if(R==="session/update"){let B=k.params?.update;if(B?.sessionUpdate==="agent_message_chunk"){let x=B.content?.text||"";x&&(h+=x,e.onDelta?.(x))}}}});let S="";c.stderr?.on("data",v=>{S+=v.toString()}),c.on("error",v=>{te({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:v.message,elapsed_ms:Date.now()-u}),s(new ye(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${v.message}`,{cause:v}))}),c.on("exit",v=>{d||(_?n({result:e.tool==="gemini"?av(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:v}):(te({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:v,stderr_tail:S.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(Qk({tool:e.tool,exitCode:v,stderr:S})))))});function I(v,k={}){let R=JSON.stringify({jsonrpc:"2.0",method:v,params:k});c.stdin?.write(R+`
956
956
  `)}(async()=>{try{if(await T("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),I("notifications/initialized"),e.sessionId)try{p=(await T("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(k){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${k instanceof Error?k.message:String(k)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
957
957
  `),p=(await T("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await T("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await T("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),bt(`acp: set_config_option(model=${e.model}) ok`)}catch(k){let R=k instanceof Error?k.message:String(k);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${R}
958
- `)}bt(`acp: prompt sent (${t.length} chars)`),g=(await T("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,bt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(v){Ze(c).catch(()=>{}),s(v instanceof Error?v:new Error(String(v)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var ev,tv,Hf,rv,nv,sv,ov,iv,Xf=E(()=>{"use strict";Je();xr();Ms();En();Aa();Je();ev={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},tv=1,Hf="(?:png|jpe?g|webp|heic|pdf)",rv=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Hf}\\s*`,"gi"),nv=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Hf}\\s*`,"i"),sv=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,ov=/^STANCE:\s+\S+\s*$/gim,iv=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Gf(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=cv){let n=t.keys().next().value;n!==void 0&&t.delete(n)}t.set(r.id,Date.now()),e(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=t.get(r.id);if(n!==void 0){e({...r,elapsedMs:Date.now()-n}),t.delete(r.id);return}}e(r)}}function uv(){let t=new Map;return(e,r)=>{dv(e,Gf(t,r))}}function dv(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(he(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:he(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
958
+ `)}bt(`acp: prompt sent (${t.length} chars)`),g=(await T("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,bt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(v){Ze(c).catch(()=>{}),s(v instanceof Error?v:new Error(String(v)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var ev,tv,Xf,rv,nv,sv,ov,iv,Vf=E(()=>{"use strict";Je();xr();Ms();En();Ra();Je();ev={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},tv=1,Xf="(?:png|jpe?g|webp|heic|pdf)",rv=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Xf}\\s*`,"gi"),nv=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Xf}\\s*`,"i"),sv=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,ov=/^STANCE:\s+\S+\s*$/gim,iv=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Kf(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=cv){let n=t.keys().next().value;n!==void 0&&t.delete(n)}t.set(r.id,Date.now()),e(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=t.get(r.id);if(n!==void 0){e({...r,elapsedMs:Date.now()-n}),t.delete(r.id);return}}e(r)}}function uv(){let t=new Map;return(e,r)=>{dv(e,Kf(t,r))}}function dv(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(he(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:he(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
959
959
  `).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(`
960
- `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:o})}else i&&e({kind:"other",summary:i,raw:o})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function Us(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?uv():void 0,s=await xf(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function fv(){let t=new Map;return(e,r)=>{mv(e,Gf(t,r))}}function mv(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:he(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:he(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=he(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:he(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${he(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function Rr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Dt({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?fv():void 0,s=await Jf(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function pv(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${he(i,120)}`}:{kind:"other",summary:`codex error: ${he(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:he(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:he(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:he(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:he(s)}:{kind:"text",summary:he(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
960
+ `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:o})}else i&&e({kind:"other",summary:i,raw:o})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function Us(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?uv():void 0,s=await Af(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function fv(){let t=new Map;return(e,r)=>{mv(e,Kf(t,r))}}function mv(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:he(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:he(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=he(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:he(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${he(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function Rr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Dt({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?fv():void 0,s=await Gf(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function pv(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${he(i,120)}`}:{kind:"other",summary:`codex error: ${he(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:he(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:he(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:he(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:he(s)}:{kind:"text",summary:he(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
961
961
  `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let o=s.split(`
962
- `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Vf(t,e){let r=await Lf(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>pv(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var cv,ir=E(()=>{"use strict";jf();Cf();Xf();Je();cv=256});function Oa(t){return new Ra(t)}var Ra,La=E(()=>{"use strict";_f();Mt();ir();wt();Ra=class extends je{constructor(e){super({provider:new As(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Ie,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Us})}}});import{readdir as hv,stat as Kf,unlink as _v}from"node:fs/promises";import{join as Tn,basename as gv}from"node:path";function wv(t,e,r){return`${t}|${e.toISOString()}|${r}`}function Sn(t,e,r){let n=wv(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Yf(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function yv(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 Ws(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return Ws(r)}).filter(r=>r.length>0).join(`
963
- `);try{return JSON.stringify(t)}catch{return String(t)}}async function zf(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Me(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=yv(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var Bs,Zf=E(()=>{"use strict";Ct();Bs=class{name="codex";codexDirs;constructor(e={}){let r=[Tn(be,".codex"),Tn(be,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Tn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Tn(r,"sessions");try{await Kf(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await hv(e)}catch{return r}for(let s of n){let o=Tn(e,s),i=await Kf(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=gv(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await Ae(e,30),n=await ve(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=G(h.text.trim(),80)),u=G(h.text.trim(),80))}}if(!o)return null;let m=await zf(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:Yf(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await ve(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Me(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Yf(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let T of _.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let S=T.text.trim();c||(c=G(S,80)),u=G(S,80),Sn(s,m,{role:"user",timestamp:g,content:ce(S)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&Sn(s,m,{role:"assistant",timestamp:g,content:ce(T.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let T of _.content)(T.type==="input_text"||T.type==="output_text")&&typeof T.text=="string"&&T.text&&Sn(s,m,{role:"system",timestamp:g,content:ce(T.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?ce(Ws(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:ce(Ws(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let T=_.summary.map(S=>Ws(S.text)).join(`
964
- `);T.trim()&&Sn(s,m,{role:"thinking",timestamp:g,content:ce(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Sn(s,m,{role:"thinking",timestamp:g,content:ce(_)})}}if(!o)return null;let p=await zf(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await _v(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Ae(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function Ma(t){return new Ca(t)}var Ca,Da=E(()=>{"use strict";Zf();Mt();ir();wt();Ca=class extends je{constructor(e){super({provider:new Bs(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:`${Ie}
965
- `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Vf})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function kn(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);if(e.length>1)try{let n=JSON.parse(e[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(t)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function qs(t){let e=kn(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=t.split(`
966
- `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let o=[],i=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let u=c;if(typeof u.id=="string"){let d=i.get(u.id);d?Ev(d,u):(o.push(u),i.set(u.id,u))}else o.push(u)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:o}}function Ev(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&Qf(t.tokens)&&Qf(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function Qf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function em(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let o of r)s.push(JSON.stringify(o));return s.join(`
962
+ `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Yf(t,e){let r=await Mf(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>pv(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var cv,ir=E(()=>{"use strict";Rf();Df();Vf();Je();cv=256});function La(t){return new Oa(t)}var Oa,Ca=E(()=>{"use strict";wf();Mt();ir();wt();Oa=class extends je{constructor(e){super({provider:new As(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Ie,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Us})}}});import{readdir as hv,stat as zf,unlink as _v}from"node:fs/promises";import{join as Tn,basename as gv}from"node:path";function wv(t,e,r){return`${t}|${e.toISOString()}|${r}`}function Sn(t,e,r){let n=wv(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Zf(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function yv(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 Ws(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return Ws(r)}).filter(r=>r.length>0).join(`
963
+ `);try{return JSON.stringify(t)}catch{return String(t)}}async function Qf(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Me(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=yv(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var Bs,em=E(()=>{"use strict";Ct();Bs=class{name="codex";codexDirs;constructor(e={}){let r=[Tn(be,".codex"),Tn(be,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Tn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Tn(r,"sessions");try{await zf(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await hv(e)}catch{return r}for(let s of n){let o=Tn(e,s),i=await zf(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=gv(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await Ae(e,30),n=await ve(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=G(h.text.trim(),80)),u=G(h.text.trim(),80))}}if(!o)return null;let m=await Qf(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:Zf(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await ve(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Me(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Zf(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let T of _.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let S=T.text.trim();c||(c=G(S,80)),u=G(S,80),Sn(s,m,{role:"user",timestamp:g,content:ce(S)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&Sn(s,m,{role:"assistant",timestamp:g,content:ce(T.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let T of _.content)(T.type==="input_text"||T.type==="output_text")&&typeof T.text=="string"&&T.text&&Sn(s,m,{role:"system",timestamp:g,content:ce(T.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?ce(Ws(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:ce(Ws(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let T=_.summary.map(S=>Ws(S.text)).join(`
964
+ `);T.trim()&&Sn(s,m,{role:"thinking",timestamp:g,content:ce(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Sn(s,m,{role:"thinking",timestamp:g,content:ce(_)})}}if(!o)return null;let p=await Qf(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await _v(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Ae(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function Da(t){return new Ma(t)}var Ma,Pa=E(()=>{"use strict";em();Mt();ir();wt();Ma=class extends je{constructor(e){super({provider:new Bs(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:`${Ie}
965
+ `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Yf})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function kn(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);if(e.length>1)try{let n=JSON.parse(e[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(t)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function qs(t){let e=kn(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=t.split(`
966
+ `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let o=[],i=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let u=c;if(typeof u.id=="string"){let d=i.get(u.id);d?Ev(d,u):(o.push(u),i.set(u.id,u))}else o.push(u)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:o}}function Ev(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&tm(t.tokens)&&tm(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function tm(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function rm(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let o of r)s.push(JSON.stringify(o));return s.join(`
967
967
  `)+`
968
- `}var Pa=E(()=>{"use strict"});import{createHash as bv}from"node:crypto";import{readdir as vn,readFile as tm,stat as Hs,unlink as Tv}from"node:fs/promises";import{join as Fe,basename as Sv,dirname as kv}from"node:path";import{cwd as vv}from"node:process";function rm(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function nm(t){return t==="user"}function Fa(t){return t==="gemini"||t==="assistant"}function ar(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Iv(t){return`${t.sessionId}\0${t.cwd}`}function $v(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function Js(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function sm(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Fa(a.type)||!a.tokens)continue;let l=Js(a.tokens.input),c=Js(a.tokens.cached),u=Math.max(l-c,0),d=Js(a.tokens.output),f=Js(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function Nv(t){return bv("sha256").update(t).digest("hex")}function In(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=kv(r);if(n===r)break;r=n}}var Xs,om=E(()=>{"use strict";Ct();Pa();Je();Xs=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Fe(be,".gemini");this.geminiProjectsFile=Fe(r,"projects.json"),this.geminiTmpDir=Fe(r,"tmp");let n=e.claudeDir||Fe(be,".claude");this.claudeProjectsDir=Fe(n,"projects");let s=[Fe(be,".codex"),Fe(be,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>Fe(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=Iv(s),i=r.get(o);r.set(o,i?$v(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await ve(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=ar(g.timestamp),T=g.type,S=ce(rm(g.content));if(nm(T)){let v=S.trim();v&&(u||(u=G(v,80)),d=G(v,80)),o.push({role:"user",timestamp:_,content:v||S});continue}if(Fa(T)){g.model&&(f=g.model);for(let v of g.thoughts||[]){let k=[v.subject,v.description].filter(Boolean).join(`
969
- `).trim();k&&o.push({role:"thinking",timestamp:ar(v.timestamp,_),content:ce(k)})}o.push({role:"assistant",timestamp:_,content:S,model:g.model});continue}let I=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${I}${S}`.trim()})}let m=ar(n.startTime,s.createdAt),p=ar(n.lastUpdated,s.modifiedAt),h=sm(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await ve(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(nm(m.type)){d++;let p=rm(m.content).trim();p&&(l||(l=G(ce(p),80)),c=G(ce(p),80))}else Fa(m.type)&&(d++,m.model&&(u=m.model));let f=sm(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:ar(r.startTime,n.createdAt),modifiedAt:ar(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await tm(e,"utf-8");if(kn(r)==="unknown")return te({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return qs(r)}catch{return null}}extractSessionIdFromFilename(e){let r=Sv(e).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let e=[],r;try{r=await vn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Fe(this.geminiTmpDir,n,"chats");if(!(await Hs(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await vn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Fe(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await Tv(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await ve(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:ar(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;In(e,vv());for(let n of this.extraWorkspacePaths)In(e,n);for(let n of await this.collectGeminiProjectPaths())In(e,n);for(let n of await this.collectCodexCwds())In(e,n);for(let n of await this.collectClaudeCwds())In(e,n);let r=new Map;for(let n of e)r.set(Nv(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await tm(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Ae(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await vn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Fe(this.claudeProjectsDir,n);if(!(await Hs(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await vn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Fe(s,a),u=(await Ae(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Hs(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await vn(e)}catch{return r}for(let o of s){let i=Fe(e,o),a=await Hs(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as xv,writeFileSync as jv,mkdirSync as Av}from"node:fs";import{join as Rv,dirname as Ov}from"node:path";import{randomUUID as Lv}from"node:crypto";function Wa(t){return new Ua(t)}var Ua,Ba=E(()=>{"use strict";om();Mt();ir();wt();Pa();Ua=class extends je{constructor(e){super({provider:new Xs(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",Ie,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Rr(r,{...n,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
970
- `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Os,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,r){let n=await this.resolvePath(e);if(!n)return{success:!1,error:`Session file not found for ${e}`};try{let s=xv(n,"utf-8"),o=kn(s),i=qs(s),a=Lv();i.sessionId=a,i.kind="main";let l=Ov(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=Rv(l,d);return Av(l,{recursive:!0}),jv(f,em(i,o),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as im,readFile as Cv,rm as Mv,stat as Or}from"node:fs/promises";import{basename as Dv,join as Qe}from"node:path";function Pv(t){let e={};for(let r of t.split(`
971
- `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function lr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function Fv(t){let e=0;for await(let r of Me(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Gs,am=E(()=>{"use strict";Ct();Gs=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||Qe(be,".copilot");this.sessionStateDir=Qe(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await im(this.sessionStateDir)}catch{return e}for(let n of r){let s=Qe(this.sessionStateDir,n);if((await Or(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=Qe(r,"events.jsonl"),o=await Or(s).catch(()=>null),i=o?s:Qe(r,"workspace.yaml"),a=await ve(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||Dv(r)||e;if(o)for await(let _ of Me(s)){let T=lr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=lr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let S=_.data.content||"",I=S.trim();I&&(m||(m=G(I,80)),p=G(I,80)),l.push({role:"user",timestamp:T,content:ce(I||S)});continue}if(_.type==="assistant.message"&&_.data){let S=(_.data.content||"").trim();if(S&&l.push({role:"assistant",timestamp:T,content:ce(S),model:u}),_.data.toolRequests)for(let I of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:I.name||"unknown tool",toolName:I.name,toolInput:I.arguments?JSON.stringify(I.arguments,null,2):void 0,toolCallId:I.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let S=_.data.result?.content||"",I=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:ce(S),toolDetailedContent:I?ce(I):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:ce(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let S=_.data?.message||"";S.trim()&&l.push({role:"system",timestamp:T,content:ce(S)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??lr(n?.created_at)??a.createdAt,modifiedAt:lr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=Qe(e,"events.jsonl"),o=await Or(s).catch(()=>null),i=o?s:Qe(e,"workspace.yaml"),a=await ve(o?s:e),l=o?await Ae(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=lr(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let T=(_.data.content||"").trim();T&&(p||(p=G(T,80)),h=G(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=o?await Fv(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??lr(n?.created_at)??a.createdAt,modifiedAt:lr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=Qe(e,"workspace.yaml");try{let n=await Cv(r,"utf-8");return Pv(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await Mv(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await im(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=Qe(this.sessionStateDir,e);if((await Or(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=Qe(this.sessionStateDir,s);(await Or(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=Qe(this.sessionStateDir,s);if(!(await Or(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function qa(t){return new je({provider:new Gs(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Ie,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>Rr(e,{...r,acpTool:"copilot"})})}var Ha=E(()=>{"use strict";am();Mt();ir();wt()});import{existsSync as lm}from"node:fs";import{join as Vs}from"node:path";import{createRequire as Uv}from"node:module";function cm(){return Ja===null&&(Ja=Uv(import.meta.url)("node:sqlite").DatabaseSync),Ja}function Wv(){let t=process.env.XDG_DATA_HOME||Vs(be,".local","share"),e=process.env.XDG_CONFIG_HOME||Vs(be,".config");return[Vs(t,"opencode","opencode.db"),Vs(e,"opencode","opencode.db")]}var Ja,Ks,um=E(()=>{"use strict";Ct();Ja=null;Ks=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=Wv().find(r=>lm(r))??null}openDb(){return!this.dbPath||!lm(this.dbPath)?null:new(cm())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
968
+ `}var Fa=E(()=>{"use strict"});import{createHash as bv}from"node:crypto";import{readdir as vn,readFile as nm,stat as Hs,unlink as Tv}from"node:fs/promises";import{join as Fe,basename as Sv,dirname as kv}from"node:path";import{cwd as vv}from"node:process";function sm(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function om(t){return t==="user"}function Ua(t){return t==="gemini"||t==="assistant"}function ar(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Iv(t){return`${t.sessionId}\0${t.cwd}`}function $v(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function Js(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function im(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Ua(a.type)||!a.tokens)continue;let l=Js(a.tokens.input),c=Js(a.tokens.cached),u=Math.max(l-c,0),d=Js(a.tokens.output),f=Js(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function Nv(t){return bv("sha256").update(t).digest("hex")}function In(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=kv(r);if(n===r)break;r=n}}var Xs,am=E(()=>{"use strict";Ct();Fa();Je();Xs=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Fe(be,".gemini");this.geminiProjectsFile=Fe(r,"projects.json"),this.geminiTmpDir=Fe(r,"tmp");let n=e.claudeDir||Fe(be,".claude");this.claudeProjectsDir=Fe(n,"projects");let s=[Fe(be,".codex"),Fe(be,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>Fe(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=Iv(s),i=r.get(o);r.set(o,i?$v(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await ve(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=ar(g.timestamp),T=g.type,S=ce(sm(g.content));if(om(T)){let v=S.trim();v&&(u||(u=G(v,80)),d=G(v,80)),o.push({role:"user",timestamp:_,content:v||S});continue}if(Ua(T)){g.model&&(f=g.model);for(let v of g.thoughts||[]){let k=[v.subject,v.description].filter(Boolean).join(`
969
+ `).trim();k&&o.push({role:"thinking",timestamp:ar(v.timestamp,_),content:ce(k)})}o.push({role:"assistant",timestamp:_,content:S,model:g.model});continue}let I=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${I}${S}`.trim()})}let m=ar(n.startTime,s.createdAt),p=ar(n.lastUpdated,s.modifiedAt),h=im(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await ve(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(om(m.type)){d++;let p=sm(m.content).trim();p&&(l||(l=G(ce(p),80)),c=G(ce(p),80))}else Ua(m.type)&&(d++,m.model&&(u=m.model));let f=im(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:ar(r.startTime,n.createdAt),modifiedAt:ar(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await nm(e,"utf-8");if(kn(r)==="unknown")return te({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return qs(r)}catch{return null}}extractSessionIdFromFilename(e){let r=Sv(e).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let e=[],r;try{r=await vn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Fe(this.geminiTmpDir,n,"chats");if(!(await Hs(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await vn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Fe(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await Tv(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await ve(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:ar(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;In(e,vv());for(let n of this.extraWorkspacePaths)In(e,n);for(let n of await this.collectGeminiProjectPaths())In(e,n);for(let n of await this.collectCodexCwds())In(e,n);for(let n of await this.collectClaudeCwds())In(e,n);let r=new Map;for(let n of e)r.set(Nv(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await nm(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Ae(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await vn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Fe(this.claudeProjectsDir,n);if(!(await Hs(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await vn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Fe(s,a),u=(await Ae(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Hs(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await vn(e)}catch{return r}for(let o of s){let i=Fe(e,o),a=await Hs(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as xv,writeFileSync as jv,mkdirSync as Av}from"node:fs";import{join as Rv,dirname as Ov}from"node:path";import{randomUUID as Lv}from"node:crypto";function Ba(t){return new Wa(t)}var Wa,qa=E(()=>{"use strict";am();Mt();ir();wt();Fa();Wa=class extends je{constructor(e){super({provider:new Xs(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",Ie,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Rr(r,{...n,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
970
+ `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Os,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,r){let n=await this.resolvePath(e);if(!n)return{success:!1,error:`Session file not found for ${e}`};try{let s=xv(n,"utf-8"),o=kn(s),i=qs(s),a=Lv();i.sessionId=a,i.kind="main";let l=Ov(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=Rv(l,d);return Av(l,{recursive:!0}),jv(f,rm(i,o),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as lm,readFile as Cv,rm as Mv,stat as Or}from"node:fs/promises";import{basename as Dv,join as Qe}from"node:path";function Pv(t){let e={};for(let r of t.split(`
971
+ `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function lr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function Fv(t){let e=0;for await(let r of Me(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Gs,cm=E(()=>{"use strict";Ct();Gs=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||Qe(be,".copilot");this.sessionStateDir=Qe(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await lm(this.sessionStateDir)}catch{return e}for(let n of r){let s=Qe(this.sessionStateDir,n);if((await Or(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=Qe(r,"events.jsonl"),o=await Or(s).catch(()=>null),i=o?s:Qe(r,"workspace.yaml"),a=await ve(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||Dv(r)||e;if(o)for await(let _ of Me(s)){let T=lr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=lr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let S=_.data.content||"",I=S.trim();I&&(m||(m=G(I,80)),p=G(I,80)),l.push({role:"user",timestamp:T,content:ce(I||S)});continue}if(_.type==="assistant.message"&&_.data){let S=(_.data.content||"").trim();if(S&&l.push({role:"assistant",timestamp:T,content:ce(S),model:u}),_.data.toolRequests)for(let I of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:I.name||"unknown tool",toolName:I.name,toolInput:I.arguments?JSON.stringify(I.arguments,null,2):void 0,toolCallId:I.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let S=_.data.result?.content||"",I=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:ce(S),toolDetailedContent:I?ce(I):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:ce(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let S=_.data?.message||"";S.trim()&&l.push({role:"system",timestamp:T,content:ce(S)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??lr(n?.created_at)??a.createdAt,modifiedAt:lr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=Qe(e,"events.jsonl"),o=await Or(s).catch(()=>null),i=o?s:Qe(e,"workspace.yaml"),a=await ve(o?s:e),l=o?await Ae(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=lr(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let T=(_.data.content||"").trim();T&&(p||(p=G(T,80)),h=G(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=o?await Fv(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??lr(n?.created_at)??a.createdAt,modifiedAt:lr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=Qe(e,"workspace.yaml");try{let n=await Cv(r,"utf-8");return Pv(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await Mv(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await lm(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=Qe(this.sessionStateDir,e);if((await Or(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=Qe(this.sessionStateDir,s);(await Or(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=Qe(this.sessionStateDir,s);if(!(await Or(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function Ha(t){return new je({provider:new Gs(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Ie,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>Rr(e,{...r,acpTool:"copilot"})})}var Ja=E(()=>{"use strict";cm();Mt();ir();wt()});import{existsSync as um}from"node:fs";import{join as Vs}from"node:path";import{createRequire as Uv}from"node:module";function dm(){return Xa===null&&(Xa=Uv(import.meta.url)("node:sqlite").DatabaseSync),Xa}function Wv(){let t=process.env.XDG_DATA_HOME||Vs(be,".local","share"),e=process.env.XDG_CONFIG_HOME||Vs(be,".config");return[Vs(t,"opencode","opencode.db"),Vs(e,"opencode","opencode.db")]}var Xa,Ks,fm=E(()=>{"use strict";Ct();Xa=null;Ks=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=Wv().find(r=>um(r))??null}openDb(){return!this.dbPath||!um(this.dbPath)?null:new(dm())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
972
972
  s.time_created, s.time_updated
973
973
  FROM session s
974
974
  ORDER BY s.time_updated DESC`).all(),o=[];for(let i of s){let a=r.get(i.project_id),l=i.directory||a?.worktree||"(unknown)",c=e.prepare(`SELECT m.id, m.data, m.time_created FROM message m
975
975
  WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(i.id),u=0,d,f,m,p=[];for(let g of c){let _;try{_=JSON.parse(g.data)}catch{continue}m||(m=_.model?.modelID||_.modelID),(_.role==="user"||_.role==="assistant")&&u++,_.role==="user"&&p.push(g.id)}let h=[...p.length>0?[p[0]]:[],...p.length>1?[p[p.length-1]]:[]];for(let g of h){let _=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g),T=this.extractText(_);T&&(d||(d=G(T,80)),f=G(T,80))}o.push({provider:"opencode",sessionId:i.id,slug:i.slug,cwd:l,createdAt:new Date(i.time_created),modifiedAt:new Date(i.time_updated),model:m,startCommand:"opencode",firstUserMessage:d,lastUserMessage:f,messageCount:u,filePath:this.dbPath})}return o}finally{e.close()}}async loadSession(e){let r=this.openDb();if(!r)return null;try{let n=this.findSessionRow(r,e);return n?this.buildSessionDetail(r,n):null}finally{r.close()}}buildSessionDetail(e,r){let n=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),s=r.directory||n?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
976
976
  FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),i=[],a=0,l,c,u;for(let d of o){let f;try{f=JSON.parse(d.data)}catch{continue}l||(l=f.model?.modelID||f.modelID);let m=f.model?.modelID||f.modelID,p=new Date(f.time?.created||d.time_created),h=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(d.id);if(f.role==="user"){let g=this.extractText(h);g&&(c||(c=G(g,80)),u=G(g,80)),i.push({role:"user",timestamp:p,content:g||"(empty)"}),a++}else if(f.role==="assistant"){for(let g of h){let _;try{_=JSON.parse(g.data)}catch{continue}_.type==="text"&&_.text?i.push({role:"assistant",timestamp:p,content:_.text,model:m}):_.type==="reasoning"&&_.text?i.push({role:"thinking",timestamp:p,content:_.text}):_.type==="tool"&&_.tool&&(i.push({role:"tool_use",timestamp:p,content:`${_.tool}`,toolName:_.tool,toolCallId:_.callID,toolInput:_.state?.input?JSON.stringify(_.state.input):void 0}),(_.state?.output||_.state?.error)&&i.push({role:"tool_result",timestamp:p,content:_.state.error||_.state.output||"",toolCallId:_.callID}))}a++}}return{provider:"opencode",sessionId:r.id,slug:r.slug,cwd:s,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:l,startCommand:"opencode",firstUserMessage:c,lastUserMessage:u,messageCount:a,filePath:this.dbPath,messages:i}}extractText(e){let r=[];for(let n of e){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
977
- `).trim()}async resolveSessionPath(e){if(!this.dbPath)return null;let r=this.openDb();if(!r)return null;try{return this.findSessionRow(r,e)?this.dbPath:null}finally{r.close()}}async deleteSession(e){if(!this.dbPath)return!1;let r=new(cm())(this.dbPath,{open:!0});try{let n=this.findSessionRow(r,e);return n?r.prepare("DELETE FROM session WHERE id = ?").run(n.id).changes>0:!1}finally{r.close()}}findSessionRow(e,r){let n=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
977
+ `).trim()}async resolveSessionPath(e){if(!this.dbPath)return null;let r=this.openDb();if(!r)return null;try{return this.findSessionRow(r,e)?this.dbPath:null}finally{r.close()}}async deleteSession(e){if(!this.dbPath)return!1;let r=new(dm())(this.dbPath,{open:!0});try{let n=this.findSessionRow(r,e);return n?r.prepare("DELETE FROM session WHERE id = ?").run(n.id).changes>0:!1}finally{r.close()}}findSessionRow(e,r){let n=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
978
978
  s.time_created, s.time_updated
979
979
  FROM session s WHERE s.id = ?`).get(r);if(n)return n;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
980
980
  s.time_created, s.time_updated
981
981
  FROM session s
982
982
  WHERE s.id LIKE ?
983
983
  ORDER BY s.time_updated DESC
984
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Ga(){return new Xa}var Xa,Va=E(()=>{"use strict";um();Mt();ir();wt();Xa=class extends je{constructor(){super({provider:new Ks,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",Ie],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Rr(e,{...r,acpTool:"opencode"})})}}});import{readdir as Ys,readFile as Bv,rm as qv}from"node:fs/promises";import{basename as dm,join as Ut}from"node:path";function fm(t){return t.type==="user"||t.message?.role==="user"}function mm(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function pm(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
984
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Va(){return new Ga}var Ga,Ka=E(()=>{"use strict";fm();Mt();ir();wt();Ga=class extends je{constructor(){super({provider:new Ks,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",Ie],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Rr(e,{...r,acpTool:"opencode"})})}}});import{readdir as Ys,readFile as Bv,rm as qv}from"node:fs/promises";import{basename as mm,join as Ut}from"node:path";function pm(t){return t.type==="user"||t.message?.role==="user"}function hm(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function _m(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
985
985
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
986
- `):"":""}function hm(t){return t.model||t.message?.model}var zs,_m=E(()=>{"use strict";Ct();zs=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Ut(be,".qwen")}async discoverSessions(){let e=Ut(this.baseDir,"projects"),r;try{r=await Ys(e)}catch{return[]}let n=[];for(let s of r){let o=Ut(e,s,"chats"),i;try{i=await Ys(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Ut(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Ae(e,30);if(n.length===0)return null;let s=await ve(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),fm(d)){let f=pm(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(mm(d)){let f=hm(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=dm(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await ve(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Me(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(fm(f)){let h=pm(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(mm(f)){let h=hm(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=Ut(this.baseDir,"projects");try{let n=await Ys(r),s=[];for(let o of n){let i=Ut(r,o,"chats",`${e}.jsonl`);try{return await Bv(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Ut(r,o,"chats"),a;try{a=await Ys(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;dm(l,".jsonl").startsWith(e)&&s.push(Ut(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await qv(r),!0}catch{return!1}}}});function Ya(){return new Ka}var Ka,za=E(()=>{"use strict";_m();Mt();ir();wt();Ka=class extends je{constructor(){super({provider:new zs,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Ie,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Us})}}});import{readdir as gm,readFile as Hv,rm as wm,stat as ym}from"node:fs/promises";import{basename as Za,join as Tt}from"node:path";async function Jv(t){let e=await Promise.all(t.map(r=>ve(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function Xv(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Em(t){return t.type==="USER_INPUT"}function bm(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function Gv(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Tm(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Sm(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 Vv(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function Kv(t){for await(let e of Me(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=Yv(s);if(o)return o}let n=zv(e.content);if(n)return n}return null}function Yv(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function zv(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function km(t){if(t.endsWith(".db"))return Za(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Zs,vm=E(()=>{"use strict";Ct();Zs=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Tt(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Tt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Tt(this.baseDir,"conversations"),r;try{r=await gm(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Za(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Tt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Tt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await ym(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await Jv([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Ae(n,80);for(let f of d){let m=Sm(f.content);if(m&&(a=m),Em(f)){let p=Tm(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else bm(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=km(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Me(o)){let d=Xv(u.created_at,s.modifiedAt),f=Sm(u.content);if(f&&(a=f),Em(u)){let m=Tm(u.content),p=m.trim();p&&(l||(l=G(p,80)),c=G(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:Vv(m.args),toolName:m.name||"tool"});bm(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):Gv(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await ym(r),r}catch{}let n=Tt(this.baseDir,"conversations");try{let s=[];for(let o of await gm(n)){if(!o.endsWith(".db"))continue;Za(o,".db").startsWith(e)&&s.push(Tt(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=km(r);return n?(await wm(this.conversationPath(n),{force:!0}),await wm(Tt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await Kv(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Tt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await Hv(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as Zv}from"node:child_process";function el(t){return new Qa(t)}async function Qv(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",tI(e.timeoutMs)];e.model&&n.push("--model",e.model),Pt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await eI(e.binary,n,{cwd:e.cwd,env:e.env,signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function eI(t,e,r){return new Promise((n,s)=>{let o;try{o=Zv(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function tI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Qa,tl=E(()=>{"use strict";vm();Mt();wt();En();Qa=class extends je{constructor(e){super({provider:new Zs(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",Ie,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:Qv})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as rI}from"node:crypto";import{join as nI}from"node:path";function sI(t){return rI("sha256").update(t).digest("hex").slice(0,8)}function oI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function iI(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function aI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Qs(t){return Math.max(1,Math.ceil(t.length/4))}function Im(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 sl(){return new nl}var cr,rl,nl,ol=E(()=>{"use strict";cr=new Map;rl=class{name="ClaudeMock";async discoverSessions(){return[...cr.values()].map(Im)}async loadSession(e){let r=cr.get(e);return r===void 0?null:{...Im(r),messages:r.messages.slice()}}async resolveSessionPath(e){return cr.get(e)?.filePath??null}async deleteSession(e){return cr.delete(e)}},nl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new rl;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=oI(iI(e,r)),s=`mock-${n}-${sI(`${e}:${n}`)}`,o=new Date,i=cr.get(s),a=r?.prompt??"ClaudeMock seed",l=Qs(a),c={sessionId:s,cwd:e,filePath:nI(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=Qs("ACK: ClaudeMock seeded"),cr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=cr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${aI(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Qs(e),s.totalOutputTokens+=Qs(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function lt(t){let e=[Oa({claudeDir:t?.claudeDir}),Ma({codexDir:t?.codexDir,codeDir:t?.codeDir}),Wa({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),qa({copilotDir:t?.copilotDir}),Ga(),Ya(),el({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(sl()),e}var il=E(()=>{"use strict";La();Da();Ba();Ha();Va();za();tl();ol();La();Da();Ba();Ha();Va();za();tl();ol()});var ul={};ie(ul,{ProviderRegistry:()=>yn,TransportConnectionError:()=>ye,TransportError:()=>He,TransportJsonError:()=>Ls,TransportProcessError:()=>yt,TransportRpcError:()=>Et,_resetDefaultRegistryForTests:()=>lI,chat:()=>ur,countTokens:()=>cl,createAdapterRegistry:()=>it,createAllAdapters:()=>lt,listSessions:()=>ll,seed:()=>al});function to(){return eo===null&&(eo=it(lt())),eo}function lI(){eo=null}function Nm(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function ur(t){let e=t.registry??to(),r=Nm(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,progPath:t.progPath,alias:t.alias,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function al(t){let e=t.registry??to(),r=Nm(e,t.provider),n=await $m(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await $m(e,t.provider,t.cwd),i=cI(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function $m(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function cI(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function ll(t={}){return(t.registry??to()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function cl(t){let r=await(t.registry??to()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var eo,St=E(()=>{"use strict";ka();il();ka();il();xr();eo=null});function uI(){return dl===null&&(dl=it(lt())),dl}async function Cr(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await fI(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Lr.delete(r),e.setMemberState(r,"idle");else{let i=dI(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function dI(t,e){if(!(t instanceof Ee))return Lr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(Lr.get(e)??0)+1;return r>=3?(Lr.delete(e),"consecutive_timeouts"):(Lr.set(e,r),null)}return Lr.delete(e),null}async function fI(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=uI(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ee("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,fl(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${xm(u)}`,fl(t.sessionid,t.sessiondir,"unresolved")))}let o=fl(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await ur({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ee("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ee("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):mI(u,o)}finally{a!==null&&clearTimeout(a)}}function fl(t,e,r){return["<library>","chat",t,e,"--provider",r]}function xm(t){return t instanceof Error?t.message:String(t)}function mI(t,e){if(t instanceof Ee)return t;if(t instanceof ye){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ee("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ee("enoent",null,t.message,e):new Ee("other",null,t.message,e)}return t instanceof yt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Et?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof He?new Ee("other",null,t.message,e):new Ee("other",null,xm(t),e)}var Ee,dl,Lr,$n=E(()=>{"use strict";St();Ee=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},dl=null;Lr=new Map});function jm(){return ml===null&&(ml=it(lt())),ml}function hI(t,e){if(!pI.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Te("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function Mr(t){let e=hI(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await _I({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function _I(t){let e=t.member.provider,r=t.member.sessiondir,n=pl("seed",r,e);try{let s=await al({provider:e,cwd:r,registry:jm()});if(!s.success)throw wI(s.error,n);if(!s.sessionId)throw new Te("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Te?s:hl(s,n)}}async function Am(t){return gI(t)}async function gI(t){let e=jm(),r=pl("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new Te("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof Te?o:hl(o,r)}let s=pl("tokens",t.sessionid,n);try{let o=await cl({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof Te?o:hl(o,s)}}function pl(t,e,r){return["<library>",t,e,"--provider",r]}function wI(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Te("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Te("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new Te("nonzero_exit",Number(n[1]),r,e)}return new Te("other",null,r,e)}function hl(t,e){return t instanceof Te?t:t instanceof ye?t.cause?.code==="ENOENT"?new Te("enoent",null,t.message,e):new Te("other",null,t.message,e):t instanceof yt?new Te("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Et?new Te("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof He?new Te("other",null,t.message,e):new Te("other",null,t instanceof Error?t.message:String(t),e)}var Te,ml,pI,ro=E(()=>{"use strict";St();Te=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},ml=null;pI=/^provider[123]$/});function no(t){return Buffer.from(t,"utf8").toString("base64url")}function xn(t){return Buffer.from(t,"base64url").toString("utf8")}async function Rm(t,e=r=>Am({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of yI(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function Om(t,e,r){let n=Lm(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Nn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Cr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Cm(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function _l(t,e,r){let n=Lm(t,e,r);if(n===null)throw new Error("session member not found");let s=await Mr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Cm(t,e,r)}}function yI(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Lm(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function Cm(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Nn,so=E(()=>{"use strict";$n();ro();Nn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function gl(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??bI(e),s=r-n,o=e.query(`
986
+ `):"":""}function gm(t){return t.model||t.message?.model}var zs,wm=E(()=>{"use strict";Ct();zs=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Ut(be,".qwen")}async discoverSessions(){let e=Ut(this.baseDir,"projects"),r;try{r=await Ys(e)}catch{return[]}let n=[];for(let s of r){let o=Ut(e,s,"chats"),i;try{i=await Ys(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Ut(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Ae(e,30);if(n.length===0)return null;let s=await ve(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),pm(d)){let f=_m(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(hm(d)){let f=gm(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=mm(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await ve(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Me(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(pm(f)){let h=_m(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(hm(f)){let h=gm(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=Ut(this.baseDir,"projects");try{let n=await Ys(r),s=[];for(let o of n){let i=Ut(r,o,"chats",`${e}.jsonl`);try{return await Bv(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Ut(r,o,"chats"),a;try{a=await Ys(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;mm(l,".jsonl").startsWith(e)&&s.push(Ut(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await qv(r),!0}catch{return!1}}}});function za(){return new Ya}var Ya,Za=E(()=>{"use strict";wm();Mt();ir();wt();Ya=class extends je{constructor(){super({provider:new zs,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Ie,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Us})}}});import{readdir as ym,readFile as Hv,rm as Em,stat as bm}from"node:fs/promises";import{basename as Qa,join as Tt}from"node:path";async function Jv(t){let e=await Promise.all(t.map(r=>ve(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function Xv(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Tm(t){return t.type==="USER_INPUT"}function Sm(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function Gv(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function km(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function vm(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 Vv(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function Kv(t){for await(let e of Me(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=Yv(s);if(o)return o}let n=zv(e.content);if(n)return n}return null}function Yv(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function zv(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function Im(t){if(t.endsWith(".db"))return Qa(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Zs,$m=E(()=>{"use strict";Ct();Zs=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Tt(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Tt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Tt(this.baseDir,"conversations"),r;try{r=await ym(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Qa(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Tt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Tt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await bm(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await Jv([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Ae(n,80);for(let f of d){let m=vm(f.content);if(m&&(a=m),Tm(f)){let p=km(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else Sm(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Im(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Me(o)){let d=Xv(u.created_at,s.modifiedAt),f=vm(u.content);if(f&&(a=f),Tm(u)){let m=km(u.content),p=m.trim();p&&(l||(l=G(p,80)),c=G(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:Vv(m.args),toolName:m.name||"tool"});Sm(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):Gv(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await bm(r),r}catch{}let n=Tt(this.baseDir,"conversations");try{let s=[];for(let o of await ym(n)){if(!o.endsWith(".db"))continue;Qa(o,".db").startsWith(e)&&s.push(Tt(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=Im(r);return n?(await Em(this.conversationPath(n),{force:!0}),await Em(Tt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await Kv(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Tt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await Hv(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as Zv}from"node:child_process";function tl(t){return new el(t)}async function Qv(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",t0(e.timeoutMs)];e.model&&n.push("--model",e.model),Pt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await e0(e.binary,n,{cwd:e.cwd,env:e.env,signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function e0(t,e,r){return new Promise((n,s)=>{let o;try{o=Zv(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function t0(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var el,rl=E(()=>{"use strict";$m();Mt();wt();En();el=class extends je{constructor(e){super({provider:new Zs(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",Ie,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:Qv})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as r0}from"node:crypto";import{join as n0}from"node:path";function s0(t){return r0("sha256").update(t).digest("hex").slice(0,8)}function o0(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function i0(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function a0(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Qs(t){return Math.max(1,Math.ceil(t.length/4))}function Nm(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 ol(){return new sl}var cr,nl,sl,il=E(()=>{"use strict";cr=new Map;nl=class{name="ClaudeMock";async discoverSessions(){return[...cr.values()].map(Nm)}async loadSession(e){let r=cr.get(e);return r===void 0?null:{...Nm(r),messages:r.messages.slice()}}async resolveSessionPath(e){return cr.get(e)?.filePath??null}async deleteSession(e){return cr.delete(e)}},sl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new nl;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=o0(i0(e,r)),s=`mock-${n}-${s0(`${e}:${n}`)}`,o=new Date,i=cr.get(s),a=r?.prompt??"ClaudeMock seed",l=Qs(a),c={sessionId:s,cwd:e,filePath:n0(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=Qs("ACK: ClaudeMock seeded"),cr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=cr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${a0(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Qs(e),s.totalOutputTokens+=Qs(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function lt(t){let e=[La({claudeDir:t?.claudeDir}),Da({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ba({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Ha({copilotDir:t?.copilotDir}),Va(),za(),tl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(ol()),e}var al=E(()=>{"use strict";Ca();Pa();qa();Ja();Ka();Za();rl();il();Ca();Pa();qa();Ja();Ka();Za();rl();il()});var dl={};ie(dl,{ProviderRegistry:()=>yn,TransportConnectionError:()=>ye,TransportError:()=>He,TransportJsonError:()=>Ls,TransportProcessError:()=>yt,TransportRpcError:()=>Et,_resetDefaultRegistryForTests:()=>l0,chat:()=>ur,countTokens:()=>ul,createAdapterRegistry:()=>it,createAllAdapters:()=>lt,listSessions:()=>cl,seed:()=>ll});function to(){return eo===null&&(eo=it(lt())),eo}function l0(){eo=null}function jm(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function ur(t){let e=t.registry??to(),r=jm(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,progPath:t.progPath,alias:t.alias,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function ll(t){let e=t.registry??to(),r=jm(e,t.provider),n=await xm(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await xm(e,t.provider,t.cwd),i=c0(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function xm(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function c0(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function cl(t={}){return(t.registry??to()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function ul(t){let r=await(t.registry??to()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var eo,St=E(()=>{"use strict";va();al();va();al();xr();eo=null});function u0(){return fl===null&&(fl=it(lt())),fl}async function Cr(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await f0(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Lr.delete(r),e.setMemberState(r,"idle");else{let i=d0(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function d0(t,e){if(!(t instanceof Ee))return Lr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(Lr.get(e)??0)+1;return r>=3?(Lr.delete(e),"consecutive_timeouts"):(Lr.set(e,r),null)}return Lr.delete(e),null}async function f0(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=u0(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ee("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,ml(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${Am(u)}`,ml(t.sessionid,t.sessiondir,"unresolved")))}let o=ml(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await ur({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ee("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ee("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):m0(u,o)}finally{a!==null&&clearTimeout(a)}}function ml(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Am(t){return t instanceof Error?t.message:String(t)}function m0(t,e){if(t instanceof Ee)return t;if(t instanceof ye){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ee("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ee("enoent",null,t.message,e):new Ee("other",null,t.message,e)}return t instanceof yt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Et?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof He?new Ee("other",null,t.message,e):new Ee("other",null,Am(t),e)}var Ee,fl,Lr,$n=E(()=>{"use strict";St();Ee=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},fl=null;Lr=new Map});function Rm(){return pl===null&&(pl=it(lt())),pl}function h0(t,e){if(!p0.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Te("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function Mr(t){let e=h0(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await _0({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function _0(t){let e=t.member.provider,r=t.member.sessiondir,n=hl("seed",r,e);try{let s=await ll({provider:e,cwd:r,registry:Rm()});if(!s.success)throw w0(s.error,n);if(!s.sessionId)throw new Te("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Te?s:_l(s,n)}}async function Om(t){return g0(t)}async function g0(t){let e=Rm(),r=hl("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new Te("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof Te?o:_l(o,r)}let s=hl("tokens",t.sessionid,n);try{let o=await ul({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof Te?o:_l(o,s)}}function hl(t,e,r){return["<library>",t,e,"--provider",r]}function w0(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Te("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Te("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new Te("nonzero_exit",Number(n[1]),r,e)}return new Te("other",null,r,e)}function _l(t,e){return t instanceof Te?t:t instanceof ye?t.cause?.code==="ENOENT"?new Te("enoent",null,t.message,e):new Te("other",null,t.message,e):t instanceof yt?new Te("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Et?new Te("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof He?new Te("other",null,t.message,e):new Te("other",null,t instanceof Error?t.message:String(t),e)}var Te,pl,p0,ro=E(()=>{"use strict";St();Te=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},pl=null;p0=/^provider[123]$/});function no(t){return Buffer.from(t,"utf8").toString("base64url")}function xn(t){return Buffer.from(t,"base64url").toString("utf8")}async function Lm(t,e=r=>Om({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of y0(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function Cm(t,e,r){let n=Mm(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Nn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Cr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Dm(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function gl(t,e,r){let n=Mm(t,e,r);if(n===null)throw new Error("session member not found");let s=await Mr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Dm(t,e,r)}}function y0(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Mm(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function Dm(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Nn,so=E(()=>{"use strict";$n();ro();Nn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function wl(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??b0(e),s=r-n,o=e.query(`
987
987
  SELECT
988
988
  isess.id AS interactive_session_id,
989
989
  isess.run_id,
@@ -1009,16 +1009,16 @@ ${r}`:r}function av(t){let e=[...t.matchAll(rv)];if(e.length>0){let r=e[e.length
1009
1009
  JOIN step s ON s.id = isess.step_id
1010
1010
  WHERE isess.status = 'waiting_agent'
1011
1011
  AND r.terminal_state IS NULL
1012
- `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=kI(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=TI(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:ke(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(i.hung_detected+=1,SI(e,a.run_id,a.step_id,c.sessionid)){i.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),i.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return i}function bI(t){return Mm(t.getConfig(oo),EI)*1e3}function wl(t,e){return Mm(t.getConfig(io),e)}function Mm(t,e){if(t===null||t.trim().length===0)return e;let r=Number(t);return Number.isFinite(r)&&r>0?Math.floor(r):e}function TI(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function SI(t,e,r,n){return t.query(`SELECT * FROM attention
1012
+ `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=k0(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=T0(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:ke(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(i.hung_detected+=1,S0(e,a.run_id,a.step_id,c.sessionid)){i.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),i.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return i}function b0(t){return Pm(t.getConfig(oo),E0)*1e3}function yl(t,e){return Pm(t.getConfig(io),e)}function Pm(t,e){if(t===null||t.trim().length===0)return e;let r=Number(t);return Number.isFinite(r)&&r>0?Math.floor(r):e}function T0(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function S0(t,e,r,n){return t.query(`SELECT * FROM attention
1013
1013
  WHERE kind = 'session_hung'
1014
1014
  AND run_id = ?
1015
- AND acknowledged_at IS NULL`,e).some(o=>{let i=Dm(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function kI(t,e,r){let n=Dm(t);return n===null?null:vI(n,e,r)??II(n,e,r)}function vI(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter($I),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let o=dr(s.members)?s.members:null,i=o!==null&&dr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function II(t,e,r){if(!dr(t.states))return null;let n=t.states[e]??t.states[r];if(!dr(n))return null;let s=n;if(!dr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function $I(t){return dr(t)}function Dm(t){if(t===null)return null;try{let e=JSON.parse(t);return dr(e)?e:null}catch{return null}}function dr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var oo,io,EI,yl=E(()=>{"use strict";Ce();oo="monitor.session_hung.elapsed_threshold_seconds",io="monitor.session_hung.check_interval_ms",EI=600});function lo(t){let e=t.query(`
1015
+ AND acknowledged_at IS NULL`,e).some(o=>{let i=Fm(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function k0(t,e,r){let n=Fm(t);return n===null?null:v0(n,e,r)??I0(n,e,r)}function v0(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter($0),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let o=dr(s.members)?s.members:null,i=o!==null&&dr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function I0(t,e,r){if(!dr(t.states))return null;let n=t.states[e]??t.states[r];if(!dr(n))return null;let s=n;if(!dr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function $0(t){return dr(t)}function Fm(t){if(t===null)return null;try{let e=JSON.parse(t);return dr(e)?e:null}catch{return null}}function dr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var oo,io,E0,El=E(()=>{"use strict";Ce();oo="monitor.session_hung.elapsed_threshold_seconds",io="monitor.session_hung.check_interval_ms",E0=600});function lo(t){let e=t.query(`
1016
1016
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1017
- `),r={queued:ao(e,"queued"),running:ao(e,"running"),done:ao(e,"done"),failed:ao(e,"failed"),total:bl(e)},n=t.query(`
1017
+ `),r={queued:ao(e,"queued"),running:ao(e,"running"),done:ao(e,"done"),failed:ao(e,"failed"),total:Tl(e)},n=t.query(`
1018
1018
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
1019
1019
  `),s=t.query(`
1020
1020
  SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
1021
- `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(o=>o.terminal_state===null).reduce((o,i)=>o+i.count,0),terminal:n.filter(o=>o.terminal_state!==null).reduce((o,i)=>o+i.count,0),total:bl(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:bl(s)},projects:El(t,"project"),teams:El(t,"team"),workflows:El(t,"workflow")}}function co(t){return t.listProjects()}function Um(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function uo(t){return t.query(`
1021
+ `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(o=>o.terminal_state===null).reduce((o,i)=>o+i.count,0),terminal:n.filter(o=>o.terminal_state!==null).reduce((o,i)=>o+i.count,0),total:Tl(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:Tl(s)},projects:bl(t,"project"),teams:bl(t,"team"),workflows:bl(t,"workflow")}}function co(t){return t.listProjects()}function Bm(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function uo(t){return t.query(`
1022
1022
  SELECT w.*
1023
1023
  FROM workflow w
1024
1024
  JOIN (
@@ -1027,16 +1027,16 @@ ${r}`:r}function av(t){let e=[...t.matchAll(rv)];if(e.length>0){let r=e[e.length
1027
1027
  GROUP BY name
1028
1028
  ) latest ON latest.name = w.name AND latest.version = w.version
1029
1029
  ORDER BY w.name ASC
1030
- `)}function Wm(t,e={}){return e.status!==void 0?t.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",e.status):t.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function Bm(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function qm(t,e){return t.getSubmittedPr(e)}function fo(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Dr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function fr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:fo(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:NI(t,r.id)}}function NI(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Hm(t,r.id)}))}function Tl(t,e,r){let n=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,r)[0];return n===void 0?null:{...n,artifacts:Hm(t,n.id)}}function Hm(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function mr(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function Jm(t,e,r){let n=Tl(t,e,r);return n===null?null:(n.artifacts.find(o=>o.kind===`${n.state_name}_transcript`)??n.artifacts.find(o=>o.content!==null))?.content??null}function Xm(t,e={}){return e.type!==void 0?t.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",e.type):t.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function Gm(t,e={}){return e.unhandled===!0?t.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function Bt(t,e={}){return e.unacked===!0?t.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function mo(t,e={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return e.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),e.project!==void 0&&(n+=" AND p.name = ?",r.push(e.project)),e.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(e.since)),t.query(`${Vm}
1030
+ `)}function qm(t,e={}){return e.status!==void 0?t.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",e.status):t.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function Hm(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function Jm(t,e){return t.getSubmittedPr(e)}function fo(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Dr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function fr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:fo(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:N0(t,r.id)}}function N0(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Xm(t,r.id)}))}function Sl(t,e,r){let n=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,r)[0];return n===void 0?null:{...n,artifacts:Xm(t,n.id)}}function Xm(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function mr(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function Gm(t,e,r){let n=Sl(t,e,r);return n===null?null:(n.artifacts.find(o=>o.kind===`${n.state_name}_transcript`)??n.artifacts.find(o=>o.content!==null))?.content??null}function Vm(t,e={}){return e.type!==void 0?t.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",e.type):t.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function Km(t,e={}){return e.unhandled===!0?t.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function Bt(t,e={}){return e.unacked===!0?t.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function mo(t,e={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return e.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),e.project!==void 0&&(n+=" AND p.name = ?",r.push(e.project)),e.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(e.since)),t.query(`${Ym}
1031
1031
  WHERE ${n}
1032
- ORDER BY a.created_at DESC`,...r).map(Km)}function ct(t,e){let n=t.query(`${Vm}
1033
- WHERE a.id = ?`,e)[0];return n===void 0?null:Km(n)}function Km(t){let{payload_json:e,...r}=t,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(e==null)return n;let s;try{s=JSON.parse(e)}catch{return n}if(s===null||typeof s!="object")return n;let o=s;if(Array.isArray(o.node_path)&&o.node_path.every(i=>typeof i=="string")&&(n.node_path=o.node_path),o.expected_response!==null&&typeof o.expected_response=="object"){let i=o.expected_response;if(typeof i.kind=="string"){let a=Array.isArray(i.choices)&&i.choices.every(l=>typeof l=="string")?i.choices:null;n.expected_response={kind:i.kind,choices:a}}}if(Array.isArray(o.transcript_tail)&&o.transcript_tail.every(i=>typeof i=="string")&&(n.transcript_tail=o.transcript_tail),typeof o.paused_at=="string"&&(n.paused_at=o.paused_at),o.created_run_inputs!==null&&typeof o.created_run_inputs=="object"&&!Array.isArray(o.created_run_inputs)&&(n.created_run_inputs=o.created_run_inputs),typeof o.workflow_version_id=="number"?n.workflow_version_id=o.workflow_version_id:o.workflow_version_id===null&&(n.workflow_version_id=null),o.step!==null&&typeof o.step=="object"&&!Array.isArray(o.step)){let i=o.step;typeof i.id=="string"&&i.id.length>0&&(n.workflow_step={id:i.id,name:typeof i.name=="string"?i.name:null,type:typeof i.type=="string"?i.type:null})}return typeof o.tier=="string"&&(n.escalation_tier=o.tier),typeof o.token=="string"&&(n.escalation_token=o.token),typeof o.reason=="string"&&(n.escalation_reason=o.reason),Array.isArray(o.declared_outcomes)&&o.declared_outcomes.every(i=>typeof i=="string")&&(n.declared_outcomes=o.declared_outcomes),typeof o.agent_output=="string"&&(n.agent_output=o.agent_output),n}function Ym(t){return t.query(`
1032
+ ORDER BY a.created_at DESC`,...r).map(zm)}function ct(t,e){let n=t.query(`${Ym}
1033
+ WHERE a.id = ?`,e)[0];return n===void 0?null:zm(n)}function zm(t){let{payload_json:e,...r}=t,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(e==null)return n;let s;try{s=JSON.parse(e)}catch{return n}if(s===null||typeof s!="object")return n;let o=s;if(Array.isArray(o.node_path)&&o.node_path.every(i=>typeof i=="string")&&(n.node_path=o.node_path),o.expected_response!==null&&typeof o.expected_response=="object"){let i=o.expected_response;if(typeof i.kind=="string"){let a=Array.isArray(i.choices)&&i.choices.every(l=>typeof l=="string")?i.choices:null;n.expected_response={kind:i.kind,choices:a}}}if(Array.isArray(o.transcript_tail)&&o.transcript_tail.every(i=>typeof i=="string")&&(n.transcript_tail=o.transcript_tail),typeof o.paused_at=="string"&&(n.paused_at=o.paused_at),o.created_run_inputs!==null&&typeof o.created_run_inputs=="object"&&!Array.isArray(o.created_run_inputs)&&(n.created_run_inputs=o.created_run_inputs),typeof o.workflow_version_id=="number"?n.workflow_version_id=o.workflow_version_id:o.workflow_version_id===null&&(n.workflow_version_id=null),o.step!==null&&typeof o.step=="object"&&!Array.isArray(o.step)){let i=o.step;typeof i.id=="string"&&i.id.length>0&&(n.workflow_step={id:i.id,name:typeof i.name=="string"?i.name:null,type:typeof i.type=="string"?i.type:null})}return typeof o.tier=="string"&&(n.escalation_tier=o.tier),typeof o.token=="string"&&(n.escalation_token=o.token),typeof o.reason=="string"&&(n.escalation_reason=o.reason),Array.isArray(o.declared_outcomes)&&o.declared_outcomes.every(i=>typeof i=="string")&&(n.declared_outcomes=o.declared_outcomes),typeof o.agent_output=="string"&&(n.agent_output=o.agent_output),n}function Zm(t){return t.query(`
1034
1034
  SELECT w.name AS workflow_name, r.terminal_state, COUNT(*) AS count
1035
1035
  FROM run r
1036
1036
  JOIN workflow w ON w.id = r.workflow_id
1037
1037
  GROUP BY w.name, r.terminal_state
1038
1038
  ORDER BY w.name ASC, r.terminal_state ASC
1039
- `)}function El(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function ao(t,e){return t.find(r=>r.status===e)?.count??0}function bl(t){return t.reduce((e,r)=>e+r.count,0)}function Sl(t,e,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[e];n!==null&&s.push(n);let o=t.query(`SELECT s.state_name, s.outcome
1039
+ `)}function bl(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function ao(t,e){return t.find(r=>r.status===e)?.count??0}function Tl(t){return t.reduce((e,r)=>e+r.count,0)}function kl(t,e,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[e];n!==null&&s.push(n);let o=t.query(`SELECT s.state_name, s.outcome
1040
1040
  FROM step s
1041
1041
  JOIN run r ON r.id = s.run_id
1042
1042
  JOIN job j ON j.id = r.job_id
@@ -1060,7 +1060,7 @@ ${r}`:r}function av(t){let e=[...t.matchAll(rv)];if(e.length>0){let r=e[e.length
1060
1060
  WHERE j.project_id = ?
1061
1061
  ${n!==null?"AND r.started_at >= ?":""}
1062
1062
  GROUP BY s.run_id, s.state_name
1063
- HAVING COUNT(*) > 1`,...s),_=new Map;for(let S of g){let I=_.get(S.state_name)??{runs:0,total_attempts:0};I.runs++,I.total_attempts+=S.attempt_count,_.set(S.state_name,I)}let T=[..._.entries()].map(([S,I])=>({state_name:S,retried_runs:I.runs,avg_retries:I.runs>0?Number((I.total_attempts/I.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:h,retry_counts:T}}function kl(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1063
+ HAVING COUNT(*) > 1`,...s),_=new Map;for(let S of g){let I=_.get(S.state_name)??{runs:0,total_attempts:0};I.runs++,I.total_attempts+=S.attempt_count,_.set(S.state_name,I)}let T=[..._.entries()].map(([S,I])=>({state_name:S,retried_runs:I.runs,avg_retries:I.runs>0?Number((I.total_attempts/I.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:h,retry_counts:T}}function vl(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1064
1064
  FROM session_event se
1065
1065
  JOIN run r ON r.id = se.run_id
1066
1066
  JOIN job j ON j.id = r.job_id
@@ -1100,22 +1100,22 @@ ${r}`:r}function av(t){let e=[...t.matchAll(rv)];if(e.length>0){let r=e[e.length
1100
1100
  AND json_extract(payload, '$.elapsedMs') > 0
1101
1101
  AND payload_truncated = 0
1102
1102
  ORDER BY json_extract(payload, '$.tool') ASC,
1103
- json_extract(payload, '$.elapsedMs') ASC`,r),i=new Map;for(let l of o){let c=i.get(l.tool_name)??[];c.push(l.elapsed_ms),i.set(l.tool_name,c)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return n.map(l=>{let c=a.get(l.tool_name)??0,u=i.get(l.tool_name)??[],d=u.length>0?u.reduce((p,h)=>p+h,0)/u.length:null,f=u.length>0?u[Math.floor(u.length*.5)]??null:null,m=u.length>0?u[Math.floor(u.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:c,hit_rate_pct:l.cnt>0?`${(c/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:d!==null?Math.round(d):null,p50_latency_ms:f,p95_latency_ms:m}})}function zm(t){try{let e=JSON.parse(t);if(e.schema_version==="lmctl/v3"&&Array.isArray(e.steps)){let r=[],n=new Map,s=new Map;for(let o of e.steps){let i=typeof o.id=="string"?o.id:null;i!==null&&(r.push(i),typeof o.type=="string"&&s.set(i,o.type),typeof o.name=="string"&&o.name.length>0&&n.set(o.name,i))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(e.states!==null&&typeof e.states=="object"){let r=e.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let u=c.type;typeof u=="string"&&n.set(l,u)}let s=typeof e.start_at=="string"?e.start_at:null,o=Object.keys(r),i=s!==null&&o.includes(s)?[s,...o.filter(l=>l!==s)]:o,a=e.terminals!==null&&typeof e.terminals=="object"?Object.keys(e.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...i,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function Pr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(r===void 0)return null;let n=t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=t.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:t.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),o=n!==null?zm(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},i=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=g=>o.schema==="v3"&&o.nameToId.has(g)?o.nameToId.get(g):g,l=new Map;for(let g of i)l.set(a(g.state_name),g);let c=t.query(`SELECT state_name, status, last_agent_output
1103
+ json_extract(payload, '$.elapsedMs') ASC`,r),i=new Map;for(let l of o){let c=i.get(l.tool_name)??[];c.push(l.elapsed_ms),i.set(l.tool_name,c)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return n.map(l=>{let c=a.get(l.tool_name)??0,u=i.get(l.tool_name)??[],d=u.length>0?u.reduce((p,h)=>p+h,0)/u.length:null,f=u.length>0?u[Math.floor(u.length*.5)]??null:null,m=u.length>0?u[Math.floor(u.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:c,hit_rate_pct:l.cnt>0?`${(c/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:d!==null?Math.round(d):null,p50_latency_ms:f,p95_latency_ms:m}})}function Qm(t){try{let e=JSON.parse(t);if(e.schema_version==="lmctl/v3"&&Array.isArray(e.steps)){let r=[],n=new Map,s=new Map;for(let o of e.steps){let i=typeof o.id=="string"?o.id:null;i!==null&&(r.push(i),typeof o.type=="string"&&s.set(i,o.type),typeof o.name=="string"&&o.name.length>0&&n.set(o.name,i))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(e.states!==null&&typeof e.states=="object"){let r=e.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let u=c.type;typeof u=="string"&&n.set(l,u)}let s=typeof e.start_at=="string"?e.start_at:null,o=Object.keys(r),i=s!==null&&o.includes(s)?[s,...o.filter(l=>l!==s)]:o,a=e.terminals!==null&&typeof e.terminals=="object"?Object.keys(e.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...i,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function Pr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(r===void 0)return null;let n=t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=t.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:t.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),o=n!==null?Qm(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},i=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=g=>o.schema==="v3"&&o.nameToId.has(g)?o.nameToId.get(g):g,l=new Map;for(let g of i)l.set(a(g.state_name),g);let c=t.query(`SELECT state_name, status, last_agent_output
1104
1104
  FROM interactive_session
1105
1105
  WHERE run_id = ? AND status = 'waiting_operator'
1106
- ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,T=l.get(g),S="pending",I=null;if(g.startsWith("@terminal:"))S=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?S=_&&u===g?"paused":"running":T.outcome===null?S="failed":S="done",T.ended_at!==null)){let v=Date.parse(T.started_at),k=Date.parse(T.ended_at);!Number.isNaN(v)&&!Number.isNaN(k)&&(I=k-v)}_&&u===g&&(S="paused"),h.push({id:g,status:S,is_current:_,elapsed_ms:I,prompt:_&&S==="paused"?f:null,expected:_&&S==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function po(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...xI(o));return`${e.join(`
1106
+ ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,T=l.get(g),S="pending",I=null;if(g.startsWith("@terminal:"))S=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?S=_&&u===g?"paused":"running":T.outcome===null?S="failed":S="done",T.ended_at!==null)){let v=Date.parse(T.started_at),k=Date.parse(T.ended_at);!Number.isNaN(v)&&!Number.isNaN(k)&&(I=k-v)}_&&u===g&&(S="paused"),h.push({id:g,status:S,is_current:_,elapsed_ms:I,prompt:_&&S==="paused"?f:null,expected:_&&S==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function po(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...x0(o));return`${e.join(`
1107
1107
  `)}
1108
- `}function xI(t){let e=[],r=jI(t.status),n=[];t.status==="done"&&t.elapsed_ms!==null?n.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?n.push("failed"):t.status==="paused"?n.push("paused, waiting for operator input"):t.status==="running"?n.push("running"):t.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",o=t.is_current?" <- CURRENT":"",i=t.id.padEnd(28);if(e.push(` ${r} ${i} ${s}${o}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function jI(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function ho(t,e,r={}){let n=r.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let o=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,i=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=o!==null?zm(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=v=>c.schema==="v3"&&c.nameToId.has(v)?c.nameToId.get(v):v,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let v of d)f.set(u(v.state_name),v);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let v of m)p.set(u(v.state_name),v);let h=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let v of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1108
+ `}function x0(t){let e=[],r=j0(t.status),n=[];t.status==="done"&&t.elapsed_ms!==null?n.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?n.push("failed"):t.status==="paused"?n.push("paused, waiting for operator input"):t.status==="running"?n.push("running"):t.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",o=t.is_current?" <- CURRENT":"",i=t.id.padEnd(28);if(e.push(` ${r} ${i} ${s}${o}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function j0(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function ho(t,e,r={}){let n=r.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let o=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,i=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=o!==null?Qm(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=v=>c.schema==="v3"&&c.nameToId.has(v)?c.nameToId.get(v):v,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let v of d)f.set(u(v.state_name),v);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let v of m)p.set(u(v.state_name),v);let h=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let v of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1109
1109
  FROM session_event
1110
1110
  WHERE run_id = ? AND step_id IS NOT NULL
1111
- GROUP BY step_id`,e))v.step_id!==null&&h.set(v.step_id,v.timestamp_ms);let _=AI(c,d,u),T=RI(s.current_state),S=t.query(`SELECT kind, severity, payload
1111
+ GROUP BY step_id`,e))v.step_id!==null&&h.set(v.step_id,v.timestamp_ms);let _=A0(c,d,u),T=R0(s.current_state),S=t.query(`SELECT kind, severity, payload
1112
1112
  FROM attention
1113
1113
  WHERE run_id = ?
1114
1114
  AND kind = 'session_hung'
1115
1115
  AND acknowledged_at IS NULL
1116
- ORDER BY id ASC`,e).map(v=>({kind:v.kind,severity:v.severity,payload:FI(v.payload)})),I=_.map(v=>{let k=f.get(v),R=p.get(v),L=OI(s,v,T,k,R),B=k===void 0?null:Date.parse(k.started_at),ee=k?.ended_at===null||k===void 0?null:Date.parse(k.ended_at),x=k===void 0||Number.isNaN(B??NaN)?null:ee!==null&&!Number.isNaN(ee)?ee-B:L==="running"||L==="paused"?n-B:null,H=k===void 0?null:h.get(k.id)??null,me=UI(R?.last_activity_at??null,H,g),$=o===null||R===void 0?void 0:MI(t,s.team_id,o.definition,R.state_name,k?.state_name??v);return{step_id:k?.id??null,state_id:v,status:L,started_at:k?.started_at??null,ended_at:k?.ended_at??null,last_activity_at:me,elapsed_ms:x,...$!==void 0?{member:$}:{},...R!==void 0?{interactive_session:{id:R.id,status:R.status,turn_count:R.turn_count,state_name:R.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:CI(s,a,I),submitted_at:a?.enqueued_at??s.started_at,nodes:I,current_node_index:LI(I,s.terminal_state!==null),related_attentions:S}}function _o(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${Fm(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Pm(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Pm(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${go(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${Fm(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${WI(a.payload)}`)}return`${n.join(`
1116
+ ORDER BY id ASC`,e).map(v=>({kind:v.kind,severity:v.severity,payload:F0(v.payload)})),I=_.map(v=>{let k=f.get(v),R=p.get(v),L=O0(s,v,T,k,R),B=k===void 0?null:Date.parse(k.started_at),ee=k?.ended_at===null||k===void 0?null:Date.parse(k.ended_at),x=k===void 0||Number.isNaN(B??NaN)?null:ee!==null&&!Number.isNaN(ee)?ee-B:L==="running"||L==="paused"?n-B:null,H=k===void 0?null:h.get(k.id)??null,me=U0(R?.last_activity_at??null,H,g),$=o===null||R===void 0?void 0:M0(t,s.team_id,o.definition,R.state_name,k?.state_name??v);return{step_id:k?.id??null,state_id:v,status:L,started_at:k?.started_at??null,ended_at:k?.ended_at??null,last_activity_at:me,elapsed_ms:x,...$!==void 0?{member:$}:{},...R!==void 0?{interactive_session:{id:R.id,status:R.status,turn_count:R.turn_count,state_name:R.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:C0(s,a,I),submitted_at:a?.enqueued_at??s.started_at,nodes:I,current_node_index:L0(I,s.terminal_state!==null),related_attentions:S}}function _o(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${Wm(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Um(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Um(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${go(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${Wm(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${W0(a.payload)}`)}return`${n.join(`
1117
1117
  `)}
1118
- `}function AI(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function RI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function OI(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function LI(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function CI(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function MI(t,e,r,n,s){let o=DI(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:ke(i)}}function DI(t,e,r){let n=PI(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Wt(a)?a.id===e||a.name===e||a.name===r:!1),o=Wt(s?.members)?s.members:null,i=o!==null&&Wt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Wt(n.states)){let s=n.states[e]??n.states[r];if(!Wt(s))return null;let o=Wt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function PI(t){try{let e=JSON.parse(t);return Wt(e)?e:null}catch{return null}}function FI(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Wt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function UI(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Pm(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${go(Math.max(0,n-r)).padEnd(6)}]`}function Fm(t,e){return Number.isNaN(t)?"?":go(Math.max(0,e-t))}function go(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function WI(t){if(!Wt(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${go(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Vm,kt=E(()=>{"use strict";Ce();Vm=`SELECT a.id AS attention_id,
1118
+ `}function A0(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function R0(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function O0(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function L0(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function C0(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function M0(t,e,r,n,s){let o=D0(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:ke(i)}}function D0(t,e,r){let n=P0(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Wt(a)?a.id===e||a.name===e||a.name===r:!1),o=Wt(s?.members)?s.members:null,i=o!==null&&Wt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Wt(n.states)){let s=n.states[e]??n.states[r];if(!Wt(s))return null;let o=Wt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function P0(t){try{let e=JSON.parse(t);return Wt(e)?e:null}catch{return null}}function F0(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Wt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function U0(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Um(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${go(Math.max(0,n-r)).padEnd(6)}]`}function Wm(t,e){return Number.isNaN(t)?"?":go(Math.max(0,e-t))}function go(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function W0(t){if(!Wt(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${go(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Ym,kt=E(()=>{"use strict";Ce();Ym=`SELECT a.id AS attention_id,
1119
1119
  a.kind AS kind,
1120
1120
  a.severity AS severity,
1121
1121
  a.created_at AS created_at,
@@ -1137,139 +1137,139 @@ ${r}`:r}function av(t){let e=[...t.matchAll(rv)];if(e.length>0){let r=e[e.length
1137
1137
  ON isess.run_id = a.run_id
1138
1138
  AND isess.id = (
1139
1139
  SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
1140
- )`});var mp={};ie(mp,{parseApiArgs:()=>rp,readApiClientConfig:()=>An,runApi:()=>GI});import{readFileSync as BI}from"node:fs";import{basename as qI,extname as HI}from"node:path";async function GI(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(XI),0;if(t[0]==="config")return KI(t.slice(1),e);let r=dp(t,"--direct");if(r.rest[0]==="escalations")return YI(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Eo(r.rest.slice(2)))return e.stdout.write(`${e0}
1140
+ )`});var hp={};ie(hp,{parseApiArgs:()=>sp,readApiClientConfig:()=>An,runApi:()=>G0});import{readFileSync as B0}from"node:fs";import{basename as q0,extname as H0}from"node:path";async function G0(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(X0),0;if(t[0]==="config")return K0(t.slice(1),e);let r=mp(t,"--direct");if(r.rest[0]==="escalations")return Y0(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Eo(r.rest.slice(2)))return e.stdout.write(`${eI}
1141
1141
  `),0;if(r.rest[0]==="workflows"&&r.rest[1]==="verify")return r.present?(e.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
1142
- `),2):V0(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Eo(r.rest.slice(2)))return e.stdout.write(`${ZI}
1143
- `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Eo(r.rest.slice(2)))return e.stdout.write(`${QI}
1144
- `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?H0(r.rest.slice(2),e):J0(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?X0(r.rest.slice(2),e):G0(r.rest.slice(2),e);if(r.present)return x0(r.rest,e);let n=rp(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1145
- `),2;let s=pr(e),o=s.baseUrl,i=qt(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=l0(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1142
+ `),2):VI(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Eo(r.rest.slice(2)))return e.stdout.write(`${Z0}
1143
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Eo(r.rest.slice(2)))return e.stdout.write(`${Q0}
1144
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?HI(r.rest.slice(2),e):JI(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?XI(r.rest.slice(2),e):GI(r.rest.slice(2),e);if(r.present)return xI(r.rest,e);let n=sp(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1145
+ `),2;let s=pr(e),o=s.baseUrl,i=qt(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=lI(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1146
1146
  `),2}else n.body!==void 0&&n.contentType!==void 0?i["Content-Type"]=n.contentType:n.body!==void 0&&(i["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,o),{method:n.method,headers:i,body:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1147
1147
  `),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1148
- `),l.status===400?2:1;if(n.runAfterSubmit){let c=await l.json(),u=u0(c);if(u===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
1148
+ `),l.status===400?2:1;if(n.runAfterSubmit){let c=await l.json(),u=uI(c);if(u===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
1149
1149
  `),2;let d;try{d=await fetch(new URL(`/api/jobs/${u}/run`,o),{method:"POST",headers:qt("application/json",s.token)})}catch(m){return e.stderr.write(`error: network failure: ${m instanceof Error?m.message:String(m)}
1150
1150
  `),2}if(!d.ok)return e.stderr.write(`error: HTTP ${d.status}: ${await d.text()}
1151
1151
  `),d.status===400?2:1;let f=await d.json();n.json?e.stdout.write(`${JSON.stringify(f,null,2)}
1152
1152
  `):e.stdout.write(`${JSON.stringify(f)}
1153
1153
  `)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1154
1154
  `):(e.stdout.write(await l.text()),e.stdout.write(`
1155
- `));return 0}function rp(t){let e=op(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?yo(o,"/api/status",n):s==="projects"?yo(o,"/api/projects",n):s==="teams"?yo(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?w0(o.slice(1),e.format):yo(o,"/api/workflows",n):s==="workflow"?g0(o,n):s==="upload"?h0(o,n):s==="submit-job"?_0(o,n):s==="issues"?p0(o,n):s==="jobs"?jn(o,"--status","/api/jobs","status",n):s==="job"?m0(o,n):s==="project"?y0(o,n):s==="artifact"?T0(o,n):s==="runs"?jn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?jn(o,"--type","/api/external-objects","type",n):s==="external-signals"?Qm(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?S0(o,n):Qm(o,"--unacked","/api/attentions","unacked",n):s==="stats"?k0(o,n):s==="daemon"?v0(o,n):s==="intake"?I0(o,n):s==="session"?$0(o,n):s==="run"?N0(o,e.format):s==="prs"?jn(o,"--status","/api/submitted-prs","status",n):s==="pr"?d0(o,n):`unknown subcommand: ${s}`}function qt(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function pr(t){if(t.dal!==void 0)return An(t.dal,process.env,t);let e=pe({path:de()});try{return An(e,process.env,t)}finally{e.close()}}function An(t,e,r){let n=[],s=t.getConfig("api.url"),o;s!==null?o=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(o=e.LMCTL_API_URL,n.push("api.url")):o=JI;let i=t.getConfig("api.token"),a;i!==null?a=i:e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${VI(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1156
- `);return{baseUrl:o,token:a}}function VI(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 KI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1155
+ `));return 0}function sp(t){let e=ap(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?yo(o,"/api/status",n):s==="projects"?yo(o,"/api/projects",n):s==="teams"?yo(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?wI(o.slice(1),e.format):yo(o,"/api/workflows",n):s==="workflow"?gI(o,n):s==="upload"?hI(o,n):s==="submit-job"?_I(o,n):s==="issues"?pI(o,n):s==="jobs"?jn(o,"--status","/api/jobs","status",n):s==="job"?mI(o,n):s==="project"?yI(o,n):s==="artifact"?TI(o,n):s==="runs"?jn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?jn(o,"--type","/api/external-objects","type",n):s==="external-signals"?tp(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?SI(o,n):tp(o,"--unacked","/api/attentions","unacked",n):s==="stats"?kI(o,n):s==="daemon"?vI(o,n):s==="intake"?II(o,n):s==="session"?$I(o,n):s==="run"?NI(o,e.format):s==="prs"?jn(o,"--status","/api/submitted-prs","status",n):s==="pr"?dI(o,n):`unknown subcommand: ${s}`}function qt(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function pr(t){if(t.dal!==void 0)return An(t.dal,process.env,t);let e=pe({path:de()});try{return An(e,process.env,t)}finally{e.close()}}function An(t,e,r){let n=[],s=t.getConfig("api.url"),o;s!==null?o=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(o=e.LMCTL_API_URL,n.push("api.url")):o=J0;let i=t.getConfig("api.token"),a;i!==null?a=i:e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${V0(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1156
+ `);return{baseUrl:o,token:a}}function V0(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 K0(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1157
1157
  `),2;let s=e.dal===void 0,o=e.dal??pe({path:de()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
1158
1158
  `),2;let i=n[0];if(!wo.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...wo].join(", ")})
1159
1159
  `),2;let a=o.getConfig(i);return a===null?(e.stderr.write(`error: ${i} is not set
1160
1160
  `),1):(e.stdout.write(`${a}
1161
1161
  `),0)}if(r==="set"){if(n.length!==2)return e.stderr.write(`usage: lmctl api config set <key> <value>
1162
1162
  `),2;let[i,a]=n;if(!wo.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...wo].join(", ")})
1163
- `),2;let l=a0(i,a);return l!==null?(e.stderr.write(`error: ${l}
1164
- `),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${Zm(i,a,!1)}
1163
+ `),2;let l=aI(i,a);return l!==null?(e.stderr.write(`error: ${l}
1164
+ `),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${ep(i,a,!1)}
1165
1165
  `),0)}if(r==="list"){let i=!1;for(let c of n){if(c==="--show-secrets"){i=!0;continue}return e.stderr.write(`error: unknown flag: ${c}
1166
1166
  `),2}let a=o.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return e.stdout.write(`(no config rows)
1167
- `),0;for(let c of l)e.stdout.write(`${c} = ${Zm(c,a[c],i)}
1167
+ `),0;for(let c of l)e.stdout.write(`${c} = ${ep(c,a[c],i)}
1168
1168
  `);return 0}return e.stderr.write(`error: unknown api config verb: ${r}
1169
- `),2}finally{s&&o.close()}}async function YI(t,e,r){if(Eo(t))return e.stdout.write(`${zI}
1170
- `),0;let n=dp(t,"--direct"),s=r||n.present,o=n.rest,[i,...a]=o;return i===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
1171
- `),2):s?t0(i,a,e):i==="list"?n0(a,e):i==="show"?o0(a,e):i==="respond"?i0(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
1172
- `),2)}function Eo(t){return t.some(e=>e==="--help"||e==="-h")}function t0(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:de()});try{return fp(s,[t,...e],r)}finally{n&&s.close()}}function np(t){let e,r=!1,n=!1,s;for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=r0(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return re(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function r0(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],o=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let r=Date.parse(t);return Number.isNaN(r)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function n0(t,e){let r=np(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1169
+ `),2}finally{s&&o.close()}}async function Y0(t,e,r){if(Eo(t))return e.stdout.write(`${z0}
1170
+ `),0;let n=mp(t,"--direct"),s=r||n.present,o=n.rest,[i,...a]=o;return i===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
1171
+ `),2):s?tI(i,a,e):i==="list"?nI(a,e):i==="show"?oI(a,e):i==="respond"?iI(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
1172
+ `),2)}function Eo(t){return t.some(e=>e==="--help"||e==="-h")}function tI(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:de()});try{return pp(s,[t,...e],r)}finally{n&&s.close()}}function op(t){let e,r=!1,n=!1,s;for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=rI(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return re(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function rI(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],o=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let r=Date.parse(t);return Number.isNaN(r)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function nI(t,e){let r=op(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1173
1173
  `),2;let n=pr(e),s=qt("application/json",n.token),o=new URLSearchParams;r.project!==void 0&&o.set("project",r.project),r.all&&o.set("all","true"),r.since!==void 0&&o.set("since",r.since);let i=o.toString().length>0?`?${o.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${i}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1174
1174
  `),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1175
- `),a.status===400?2:1;let l=await a.json();return sp(l,r.json,e)}function sp(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
1175
+ `),a.status===400?2:1;let l=await a.json();return ip(l,r.json,e)}function ip(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
1176
1176
  `),0;if(t.length===0)return r.stdout.write(`No pending escalations.
1177
1177
  `),0;r.stdout.write(`${t.length} pending escalation${t.length===1?"":"s"}:
1178
1178
 
1179
1179
  `);for(let n of t){if(n.run_id===null){r.stderr.write(`warning: attention #${n.attention_id} has no run_id; skipping
1180
- `);continue}let s=n.project??"<unknown-project>",o=n.workflow_name??"<unknown-workflow>",i=n.state_name??"<unknown-state>",a=s0(n.created_at);if(r.stdout.write(`#${n.attention_id} ${s} run ${n.run_id} ${o}:${i} (paused ${a})
1180
+ `);continue}let s=n.project??"<unknown-project>",o=n.workflow_name??"<unknown-workflow>",i=n.state_name??"<unknown-state>",a=sI(n.created_at);if(r.stdout.write(`#${n.attention_id} ${s} run ${n.run_id} ${o}:${i} (paused ${a})
1181
1181
  `),n.prompt!==null&&n.prompt.length>0){let l=n.prompt.replaceAll(`
1182
1182
  `," ").trim(),c=l.length>240?`${l.slice(0,240)}\u2026`:l;r.stdout.write(` Q: ${JSON.stringify(c)}
1183
1183
  `)}r.stdout.write(` Respond: lmctl api escalations respond ${n.attention_id} "<answer>" [--done to end chat]
1184
1184
  `),r.stdout.write(`
1185
- `)}return 0}function s0(t){let e=Date.parse(t);if(Number.isNaN(e))return"recently";let r=Math.max(0,Math.round((Date.now()-e)/1e3));if(r<60)return`${r}s ago`;let n=Math.round(r/60);if(n<60)return`${n}m ago`;let s=Math.round(n/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function o0(t,e){let r=t.filter(a=>a!=="--json"&&a!=="--text");if(r.length!==1)return e.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
1185
+ `)}return 0}function sI(t){let e=Date.parse(t);if(Number.isNaN(e))return"recently";let r=Math.max(0,Math.round((Date.now()-e)/1e3));if(r<60)return`${r}s ago`;let n=Math.round(r/60);if(n<60)return`${n}m ago`;let s=Math.round(n/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function oI(t,e){let r=t.filter(a=>a!=="--json"&&a!=="--text");if(r.length!==1)return e.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
1186
1186
  `),2;let n=ne(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
1187
1187
  `),2;let s=pr(e),o=qt("application/json",s.token),i;try{i=await fetch(new URL(`/api/escalations/${n}`,s.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1188
1188
  `),1}return i.status===404?(e.stderr.write(`error: escalation not found: ${n}
1189
1189
  `),1):i.ok?(e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1190
1190
  `),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1191
- `),i.status===400?2:1)}async function i0(t,e){let r=!1,n=!1,s=[];for(let f=0;f<t.length;f+=1){let m=t[f];if(m==="--json"){r=!0;continue}if(m==="--done"){n=!0;continue}s.push(m)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
1191
+ `),i.status===400?2:1)}async function iI(t,e){let r=!1,n=!1,s=[];for(let f=0;f<t.length;f+=1){let m=t[f];if(m==="--json"){r=!0;continue}if(m==="--done"){n=!0;continue}s.push(m)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
1192
1192
  `),2;let o=ne(s[0],"attention_id");if(typeof o=="string")return e.stderr.write(`error: ${o}
1193
1193
  `),2;let i=s[1],a=pr(e),l=qt("application/json",a.token);l["Content-Type"]="application/json";let c={input:i};n&&(c.done=!0);let u;try{u=await fetch(new URL(`/api/escalations/${o}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(c)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
1194
1194
  `),1}if(u.status===404)return e.stderr.write(`error: escalation not found: ${o}
1195
1195
  `),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
1196
1196
  `),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
1197
1197
  `):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
1198
- `),0}function Zm(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function a0(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let r=Number(e);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===oo||t===io){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function l0(t,e){let r=BI(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:c0(t)}),qI(t)),e!==void 0&&s.append("project",e),s}function c0(t){switch(HI(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 u0(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 d0(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return jn(n,"--status","/api/submitted-prs","status",e);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:e}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:e}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function op(t){let e=[],r="json";for(let n of t)n==="--json"?r="json":n==="--text"?r="text":e.push(n);return{args:e,format:r}}function yo(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function jn(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function Qm(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return re(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function f0(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function m0(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return f0([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;o=p}else if(f==="--source")i=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return re(f)}if(s===void 0&&o===void 0)return"usage: lmctl api job enqueue --project NAME [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=vl(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function p0(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return re(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?ip(n,e):r==="claim"?ap(n,e):r==="claim-next"?lp(n,e):r==="close"?cp(n,e):r==="reopen"?up(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function ip(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")o.title=l;else if(a==="--body")o.body=l;else if(a==="--severity")o.severity=l;else if(a==="--labels")o.labels=vl(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function ap(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=ne(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return re(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function lp(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(i)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function cp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function up(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function h0(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return re(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function _0(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function vl(t){try{return JSON.parse(t)}catch{return t}}function g0(t,e){let[r,n]=t;return r!=="show"||n===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function w0(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function y0(t,e){let[r,n,...s]=t;return r==="workflow"?E0([n,...s].filter(o=>o!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function E0(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=ne(n[0],"id");if(typeof s=="string")return s;let o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=b0(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:e,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function b0(t){let[e,r,...n]=t;if(e===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--condition")s.condition=a;else if(i==="--params")s.params=vl(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(i)}return{project:e,body:s}}function T0(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function S0(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function k0(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 v0(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 I0(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 $0(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=no(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function N0(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=ne(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=ne(n,"run_id");if(typeof i=="string")return i;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return re(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function re(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function dp(t,e){let r=[],n=!1;for(let s of t){if(s===e){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function x0(t,e){let r=op(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1198
+ `),0}function ep(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function aI(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let r=Number(e);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===oo||t===io){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function lI(t,e){let r=B0(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:cI(t)}),q0(t)),e!==void 0&&s.append("project",e),s}function cI(t){switch(H0(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 uI(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 dI(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return jn(n,"--status","/api/submitted-prs","status",e);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:e}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:e}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function ap(t){let e=[],r="json";for(let n of t)n==="--json"?r="json":n==="--text"?r="text":e.push(n);return{args:e,format:r}}function yo(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function jn(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function tp(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return re(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function fI(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function mI(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return fI([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;o=p}else if(f==="--source")i=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return re(f)}if(s===void 0&&o===void 0)return"usage: lmctl api job enqueue --project NAME [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=Il(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function pI(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return re(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?lp(n,e):r==="claim"?cp(n,e):r==="claim-next"?up(n,e):r==="close"?dp(n,e):r==="reopen"?fp(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function lp(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")o.title=l;else if(a==="--body")o.body=l;else if(a==="--severity")o.severity=l;else if(a==="--labels")o.labels=Il(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function cp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=ne(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return re(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function up(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(i)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function dp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function fp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function hI(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return re(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function _I(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function Il(t){try{return JSON.parse(t)}catch{return t}}function gI(t,e){let[r,n]=t;return r!=="show"||n===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function wI(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function yI(t,e){let[r,n,...s]=t;return r==="workflow"?EI([n,...s].filter(o=>o!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function EI(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=ne(n[0],"id");if(typeof s=="string")return s;let o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=bI(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:e,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function bI(t){let[e,r,...n]=t;if(e===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--condition")s.condition=a;else if(i==="--params")s.params=Il(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(i)}return{project:e,body:s}}function TI(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function SI(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function kI(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 vI(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 II(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 $I(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=no(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function NI(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=ne(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=ne(n,"run_id");if(typeof i=="string")return i;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return re(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function re(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function mp(t,e){let r=[],n=!1;for(let s of t){if(s===e){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function xI(t,e){let r=ap(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1199
1199
  `),2;let n=r.args,s=r.format!=="text",[o,...i]=n;if(o===void 0)return e.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1200
1200
  `),2;let a=e.dal===void 0,l=e.dal??pe({path:de()});try{if(o==="issues"){let[c,...u]=i;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1201
- `),2):c==="create"?j0(l,u,e,s):c==="claim"?A0(l,u,e,s):c==="claim-next"?R0(l,u,e,s):c==="close"?O0(l,u,e,s):c==="reopen"?L0(l,u,e,s):c==="list"?P0(l,u,e,s):c==="show"?F0(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1202
- `),2)}return o==="status"?U0(l,i,e,s):o==="projects"?W0(l,i,e,s):o==="workflows"?B0(l,i,e,s):o==="runs"?q0(l,i,e,s):o==="attentions"||o==="attention"?K0(l,i,e,s):o==="escalations"?fp(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1201
+ `),2):c==="create"?jI(l,u,e,s):c==="claim"?AI(l,u,e,s):c==="claim-next"?RI(l,u,e,s):c==="close"?OI(l,u,e,s):c==="reopen"?LI(l,u,e,s):c==="list"?PI(l,u,e,s):c==="show"?FI(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1202
+ `),2)}return o==="status"?UI(l,i,e,s):o==="projects"?WI(l,i,e,s):o==="workflows"?BI(l,i,e,s):o==="runs"?qI(l,i,e,s):o==="attentions"||o==="attention"?KI(l,i,e,s):o==="escalations"?pp(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1203
1203
  `),2)}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
1204
1204
  `),1}finally{a&&l.close()}}function Ue(t,e,r){t.stdout.write(`${r?JSON.stringify(e,null,2):JSON.stringify(e)}
1205
- `)}function j0(t,e,r,n){let s=ip(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1205
+ `)}function jI(t,e,r,n){let s=lp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1206
1206
  `),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
1207
- `),1;let a=JSON.parse(s.body),l=C0(a.severity);if(typeof l=="object"&&l!==null&&"error"in l)return r.stderr.write(`error: ${l.error}
1208
- `),2;let c=M0(a.labels);if(typeof c=="string"&&c.startsWith("error:"))return r.stderr.write(`error: ${c.slice(6)}
1209
- `),2;let u=t.createIssue({project_id:i.id,title:a.title,body:a.body,...l!==void 0?{severity:l}:{},labels:c,ai_test_path:typeof a.ai_test_path=="string"?a.ai_test_path:null,source_run_id:typeof a.source_run_id=="number"?a.source_run_id:null});return Ue(r,u,n),0}function A0(t,e,r,n){let s=ap(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1207
+ `),1;let a=JSON.parse(s.body),l=CI(a.severity);if(typeof l=="object"&&l!==null&&"error"in l)return r.stderr.write(`error: ${l.error}
1208
+ `),2;let c=MI(a.labels);if(typeof c=="string"&&c.startsWith("error:"))return r.stderr.write(`error: ${c.slice(6)}
1209
+ `),2;let u=t.createIssue({project_id:i.id,title:a.title,body:a.body,...l!==void 0?{severity:l}:{},labels:c,ai_test_path:typeof a.ai_test_path=="string"?a.ai_test_path:null,source_run_id:typeof a.source_run_id=="number"?a.source_run_id:null});return Ue(r,u,n),0}function AI(t,e,r,n){let s=cp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1210
1210
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/claim$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1211
1211
  `),1;let l=t.claimIssue(o,i.assigned_run_id);return l===null?(r.stderr.write(`error: issue ${o} is not in a claimable state (status=${a.status})
1212
- `),1):(Ue(r,l,n),0)}function R0(t,e,r,n){let s=lp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1212
+ `),1):(Ue(r,l,n),0)}function RI(t,e,r,n){let s=up(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1213
1213
  `),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues\/claim-next$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
1214
- `),1;let a=JSON.parse(s.body),l=t.claimNextIssue(i.id,a.assigned_run_id);return l===null?(Ue(r,{status:"queue_empty"},n),1):(Ue(r,l,n),0)}function O0(t,e,r,n){let s=cp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1214
+ `),1;let a=JSON.parse(s.body),l=t.claimNextIssue(i.id,a.assigned_run_id);return l===null?(Ue(r,{status:"queue_empty"},n),1):(Ue(r,l,n),0)}function OI(t,e,r,n){let s=dp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1215
1215
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/close$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1216
1216
  `),1;let l=typeof i.closed_run_id=="number"?i.closed_run_id:a.assigned_run_id;if(l===null)return r.stderr.write(`error: missing closed_run_id
1217
- `),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Ue(r,c,n),0}function L0(t,e,r,n){let s=up(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1217
+ `),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Ue(r,c,n),0}function LI(t,e,r,n){let s=fp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1218
1218
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/reopen$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1219
1219
  `),1;let l=typeof i.source_run_id=="number"?i.source_run_id:a.closed_run_id??a.source_run_id;if(l===null)return r.stderr.write(`error: missing source_run_id
1220
- `),2;let c=t.reopenIssue(o,l);return Ue(r,c,n),0}function C0(t){if(t!=null)return typeof t=="string"&&tp.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function M0(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function P0(t,e,r,n){let[s,...o]=e;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1220
+ `),2;let c=t.reopenIssue(o,l);return Ue(r,c,n),0}function CI(t){if(t!=null)return typeof t=="string"&&np.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function MI(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function PI(t,e,r,n){let[s,...o]=e;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1221
1221
  `),2;let i,a,l;for(let d=0;d<o.length;d+=1){let f=o[d],m=o[++d];if(m===void 0||m.startsWith("--"))return r.stderr.write(`error: missing value for ${f}
1222
- `),2;if(f==="--status"){let p=ep(m,D0);if(typeof p=="string")return r.stderr.write(`error: ${p}
1223
- `),2;i=p}else if(f==="--severity"){let p=ep(m,tp);if(typeof p=="string")return r.stderr.write(`error: ${p}
1222
+ `),2;if(f==="--status"){let p=rp(m,DI);if(typeof p=="string")return r.stderr.write(`error: ${p}
1223
+ `),2;i=p}else if(f==="--severity"){let p=rp(m,np);if(typeof p=="string")return r.stderr.write(`error: ${p}
1224
1224
  `),2;a=p}else if(f==="--ai-test-path")l=m;else return r.stderr.write(`error: ${re(f)}
1225
1225
  `),2}let c=t.findProjectByName(s);if(c===null)return r.stderr.write(`error: project not found: ${s}
1226
- `),1;let u=t.listIssues(c.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Ue(r,u,n),0}function F0(t,e,r,n){if(e.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
1226
+ `),1;let u=t.listIssues(c.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Ue(r,u,n),0}function FI(t,e,r,n){if(e.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
1227
1227
  `),2;let s=ne(e[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
1228
1228
  `),2;let o=t.getIssue(s);return o===null?(r.stderr.write(`error: issue not found: ${s}
1229
- `),1):(Ue(r,o,n),0)}function U0(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1230
- `),2):(Ue(r,lo(t),n),0)}function W0(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1231
- `),2):(Ue(r,co(t),n),0)}function B0(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1232
- `),2):(Ue(r,uo(t),n),0)}function q0(t,e,r,n){let s;for(let o=0;o<e.length;o+=1){let i=e[o],a=e[++o];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${i}
1229
+ `),1):(Ue(r,o,n),0)}function UI(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1230
+ `),2):(Ue(r,lo(t),n),0)}function WI(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1231
+ `),2):(Ue(r,co(t),n),0)}function BI(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1232
+ `),2):(Ue(r,uo(t),n),0)}function qI(t,e,r,n){let s;for(let o=0;o<e.length;o+=1){let i=e[o],a=e[++o];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${i}
1233
1233
  `),2;if(i==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
1234
1234
  `),2;s=Number(a)}else return r.stderr.write(`error: ${re(i)}
1235
- `),2}return Ue(r,Dr(t,s!==void 0?{limit:s}:{}),n),0}function H0(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1235
+ `),2}return Ue(r,Dr(t,s!==void 0?{limit:s}:{}),n),0}function HI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1236
1236
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1237
1237
  `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${re(a)}
1238
1238
  `),2}let o=e.dal===void 0,i=e.dal??pe({path:de()});try{let a=Pr(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1239
1239
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1240
- `):e.stdout.write(po(a)),0)}finally{o&&i.close()}}async function J0(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1240
+ `):e.stdout.write(po(a)),0)}finally{o&&i.close()}}async function JI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1241
1241
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1242
1242
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${re(c)}
1243
1243
  `),2}let o=pr(e),a=qt(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1244
1244
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1245
1245
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1246
1246
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1247
- `),l.status===404?1:l.status===400?2:1)}function X0(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
1247
+ `),l.status===404?1:l.status===400?2:1)}function XI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
1248
1248
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1249
1249
  `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${re(a)}
1250
1250
  `),2}let o=e.dal===void 0,i=e.dal??pe({path:de()});try{let a=ho(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1251
1251
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1252
- `):e.stdout.write(_o(a)),0)}finally{o&&i.close()}}async function G0(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1252
+ `):e.stdout.write(_o(a)),0)}finally{o&&i.close()}}async function GI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1253
1253
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1254
1254
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${re(c)}
1255
1255
  `),2}let o=pr(e),a=qt(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1256
1256
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1257
1257
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1258
1258
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1259
- `),l.status===404?1:l.status===400?2:1)}async function V0(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${re(a)}
1259
+ `),l.status===404?1:l.status===400?2:1)}async function VI(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${re(a)}
1260
1260
  `),2}let n=pr(e),o=qt(r?"application/json":"text/plain",n.token),i;try{i=await fetch(new URL("/api/workflows/verify",n.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1261
1261
  `),2}return i.ok?(r?e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1262
1262
  `):(e.stdout.write(await i.text()),i.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1263
1263
  `)),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1264
- `),i.status===400?2:1)}function K0(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${re(o)}
1265
- `),2}return Ue(r,Bt(t,{unacked:s}),n),0}function fp(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1266
- `),2;if(n==="list"){let o=np(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
1267
- `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=mo(t,i);return sp(a,o.json,r)}if(n==="show"){let o=s.filter(l=>l!=="--json"&&l!=="--text");if(o.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1264
+ `),i.status===400?2:1)}function KI(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${re(o)}
1265
+ `),2}return Ue(r,Bt(t,{unacked:s}),n),0}function pp(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1266
+ `),2;if(n==="list"){let o=op(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
1267
+ `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=mo(t,i);return ip(a,o.json,r)}if(n==="show"){let o=s.filter(l=>l!=="--json"&&l!=="--text");if(o.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1268
1268
  `),2;let i=ne(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1269
1269
  `),2;let a=ct(t,i);return a===null?(r.stderr.write(`error: escalation not found: ${i}
1270
1270
  `),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
1271
- `),0)}return n==="respond"?Y0(t,s,r):(r.stderr.write(`error: --direct escalations does not support: ${n} (supported: list, show, respond)
1272
- `),2)}function Y0(t,e,r){let n=!1,s=!1,o=[];for(let m of e){if(m==="--json"){n=!0;continue}if(m==="--done"){s=!0;continue}o.push(m)}if(o.length!==2)return r.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
1271
+ `),0)}return n==="respond"?YI(t,s,r):(r.stderr.write(`error: --direct escalations does not support: ${n} (supported: list, show, respond)
1272
+ `),2)}function YI(t,e,r){let n=!1,s=!1,o=[];for(let m of e){if(m==="--json"){n=!0;continue}if(m==="--done"){s=!0;continue}o.push(m)}if(o.length!==2)return r.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
1273
1273
  `),2;let i=ne(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1274
1274
  `),2;let a=o[1],l=ct(t,i);if(l===null)return r.stderr.write(`error: escalation not found: ${i}
1275
1275
  `),1;let c=Bt(t).find(m=>m.id===i);if(c===void 0)return r.stderr.write(`error: escalation not found: ${i}
@@ -1282,12 +1282,12 @@ ${r}`:r}function av(t){let e=[...t.matchAll(rv)];if(e.length>0){let r=e[e.length
1282
1282
  `),2;let u=t.resumeInteractive(l.step_id,a,s);if(!u.resumed)return r.stderr.write(`error: interactive respond failed: ${u.reason} (step_id=${l.step_id})
1283
1283
  `),2;let d=t.acknowledgeAttention(i),f={ok:!0,attention_id:i,step_id:l.step_id,session_status:u.session.status,acknowledged_at:d?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
1284
1284
  `):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1285
- `),0}function ep(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var JI,XI,tp,wo,zI,ZI,QI,e0,D0,Il=E(()=>{"use strict";Ce();qe();so();yl();kt();JI="http://127.0.0.1:8787",XI=`usage: lmctl api [--direct] <subcommand> ...
1285
+ `),0}function rp(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var J0,X0,np,wo,z0,Z0,Q0,eI,DI,$l=E(()=>{"use strict";Ce();qe();so();El();kt();J0="http://127.0.0.1:8787",X0=`usage: lmctl api [--direct] <subcommand> ...
1286
1286
 
1287
1287
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1288
1288
  workflow shellstep-safe commands also support --direct to use the local DAL
1289
1289
  without an HTTP round trip.
1290
- `,tp=["low","medium","high","critical"];wo=new Set(["api.url","api.port","api.token","project.docroot",oo,io]);zI=`usage: lmctl api escalations <list|show|respond>
1290
+ `,np=["low","medium","high","critical"];wo=new Set(["api.url","api.port","api.token","project.docroot",oo,io]);z0=`usage: lmctl api escalations <list|show|respond>
1291
1291
 
1292
1292
  list [--project P] [--all] [--since DURATION] [--json]
1293
1293
  Print pending operator escalations (interactive_waiting_operator
@@ -1299,20 +1299,20 @@ without an HTTP round trip.
1299
1299
  single-record output is always JSON.
1300
1300
 
1301
1301
  respond <attention_id> "<answer>" [--done] [--json]
1302
- Reply to an interactive escalation. --done ends the chat.`,ZI=`usage: lmctl api run where <run_id> [--json|--text]
1302
+ Reply to an interactive escalation. --done ends the chat.`,Z0=`usage: lmctl api run where <run_id> [--json|--text]
1303
1303
 
1304
1304
  Print the workflow-position view (which state of which workflow the run is
1305
1305
  at, and any pending operator prompt). Default output is the TTY tree; --json
1306
1306
  emits the structured RunWhereDetail payload. Pair with --direct to bypass
1307
- HTTP for in-workflow shellsteps.`,QI=`usage: lmctl api run timeline <run_id> [--json|--text]
1307
+ HTTP for in-workflow shellsteps.`,Q0=`usage: lmctl api run timeline <run_id> [--json|--text]
1308
1308
 
1309
1309
  Print the time-ordered run progression view. Default output is the TTY
1310
1310
  timeline; --json emits the structured RunTimeline payload. Pair with
1311
- --direct to bypass HTTP for in-workflow shellsteps.`,e0=`usage: lmctl api workflows verify [--json|--text]
1311
+ --direct to bypass HTTP for in-workflow shellsteps.`,eI=`usage: lmctl api workflows verify [--json|--text]
1312
1312
 
1313
1313
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1314
1314
  and report the first step that would be started. Default output is the TTY
1315
- table; --json emits the structured WorkflowVerifyReport payload.`;D0=["open","assigned","closed","reopened"]});import{existsSync as pp,mkdirSync as z0,readdirSync as Z0,readFileSync as hp,writeFileSync as Q0}from"node:fs";import{join as Fr}from"node:path";import{fileURLToPath as e$}from"node:url";function Rn(t){try{return t$.some(e=>pp(Fr(t,e)))}catch{return!1}}function r$(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}function bo(t,e){t.durable_memory_mode!=="db"?n$(t):s$(t,e)}function _p(t){let e=Rn(t),r;try{r=Z0($l).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function n$(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Fr(e,"durable-memory");try{z0(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=_p(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Fr(r,i);if(!pp(a))try{let l=hp(Fr($l,o),"utf8");Q0(a,l,"utf8"),s.push(i)}catch(l){console.error(`[bootstrap] failed to copy ${o}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function s$(t,e){let r=t.local_path??"",n=_p(r),s=[];for(let o of n){let i=Fr($l,o),a;try{a=hp(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=r$(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var $l,t$,On=E(()=>{"use strict";$l=Fr(e$(import.meta.url),"../../config/durable_memory_templates"),t$=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as o$,mkdirSync as i$,readdirSync as a$,readFileSync as l$,writeFileSync as c$}from"node:fs";import{join as To}from"node:path";import{fileURLToPath as u$}from"node:url";function So(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Rn(e))return;let r=To(e,"ai-test");try{i$(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of d$()){let o=s.replace(/\.template$/,""),i=To(r,o);if(!o$(i))try{c$(i,f$(s),"utf8"),n.push(o)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function d$(){try{return a$(gp).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function f$(t){try{return l$(To(gp,t),"utf8")}catch{return m$(t)}}function m$(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1315
+ table; --json emits the structured WorkflowVerifyReport payload.`;DI=["open","assigned","closed","reopened"]});import{existsSync as _p,mkdirSync as zI,readdirSync as ZI,readFileSync as gp,writeFileSync as QI}from"node:fs";import{join as Fr}from"node:path";import{fileURLToPath as e$}from"node:url";function Rn(t){try{return t$.some(e=>_p(Fr(t,e)))}catch{return!1}}function r$(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}function bo(t,e){t.durable_memory_mode!=="db"?n$(t):s$(t,e)}function wp(t){let e=Rn(t),r;try{r=ZI(Nl).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function n$(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Fr(e,"durable-memory");try{zI(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=wp(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Fr(r,i);if(!_p(a))try{let l=gp(Fr(Nl,o),"utf8");QI(a,l,"utf8"),s.push(i)}catch(l){console.error(`[bootstrap] failed to copy ${o}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function s$(t,e){let r=t.local_path??"",n=wp(r),s=[];for(let o of n){let i=Fr(Nl,o),a;try{a=gp(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=r$(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var Nl,t$,On=E(()=>{"use strict";Nl=Fr(e$(import.meta.url),"../../config/durable_memory_templates"),t$=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as o$,mkdirSync as i$,readdirSync as a$,readFileSync as l$,writeFileSync as c$}from"node:fs";import{join as To}from"node:path";import{fileURLToPath as u$}from"node:url";function So(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Rn(e))return;let r=To(e,"ai-test");try{i$(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of d$()){let o=s.replace(/\.template$/,""),i=To(r,o);if(!o$(i))try{c$(i,f$(s),"utf8"),n.push(o)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function d$(){try{return a$(yp).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function f$(t){try{return l$(To(yp,t),"utf8")}catch{return m$(t)}}function m$(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1316
1316
 
1317
1317
  Add test chapters in this directory.
1318
1318
  `:`---
@@ -1334,7 +1334,7 @@ last_run_id: 0
1334
1334
  ## Expected
1335
1335
 
1336
1336
  ## Cleanup
1337
- `}var gp,Nl=E(()=>{"use strict";On();gp=To(u$(import.meta.url),"../../config/ai_test_templates")});var Ur,xl=E(()=>{"use strict";Ur=`---
1337
+ `}var yp,xl=E(()=>{"use strict";On();yp=To(u$(import.meta.url),"../../config/ai_test_templates")});var Ur,jl=E(()=>{"use strict";Ur=`---
1338
1338
 
1339
1339
  # Durable memory \u2014 how to use it
1340
1340
 
@@ -1345,15 +1345,15 @@ ON EVERY NEW TASK:
1345
1345
  2. Pull only the chapters relevant to your current task. Don't load everything.
1346
1346
  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.
1347
1347
 
1348
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function ko(t){return p$.has(t)}function Al(){return jl===null&&(jl=it(lt())),jl}function Rl(t,e){if(!ko(t))return null;try{let r=Al().getAdapter?.(t);if(r===void 0)return null;let n=r.resumeCommand(e).trim();return n.length===0?null:[...n.split(/\s+/),...wp[t]??[]]}catch{return null}}function Wr(t,e){let r=Rl(t,e);return r===null?null:r.join(" ")}function hr(t,e){return Al().getSession(t,e)}async function vo(t){return(await Al().resolveSessions(t)).map(r=>r.provider.name)}var wp,p$,yp,jl,Br=E(()=>{"use strict";St();wp={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},p$=new Set(Object.keys(wp)),yp=/^[\w.:-]+$/;jl=null});import{createHash as h$}from"node:crypto";import{existsSync as $o,mkdirSync as bp,readFileSync as Ol,readdirSync as _$,renameSync as g$,statSync as w$,writeFileSync as Io}from"node:fs";import{homedir as y$}from"node:os";import{dirname as Tp,join as Xe,resolve as No}from"node:path";import{fileURLToPath as E$}from"node:url";function kp(t){let e=No(t);for(;;){let r=Xe(e,Ll);try{if(w$(r).isDirectory())return r}catch{}let n=Tp(e);if(n===e)return null;e=n}}function xo(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return No(e);let r=kp(t);return r!==null?r:Xe(Sp(),Ll)}function vp(t){return Xe(xo(t),"templates","workflows")}function Ip(){return No(Tp(E$(import.meta.url)),"..","..","workflows")}function b$(t){let e=Xe(t,$p);try{let r=JSON.parse(Ol(e,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function T$(t,e){bp(t,{recursive:!0});let r=Xe(t,$p),n=`${r}.tmp-${process.pid}`;Io(n,`${JSON.stringify(e,null,2)}
1349
- `,"utf8"),g$(n,r)}function jo(t={}){let e=xo(t.cwd),r=Xe(e,"templates","workflows"),n=Ip(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=$o(n)?_$(n).filter(l=>l.endsWith(".compound.json")||l.endsWith(".lmctl")||l==="index.jsonl"):[];if(o.length===0)return s;bp(r,{recursive:!0});let i=b$(e),a=or();for(let l of o){let c=`workflows/${l}`,u=Ol(Xe(n,l)),d=Ep(u),f=Xe(r,l);if(!$o(f)){try{Io(f,u,{flag:"wx"}),s.copied.push(l)}catch{}i.files[c]=d;continue}let m=Ep(Ol(f));if(m===d){i.files[c]=d;continue}let p=i.files[c];if(p!==void 0&&m===p)Io(f,u),i.files[c]=d,s.refreshed.push(l);else{let h=Xe(r,`${l}.dist-${a}`);Io(h,u),s.preserved.push(l),s.shadowed.push(`${l}.dist-${a}`)}}T$(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function Cl(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(No(r));let n=kp(t??process.cwd());return n!==null&&e.push(n),e.push(Xe(Sp(),Ll)),e}function Ao(t,e){let r=Cl(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=Xe(s,"templates","workflows",o);if($o(i))return i}for(let s of n){let o=Xe(Ip(),s);if($o(o))return o}return null}var Ll,Sp,Ep,$p,Ro=E(()=>{"use strict";$s();Ll=".lmctl",Sp=()=>process.env.HOME??y$(),Ep=t=>h$("sha256").update(t).digest("hex");$p=".dist-manifest.json"});import{createHash as S$}from"node:crypto";import{existsSync as k$,mkdirSync as v$,writeFileSync as I$}from"node:fs";import{dirname as $$,join as qr}from"node:path";function _r(t){return typeof t=="string"&&t.startsWith(Np)}function O$(t){if(!_r(t))throw new et(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Np.length),r=e.indexOf("/");if(r<=0)throw new et(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!A$.has(n))throw new et(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new et(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new et(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function L$(t,e,r){if(t==="workflow")return Ao(e,r);let n=t==="mcp"?qr("templates","mcp",`${e}.json`):qr("templates","skills",e,"SKILL.md");for(let s of Cl(r)){let o=qr(s,n);if(k$(o))return o}return null}function C$(t,e,r){let n=qr(xo(r),x$,t);return t==="skill"?qr(n,e,"SKILL.md"):qr(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function M$(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function Ln(t,e){let{kind:r,name:n,ref:s}=O$(t),o=L$(r,n,e);if(o!==null)return o;let i=`${N$}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(j$)})}catch(u){throw new et(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new et(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=R$.exec(s);if(u!==null){let d=S$("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new et(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!M$(r,l))throw new et(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=C$(r,n,e);return v$($$(c),{recursive:!0}),I$(c,l,"utf8"),c}var Np,N$,x$,j$,A$,et,R$,Ml=E(()=>{"use strict";Ro();Np="lmctl://",N$="https://lmctl.com/templates/",x$=".cache",j$=8e3,A$=new Set(["workflow","mcp","skill"]),et=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},R$=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as Lp}from"node:child_process";import{cpSync as xp,existsSync as Fl,mkdirSync as Cp,mkdtempSync as D$,readFileSync as Mp,statSync as P$,writeFileSync as Dl}from"node:fs";import{homedir as F$,tmpdir as U$}from"node:os";import{basename as jp,join as Ge}from"node:path";function vt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Pl(t,e,r){if(Array.isArray(t)){for(let n of t)Pl(n,e,r);return}if(vt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))Pl(n,e,r)}}function H$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!vt(a)||!Array.isArray(a.steps)))for(let l of a.steps)vt(l)&&l.members!==void 0&&Pl(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(q$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function Dp(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(W$)})}catch(s){throw new tt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new tt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>Ap)throw new tt(e,`fetched ${t} exceeds ${Ap} bytes`);return n}async function J$(t,e){if(typeof t!="string")return[t];_r(t)&&(t=await Ln(t));let r;if(Ul.test(t))r=await Dp(t,e);else{if(!Fl(t))throw new tt(e,`mcp file not found: ${t}`);r=Mp(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new tt(e,`mcp source is not JSON: ${t}`)}if(vt(n)&&vt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...vt(o)?o:{}}));if(vt(n)&&typeof n.name=="string")return[n];throw new tt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Oo(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function Cn(t,e,r,n){let s=Lp(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new tt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new tt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function X$(t,e,r){Lp(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function G$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function V$(t){let e=["mcp","add"];if(Oo(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function K$(t){if(Oo(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function Y$(t){if(Oo(t)){let r=["mcp","add","--transport",t.type==="sse"?"sse":"http"];for(let[n,s]of Object.entries(t.headers??{}))r.push("--header",`${n}: ${s}`);return r.push(t.name,t.url??""),r}let e=["mcp","add"];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push(t.name,"--",t.command??"",...t.args??[]),e}function z$(t){let e=Ge(process.env.XDG_CONFIG_HOME??Ge(Mn(),".config"),"opencode"),r=Ge(e,"opencode.json"),n={};if(Fl(r))try{let o=JSON.parse(Mp(r,"utf8"));vt(o)&&(n=o)}catch{}let s=vt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Oo(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),Cp(e,{recursive:!0}),Dl(r,`${JSON.stringify(n,null,2)}
1350
- `,"utf8")}function Z$(t){if(typeof t!="string")return t.name;let e=jp(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?jp(t.replace(/\/skill\.md$/i,"")):e}async function Rp(t,e,r){let n=Z$(t),s=Ge(e,n);if(Cp(s,{recursive:!0}),typeof t!="string")return Dl(Ge(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(_r(t)&&(t=await Ln(t)),Ul.test(t))return Dl(Ge(s,"SKILL.md"),await Dp(t,r),"utf8"),{name:n,dir:s};if(!Fl(t))throw new tt(r,`skill path not found: ${t}`);return P$(t).isDirectory()?(xp(t,s,{recursive:!0}),{name:n,dir:s}):(xp(t,Ge(s,"SKILL.md")),{name:n,dir:s})}async function Lo(t){let{dal:e,member:r,stderr:n}=t,s=H$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=ke(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1351
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await J$(c,r.alias));if(o==="opencode")z$(l);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex"||o==="copilot")for(let c of l)if(X$(o,G$(o,c.name),i),o==="claude"){let{name:u,...d}=c;Cn("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?Cn("codex",K$(c),i,r.alias):o==="copilot"?Cn("copilot",Y$(c),i,r.alias):Cn(o,V$(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(B$.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=D$(Ge(U$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Ul.test(c)?c:(await Rp(c,l,r.alias)).dir;Cn(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(Op[o]!==void 0){let l=Op[o]();for(let c of s.skills)await Rp(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var tt,Ul,W$,Ap,B$,q$,Mn,Op,Wl=E(()=>{"use strict";Ce();Ml();tt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Ul=/^https?:\/\//i,W$=8e3,Ap=1e6,B$=new Set(["opencode"]),q$=t=>JSON.stringify(t),Mn=()=>process.env.HOME??F$();Op={claude:()=>Ge(Mn(),".claude","skills"),qwen:()=>Ge(Mn(),".qwen","skills"),codex:()=>Ge(Mn(),".codex","skills"),copilot:()=>Ge(Mn(),".copilot","skills")}});async function J(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:de()});try{return await e(r)}finally{r.close()}}function P(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function j(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1348
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function ko(t){return p$.has(t)}function Rl(){return Al===null&&(Al=it(lt())),Al}function Ol(t,e){if(!ko(t))return null;try{let r=Rl().getAdapter?.(t);if(r===void 0)return null;let n=r.resumeCommand(e).trim();return n.length===0?null:[...n.split(/\s+/),...Ep[t]??[]]}catch{return null}}function Wr(t,e){let r=Ol(t,e);return r===null?null:r.join(" ")}function hr(t,e){return Rl().getSession(t,e)}async function vo(t){return(await Rl().resolveSessions(t)).map(r=>r.provider.name)}var Ep,p$,bp,Al,Br=E(()=>{"use strict";St();Ep={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},p$=new Set(Object.keys(Ep)),bp=/^[\w.:-]+$/;Al=null});import{createHash as h$}from"node:crypto";import{existsSync as $o,mkdirSync as Sp,readFileSync as Ll,readdirSync as _$,renameSync as g$,statSync as w$,writeFileSync as Io}from"node:fs";import{homedir as y$}from"node:os";import{dirname as kp,join as Xe,resolve as No}from"node:path";import{fileURLToPath as E$}from"node:url";function Ip(t){let e=No(t);for(;;){let r=Xe(e,Cl);try{if(w$(r).isDirectory())return r}catch{}let n=kp(e);if(n===e)return null;e=n}}function xo(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return No(e);let r=Ip(t);return r!==null?r:Xe(vp(),Cl)}function $p(t){return Xe(xo(t),"templates","workflows")}function Np(){return No(kp(E$(import.meta.url)),"..","..","workflows")}function b$(t){let e=Xe(t,xp);try{let r=JSON.parse(Ll(e,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function T$(t,e){Sp(t,{recursive:!0});let r=Xe(t,xp),n=`${r}.tmp-${process.pid}`;Io(n,`${JSON.stringify(e,null,2)}
1349
+ `,"utf8"),g$(n,r)}function jo(t={}){let e=xo(t.cwd),r=Xe(e,"templates","workflows"),n=Np(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=$o(n)?_$(n).filter(l=>l.endsWith(".compound.json")||l.endsWith(".lmctl")||l==="index.jsonl"):[];if(o.length===0)return s;Sp(r,{recursive:!0});let i=b$(e),a=or();for(let l of o){let c=`workflows/${l}`,u=Ll(Xe(n,l)),d=Tp(u),f=Xe(r,l);if(!$o(f)){try{Io(f,u,{flag:"wx"}),s.copied.push(l)}catch{}i.files[c]=d;continue}let m=Tp(Ll(f));if(m===d){i.files[c]=d;continue}let p=i.files[c];if(p!==void 0&&m===p)Io(f,u),i.files[c]=d,s.refreshed.push(l);else{let h=Xe(r,`${l}.dist-${a}`);Io(h,u),s.preserved.push(l),s.shadowed.push(`${l}.dist-${a}`)}}T$(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function Ml(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(No(r));let n=Ip(t??process.cwd());return n!==null&&e.push(n),e.push(Xe(vp(),Cl)),e}function Ao(t,e){let r=Ml(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=Xe(s,"templates","workflows",o);if($o(i))return i}for(let s of n){let o=Xe(Np(),s);if($o(o))return o}return null}var Cl,vp,Tp,xp,Ro=E(()=>{"use strict";$s();Cl=".lmctl",vp=()=>process.env.HOME??y$(),Tp=t=>h$("sha256").update(t).digest("hex");xp=".dist-manifest.json"});import{createHash as S$}from"node:crypto";import{existsSync as k$,mkdirSync as v$,writeFileSync as I$}from"node:fs";import{dirname as $$,join as qr}from"node:path";function _r(t){return typeof t=="string"&&t.startsWith(jp)}function O$(t){if(!_r(t))throw new et(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(jp.length),r=e.indexOf("/");if(r<=0)throw new et(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!A$.has(n))throw new et(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new et(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new et(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function L$(t,e,r){if(t==="workflow")return Ao(e,r);let n=t==="mcp"?qr("templates","mcp",`${e}.json`):qr("templates","skills",e,"SKILL.md");for(let s of Ml(r)){let o=qr(s,n);if(k$(o))return o}return null}function C$(t,e,r){let n=qr(xo(r),x$,t);return t==="skill"?qr(n,e,"SKILL.md"):qr(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function M$(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function Ln(t,e){let{kind:r,name:n,ref:s}=O$(t),o=L$(r,n,e);if(o!==null)return o;let i=`${N$}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(j$)})}catch(u){throw new et(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new et(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=R$.exec(s);if(u!==null){let d=S$("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new et(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!M$(r,l))throw new et(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=C$(r,n,e);return v$($$(c),{recursive:!0}),I$(c,l,"utf8"),c}var jp,N$,x$,j$,A$,et,R$,Dl=E(()=>{"use strict";Ro();jp="lmctl://",N$="https://lmctl.com/templates/",x$=".cache",j$=8e3,A$=new Set(["workflow","mcp","skill"]),et=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},R$=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as Mp}from"node:child_process";import{cpSync as Ap,existsSync as Ul,mkdirSync as Dp,mkdtempSync as D$,readFileSync as Pp,statSync as P$,writeFileSync as Pl}from"node:fs";import{homedir as F$,tmpdir as U$}from"node:os";import{basename as Rp,join as Ge}from"node:path";function vt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Fl(t,e,r){if(Array.isArray(t)){for(let n of t)Fl(n,e,r);return}if(vt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))Fl(n,e,r)}}function H$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!vt(a)||!Array.isArray(a.steps)))for(let l of a.steps)vt(l)&&l.members!==void 0&&Fl(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(q$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function Fp(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(W$)})}catch(s){throw new tt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new tt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>Op)throw new tt(e,`fetched ${t} exceeds ${Op} bytes`);return n}async function J$(t,e){if(typeof t!="string")return[t];_r(t)&&(t=await Ln(t));let r;if(Wl.test(t))r=await Fp(t,e);else{if(!Ul(t))throw new tt(e,`mcp file not found: ${t}`);r=Pp(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new tt(e,`mcp source is not JSON: ${t}`)}if(vt(n)&&vt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...vt(o)?o:{}}));if(vt(n)&&typeof n.name=="string")return[n];throw new tt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Oo(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function Cn(t,e,r,n){let s=Mp(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new tt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new tt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function X$(t,e,r){Mp(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function G$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function V$(t){let e=["mcp","add"];if(Oo(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function K$(t){if(Oo(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function Y$(t){if(Oo(t)){let r=["mcp","add","--transport",t.type==="sse"?"sse":"http"];for(let[n,s]of Object.entries(t.headers??{}))r.push("--header",`${n}: ${s}`);return r.push(t.name,t.url??""),r}let e=["mcp","add"];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push(t.name,"--",t.command??"",...t.args??[]),e}function z$(t){let e=Ge(process.env.XDG_CONFIG_HOME??Ge(Mn(),".config"),"opencode"),r=Ge(e,"opencode.json"),n={};if(Ul(r))try{let o=JSON.parse(Pp(r,"utf8"));vt(o)&&(n=o)}catch{}let s=vt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Oo(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),Dp(e,{recursive:!0}),Pl(r,`${JSON.stringify(n,null,2)}
1350
+ `,"utf8")}function Z$(t){if(typeof t!="string")return t.name;let e=Rp(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?Rp(t.replace(/\/skill\.md$/i,"")):e}async function Lp(t,e,r){let n=Z$(t),s=Ge(e,n);if(Dp(s,{recursive:!0}),typeof t!="string")return Pl(Ge(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(_r(t)&&(t=await Ln(t)),Wl.test(t))return Pl(Ge(s,"SKILL.md"),await Fp(t,r),"utf8"),{name:n,dir:s};if(!Ul(t))throw new tt(r,`skill path not found: ${t}`);return P$(t).isDirectory()?(Ap(t,s,{recursive:!0}),{name:n,dir:s}):(Ap(t,Ge(s,"SKILL.md")),{name:n,dir:s})}async function Lo(t){let{dal:e,member:r,stderr:n}=t,s=H$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=ke(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1351
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await J$(c,r.alias));if(o==="opencode")z$(l);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex"||o==="copilot")for(let c of l)if(X$(o,G$(o,c.name),i),o==="claude"){let{name:u,...d}=c;Cn("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?Cn("codex",K$(c),i,r.alias):o==="copilot"?Cn("copilot",Y$(c),i,r.alias):Cn(o,V$(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(B$.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=D$(Ge(U$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Wl.test(c)?c:(await Lp(c,l,r.alias)).dir;Cn(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(Cp[o]!==void 0){let l=Cp[o]();for(let c of s.skills)await Lp(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var tt,Wl,W$,Op,B$,q$,Mn,Cp,Bl=E(()=>{"use strict";Ce();Dl();tt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Wl=/^https?:\/\//i,W$=8e3,Op=1e6,B$=new Set(["opencode"]),q$=t=>JSON.stringify(t),Mn=()=>process.env.HOME??F$();Cp={claude:()=>Ge(Mn(),".claude","skills"),qwen:()=>Ge(Mn(),".qwen","skills"),codex:()=>Ge(Mn(),".codex","skills"),copilot:()=>Ge(Mn(),".copilot","skills")}});async function J(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:de()});try{return await e(r)}finally{r.close()}}function P(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function j(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1352
1352
  `)}function w(t,e){return t.stderr.write(`error: ${e}
1353
1353
  `),1}function fe(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1354
- `),2}var Se=E(()=>{"use strict";Ce();qe()});var Bp={};ie(Bp,{defaultTeamNameForProject:()=>gN,resolveAlias:()=>Do,resolveProject:()=>Co,resolveTeam:()=>Mo,runCode:()=>tN});import{execFileSync as Q$}from"node:child_process";import{basename as eN,resolve as Pp}from"node:path";import*as ql from"node:readline";import{setTimeout as Bl}from"node:timers/promises";async function tN(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return rN(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Up(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return dN(e);try{return await J(e,async s=>{switch(r){case"team":return nN(n,e,s);case"chat":return lN(n,e,s);case"spec":return cN(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return fe(e,s)}}function rN(t){return t.stdout.write(["usage: lmctl code <team|chat> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1354
+ `),2}var Se=E(()=>{"use strict";Ce();qe()});var Hp={};ie(Hp,{defaultTeamNameForProject:()=>gN,resolveAlias:()=>Do,resolveProject:()=>Co,resolveTeam:()=>Mo,runCode:()=>tN});import{execFileSync as Q$}from"node:child_process";import{basename as eN,resolve as Up}from"node:path";import*as Hl from"node:readline";import{setTimeout as ql}from"node:timers/promises";async function tN(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return rN(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Bp(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return dN(e);try{return await J(e,async s=>{switch(r){case"team":return nN(n,e,s);case"chat":return lN(n,e,s);case"spec":return cN(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return fe(e,s)}}function rN(t){return t.stdout.write(["usage: lmctl code <team|chat> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1355
1355
  `)),0}function nN(t,e,r){let[n,...s]=t;switch(n){case"add":return sN(s,e,r);case"list":return oN(s,e,r);case"show":return iN(s,e,r);case"rm":return aN(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function sN(t,e,r){let n=P(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team add <alias> --provider P [--model M] [--role R]");let o=j(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=Hr(e,r,j(n,"--project"),j(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:j(n,"--model")??null,role:j(n,"--role")??"agent",sessiondir:j(n,"--sessiondir")??i.project.local_path});return M(n,"--json")?W(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1356
- `),0}function oN(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=Hr(e,r,j(n,"--project"),j(n,"--team"));if(typeof s=="number")return s;let o=Wp(r.listTeamMembers(s.team.id));if(M(n,"--json"))W(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${ke(i)} ${i.sessionid??"(unseeded)"}
1356
+ `),0}function oN(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=Hr(e,r,j(n,"--project"),j(n,"--team"));if(typeof s=="number")return s;let o=qp(r.listTeamMembers(s.team.id));if(M(n,"--json"))W(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${ke(i)} ${i.sessionid??"(unseeded)"}
1357
1357
  `);return 0}function iN(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team show <alias>");let o=Hr(e,r,j(n,"--project"),j(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?w(e,`member not found: ${s}`):(M(n,"--json")?W(e,i):(e.stdout.write(`member ${i.alias}
1358
1358
  `),e.stdout.write(`role: ${i.role}
1359
1359
  `),e.stdout.write(`provider: ${ke(i)}
@@ -1361,48 +1361,48 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1361
1361
  `),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
1362
1362
  `),e.stdout.write(`sessiondir: ${i.sessiondir}
1363
1363
  `)),0)}function aN(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team rm <alias>");let o=Hr(e,r,j(n,"--project"),j(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return w(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return M(n,"--json")?W(e,a):e.stdout.write(`retired member ${i.alias}
1364
- `),0}async function lN(t,e,r){if(t.includes("--help")||t.includes("-h"))return Up(e);let n=P(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=Hr(e,r,j(n,"--project"),j(n,"--team"));if(typeof s=="number")return s;let o=Do(e,r,s.team,j(n,"--alias"));if(typeof o=="number")return o;let i=await _N(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1365
- `);let a=e.stdin??process.stdin,l=ql.createInterface({input:a,terminal:!1}),c=i;Dn(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){Dn(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1364
+ `),0}async function lN(t,e,r){if(t.includes("--help")||t.includes("-h"))return Bp(e);let n=P(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=Hr(e,r,j(n,"--project"),j(n,"--team"));if(typeof s=="number")return s;let o=Do(e,r,s.team,j(n,"--alias"));if(typeof o=="number")return o;let i=await _N(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1365
+ `);let a=e.stdin??process.stdin,l=Hl.createInterface({input:a,terminal:!1}),c=i;Dn(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){Dn(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1366
1366
  `),0;if(d==="/help"){hN(e),Dn(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
1367
1367
  `),Dn(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
1368
1368
  `);let f=await Cr({sessionid:c.sessionid,sessiondir:c.sessiondir,prompt:d,dal:r,team_member_id:c.id});e.stdout.write(`${f.text.trimEnd()}
1369
- `);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),Dn(e,c,s.project)}}finally{l.close()}return 0}async function cN(t,e,r){let n=P(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return w(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=Hr(e,r,j(n,"--project"),j(n,"--team"));if(typeof o=="number")return o;let i=j(n,"--template")??Fp,a=r.getWorkflowByName(i);if(a===null)return w(e,`workflow not found: ${i}`);let l=j(n,"--slug")??pN(s),c={task_description:s,slug:l},u=j(n,"--from-requirement"),d=j(n,"--from-plan"),f=j(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=uN(r,e),p=await Pn(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
1370
- `),fN(e,m,p.id)}function uN(t,e){let r=An(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function dN(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Fp}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
1369
+ `);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),Dn(e,c,s.project)}}finally{l.close()}return 0}async function cN(t,e,r){let n=P(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return w(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=Hr(e,r,j(n,"--project"),j(n,"--team"));if(typeof o=="number")return o;let i=j(n,"--template")??Wp,a=r.getWorkflowByName(i);if(a===null)return w(e,`workflow not found: ${i}`);let l=j(n,"--slug")??pN(s),c={task_description:s,slug:l},u=j(n,"--from-requirement"),d=j(n,"--from-plan"),f=j(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=uN(r,e),p=await Pn(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
1370
+ `),fN(e,m,p.id)}function uN(t,e){let r=An(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function dN(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Wp}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
1371
1371
  `)),0}async function fN(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await Pn(e,`/api/jobs/${r}/run`,"POST");if(o.run_id!==null&&(n=o.run_id),o.status==="done")return t.stdout.write(`code spec complete: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1372
1372
  `),o.terminal_state==="done"?0:1;if(o.status==="failed")return t.stderr.write(`code spec failed: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1373
- `),1;if(o.status==="paused"&&o.run_id!==null){n=o.run_id;let i=await mN(t,e,r,n);if(i!=="continue")return i;continue}await Bl(1e3)}return t.stderr.write(`error: code spec polling exceeded step limit for job ${r}
1373
+ `),1;if(o.status==="paused"&&o.run_id!==null){n=o.run_id;let i=await mN(t,e,r,n);if(i!=="continue")return i;continue}await ql(1e3)}return t.stderr.write(`error: code spec polling exceeded step limit for job ${r}
1374
1374
  `),1}async function mN(t,e,r,n){let s=await Pn(e,`/api/runs/${n}`,"GET"),o=typeof s.current_state=="string"&&s.current_state.startsWith("__paused__:")?s.current_state.slice(11):null;if(o===null)return t.stderr.write(`[code spec] run ${n} paused without an Interactive state; polling will continue
1375
- `),await Bl(1e3),"continue";let i=[...s.steps].reverse().find(l=>l.state_name===o);if(i===void 0)return t.stderr.write(`[code spec] paused state ${o} has no step; polling will continue
1376
- `),await Bl(1e3),"continue";t.stderr.write(`[code spec] interactive stage ${o}; type /done to advance or /exit to leave paused
1377
- `);let a=ql.createInterface({input:t.stdin??process.stdin,terminal:!1});try{for await(let l of a){let c=l.trim();if(c==="/exit")return t.stdout.write(`code spec paused: job ${r}, run ${n}, stage ${o}
1378
- `),0;if(c==="/done")return await Pn(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await Pn(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function Pn(t,e,r,n){let s=new URL(e,t.baseUrl),o={Accept:"application/json"};t.token!==null&&t.token.length>0&&(o.Authorization=`Bearer ${t.token}`);let i;n!==void 0&&(i=JSON.stringify(n),o["Content-Type"]="application/json");let a=await fetch(s,{method:r,headers:o,body:i});if(!a.ok)throw new Error(`HTTP ${a.status}: ${await a.text()}`);return await a.json()}function pN(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Up(t){return t.stdout.write(["usage: lmctl code chat [--project P] [--team T] [--alias A]","","slash commands:"," /help show this help"," /exit exit the REPL",""].join(`
1375
+ `),await ql(1e3),"continue";let i=[...s.steps].reverse().find(l=>l.state_name===o);if(i===void 0)return t.stderr.write(`[code spec] paused state ${o} has no step; polling will continue
1376
+ `),await ql(1e3),"continue";t.stderr.write(`[code spec] interactive stage ${o}; type /done to advance or /exit to leave paused
1377
+ `);let a=Hl.createInterface({input:t.stdin??process.stdin,terminal:!1});try{for await(let l of a){let c=l.trim();if(c==="/exit")return t.stdout.write(`code spec paused: job ${r}, run ${n}, stage ${o}
1378
+ `),0;if(c==="/done")return await Pn(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await Pn(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function Pn(t,e,r,n){let s=new URL(e,t.baseUrl),o={Accept:"application/json"};t.token!==null&&t.token.length>0&&(o.Authorization=`Bearer ${t.token}`);let i;n!==void 0&&(i=JSON.stringify(n),o["Content-Type"]="application/json");let a=await fetch(s,{method:r,headers:o,body:i});if(!a.ok)throw new Error(`HTTP ${a.status}: ${await a.text()}`);return await a.json()}function pN(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Bp(t){return t.stdout.write(["usage: lmctl code chat [--project P] [--team T] [--alias A]","","slash commands:"," /help show this help"," /exit exit the REPL",""].join(`
1379
1379
  `)),0}function hN(t){t.stderr.write(`commands: /help, /exit
1380
- `)}function Dn(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function Co(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?w(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=Q$("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return w(t,"not in a git repo; use --project <name>")}let o=Pp(s),i=e.listProjects().find(a=>Pp(a.local_path)===o);return i===void 0?w(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function Mo(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?w(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?w(t,`project ${r.name} has no assigned team; use --team <name>`):s}function Do(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?w(t,`member not found: ${n}`):o}let s=Wp(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?w(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function Hr(t,e,r,n){let s=Co(t,e,r);if(typeof s=="number")return s;let o=Mo(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function Wp(t){return t.filter(e=>e.state!=="retired")}async function _N(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1380
+ `)}function Dn(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function Co(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?w(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=Q$("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return w(t,"not in a git repo; use --project <name>")}let o=Up(s),i=e.listProjects().find(a=>Up(a.local_path)===o);return i===void 0?w(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function Mo(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?w(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?w(t,`project ${r.name} has no assigned team; use --team <name>`):s}function Do(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?w(t,`member not found: ${n}`):o}let s=qp(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?w(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function Hr(t,e,r,n){let s=Co(t,e,r);if(typeof s=="number")return s;let o=Mo(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function qp(t){return t.filter(e=>e.state!=="retired")}async function _N(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1381
1381
  `),bo(r,e),So(r);let s=await Mr({member:n,dal:e}),o=e.updateTeamMemberSession(n.id,s.sessionid);if(o===null)throw new Error(`member disappeared during seed: ${n.alias}`);let i=Wr(ke(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
1382
1382
  ${i}
1383
1383
  `),await Lo({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
1384
1384
 
1385
- ${Ur}`:Ur;return e.setMemberPromptSnapshot(o.id,l)??o}function gN(t){return`${eN(t.local_path)}-code`}var Fp,Hl=E(()=>{"use strict";$n();ro();On();Nl();xl();Ce();Br();Wl();Se();Il();Fp="spec-driven-task"});import qp from"jexl";function Ht(t){qp.compile(Hp(t))}async function gr(t,e){return qp.eval(Hp(t),e)}function Hp(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Jr=E(()=>{"use strict"});import{z as y}from"zod";function zl(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var wN,Jp,Jl,Xl,Gl,Vl,Kl,Yl,Xp,yN,EN,bN,Fn,TN,Po,Fo,Uo,Wo,Bo,Gp,SN,kN,vN,IN,qo,Xr=E(()=>{"use strict";Jr();wN=y.object({kind:y.enum(["success","neutral","failure"])}),Jp=y.enum(["string","number","boolean","object","array"]),Jl=y.object({name:y.string().min(1),type:Jp,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),Xl=y.object({name:y.string().min(1),type:Jp,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),Gl=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),Vl="__failure__",Kl=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),Yl=y.object({on_unhandled_failure:y.object({attention_kind:y.string().min(1).default("workflow_failed"),severity:y.enum(["warn","error","critical"]).default("warn"),capture_evidence:y.boolean().default(!0),recommend_recovery:y.string().min(1).optional()}).optional(),on_unhandled_failure_state:y.string().min(1).optional()}).optional(),Xp=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),yN=y.object({name:y.string().min(1),command:y.string().min(1).optional(),args:y.array(y.string()).optional(),env:y.record(y.string(),y.string()).optional(),type:y.enum(["stdio","http","sse"]).optional(),url:y.string().min(1).optional(),headers:y.record(y.string(),y.string()).optional()}).strict(),EN=y.union([y.string().min(1),yN]),bN=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),Fn=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(EN).optional(),skills:y.array(bN).optional()}),TN=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),Po=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:Fn,pre_checks:y.array(TN).optional(),reviewers:y.array(Fn.extend({rubric_artifact:y.string().optional()})).optional(),outcomes:y.object({approve:y.string().min(1),request_changes:y.string().optional(),fail_pre_check:y.string().optional(),max_loops_exceeded:y.string().optional()}),writes_to_project_path:y.boolean().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional(),max_loops:y.number().int().positive().default(5),loop_feedback_artifact:y.string().optional(),outcomes_from_stance:y.record(y.string(),y.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Fo=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(Fn.extend({topic:y.string().min(1)})).optional(),consolidator:Fn,outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),research_artifact_prefix:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),Uo=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:Fn.extend({initial_prompt_template:y.string().min(1)}),termination:y.object({operator_signal:y.boolean().default(!0),agent_signal:y.string().optional(),max_turns:y.number().int().positive().default(20),timeout_seconds:y.number().int().positive().optional()}),outcomes:y.object({done:y.string().min(1),timeout:y.string().optional()}),artifact_name:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),Wo=y.object({type:y.literal("Loop"),state_name:y.string().min(1),over:y.string().min(1),item_var:y.string().min(1),body:y.string().min(1),outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),stop_on_error:y.boolean().default(!0),max_items:y.number().int().positive().default(1e3)}),Bo=y.object({type:y.literal("ShellStep"),state_name:y.string().min(1),command:y.string().min(1),outcomes_from_exit:y.record(y.string(),y.string().min(1)),timeout_ms:y.number().int().nonnegative().optional(),capture_output_to:y.string().optional(),writes_to_project_path:y.boolean().optional()}),Gp=y.object({type:y.literal("Choice"),state_name:y.string().min(1),branches:y.array(y.object({when:y.string().min(1),next:y.string().min(1)})).default([]),default_next:y.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{Ht(zl(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),SN=y.discriminatedUnion("type",[Xp,Po,Fo,Uo,Wo,Bo,Gp]),kN=y.object({type:y.literal("ForEach"),state_name:y.string().min(1),items_from:y.string().min(1),mode:y.enum(["sequential","parallel"]).default("sequential"),max_concurrency:y.number().int().positive().default(1),on_item_failure:y.enum(["continue","stop"]).default("stop"),body:SN,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{Ht(zl(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),vN=y.object({type:y.literal("Subflow"),state_name:y.string().min(1),workflow_name:y.string().min(1),inputs:y.record(y.string(),y.string().min(1)).optional(),outcomes:y.record(y.string(),y.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{Ht(zl(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),IN=y.discriminatedUnion("type",[Xp,Po,Fo,Uo,Wo,Bo,Gp,kN,vN]),qo=y.object({name:y.string().min(1),version:y.number().int().positive(),definition_schema_version:y.union([y.literal(1),y.literal(2)]),description:y.string().optional(),estimated_duration_ms:y.number().int().nonnegative().optional(),primitive_version:y.union([y.literal(1),y.literal(2)]).default(1),start_at:y.string().min(1),states:y.record(y.string().min(1),IN),terminals:y.record(y.string().min(1),wN),errors:Yl,concurrency_key:y.string().min(1).optional(),concurrent_limit:y.number().int().positive().optional(),default_task_timeout_ms:y.number().int().positive().max(216e5).optional(),inputs:y.array(Jl).optional(),outputs:y.array(Xl).optional(),triggers:y.array(Gl).optional(),read_only:y.boolean().optional(),requires:Kl}).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 Y}from"zod";var $N,Ho,NN,xN,jN,ut,Gr=E(()=>{"use strict";Xr();$N=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ho=Y.string().regex($N),NN=Y.object({step_id:Ho,type:Y.literal("main"),index:Y.number().int().min(0)}),xN=Y.record(Ho,Y.record(Y.string().min(1),Y.array(Y.array(NN)))),jN=Y.object({id:Ho,name:Y.string().min(1),type:Y.string().min(1),typeVersion:Y.number().int().positive().default(1),parameters:Y.record(Y.string(),Y.unknown()).default({}),members:Y.record(Y.string(),Y.unknown()).optional(),estimated_duration_ms:Y.number().int().nonnegative().optional()}),ut=Y.object({schema_version:Y.literal("lmctl/v3"),definition_schema_version:Y.literal(3),name:Y.string().min(1),version:Y.number().int().positive(),description:Y.string().optional(),estimated_duration_ms:Y.number().int().nonnegative().optional(),default_task_timeout_ms:Y.number().int().positive().max(216e5).optional(),concurrency_key:Y.string().min(1).optional(),concurrent_limit:Y.number().int().positive().optional(),errors:Yl,inputs:Y.array(Jl).optional(),outputs:Y.array(Xl).optional(),steps:Y.array(jN).min(1),connections:xN.default({}),entry_step_id:Ho,triggers:Y.array(Gl).optional(),read_only:Y.boolean().optional(),requires:Kl}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Jo(t){return Ql(t)}function Ql(t){if(Array.isArray(t))return t.map(Ql);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Ql(e[n]);if(typeof r.type=="string"){let n=RN[r.type];n!==void 0&&(r.type=n)}return r}var Zl,AN,RN,ec=E(()=>{"use strict";Zl="lmctl.builtin.",AN={Review:`${Zl}Review`,Research:`${Zl}Research`,Consolidate:`${Zl}Consolidate`},RN=Object.fromEntries(Object.entries(AN).map(([t,e])=>[e,t]))});import{readFileSync as ON}from"node:fs";function Yp(t){return LN(t)}function LN(t){let e=Jo(DN(t));if(MN(e),zp(e)===3)return CN(e);let r=qo.safeParse(e);if(!r.success)throw new It({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=PN(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new It(n);return r.data}function CN(t){let e=ut.safeParse(t);if(!e.success)throw new It({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function MN(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=zp(t);if(!(e===null||Vp.includes(e)))throw new It({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Vp.join(", ")}`}]})}function zp(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 DN(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1386
- `)||e.startsWith("{")||e.startsWith("[")?Kp(t,"$"):e.endsWith(".json")?Kp(ON(e,"utf8"),e):t}function Kp(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new It({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function PN(t){let e=[],r=[],n=new Set(Object.keys(t.states));n.has(t.start_at)||r.push({state:"$",ref:t.start_at,kind:"next"}),FN(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function FN(t,e,r){let n=t.errors?.on_unhandled_failure_state;n!==void 0&&(e.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var Vp,It,Zp=E(()=>{"use strict";Xr();Gr();ec();Vp=[1,2,3],It=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 UN}from"node:crypto";function Qp(t,e){let r=WN(e),n=UN("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function WN(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var eh=E(()=>{"use strict";Gr()});function HN(t,e){let r=qN[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function sh(t){let e=[],r=($,N)=>{throw new Vr([{line:$,message:N}])},n=t.split(`
1387
- `),s=[];for(let $=0;$<n.length;$+=1){let O=GN(n[$]).trim();O.length>0&&s.push({n:$+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=($,N,O,q,F,C)=>{l.has($)&&r(q,`duplicate step/terminal id: ${$}`),/^[A-Za-z][\w-]*$/.test($)||r(q,`invalid id (must start with a letter): ${$}`),l.set($,{declId:$,type:N,params:O,line:q,isTerminal:F,...C?{members:C}:{}}),u.push($)},T=$=>{let N=[],O=$+1;for(;O<s.length;O+=1){let q=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(q===null)break;N.push({label:q[1],dst:q[2]})}return{branches:N,nextIdx:O-1}};for(let $=1;$<s.length;$+=1){let{n:N,text:O}=s[$],q=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){$!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let F=/^meta\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),C=Jt(F[1],N,r);for(let Z of Object.keys(C))rh.has(Z)||r(N,`unknown \`meta\` key \`${Z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...rh].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(q==="step"){let F=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),C=F[1],Z=F[2],_e=F[3],oe=th[Z];oe===void 0&&r(N,`unknown step type: ${Z} (supported \`step\` archetypes: ${Object.keys(th).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:ht}=HN(oe,Jt(_e,N,r));_(C,oe,we,N,!1,Object.keys(ht).length>0?ht:void 0);continue}if(q==="trigger"){let F=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),C=F[1],Z=F[2],_e=F[3],oe=nh[Z];oe===void 0&&r(N,`unknown trigger type: ${Z} (registered trigger archetypes: ${Object.keys(nh).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:oe,parameters:Jt(_e,N,r)});continue}if(q==="mcp"||q==="skill"){let F=new RegExp(`^${q}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${q}\` decl (expected \`${q} <name> = {json} | ${q} <name> = "<file|url>"\`): ${O}`),C=F[1],Z=F[2].trim(),_e=q==="mcp"?h:g;_e.has(C)&&r(N,`duplicate ${q} declaration: ${C}`);let oe;if(Z.startsWith("{")){let we=Jt(Z,N,r);q==="mcp"?oe={...we,name:C}:((typeof we.content!="string"||we.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:C,content:we.content})}else{let we=oh(Z);(typeof we!="string"||we.length===0)&&r(N,`\`${q} ${C}\`: string form must be a non-empty file path or http(s) URL`),oe=we}_e.set(C,oe);continue}if(q==="terminal"){let F=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(F[1],"lmctl/terminal",{name:F[2],kind:F[3]??"neutral"},N,!0);continue}if(q==="seq"){let C=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Z=>Z.trim()).filter(Z=>Z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let Z=0;Z+2<C.length+1&&!(Z+2>C.length-1);Z+=2){let _e=C[Z],oe=C[Z+1],we=C[Z+2],ht=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:_e,port:ht,dstDeclId:we,line:N})}continue}if(q==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],Z=[],_e,oe=$+1;for(;oe<s.length;oe+=1){let we=s[oe].text,ht=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(ht!==null){_e!==void 0&&r(s[oe].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let fn=ht[2];Z.push({when:ht[1].trim(),next:`@terminal:${fn}`}),c.push({srcDeclId:C,port:fn,dstDeclId:ht[3],line:s[oe].n});continue}let ua=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(ua!==null){_e!==void 0&&r(s[oe].n,`\`choice ${C}\` has more than one \`default\``);let fn=ua[1];_e=`@terminal:${fn}`,c.push({srcDeclId:C,port:fn,dstDeclId:ua[2],line:s[oe].n});continue}break}Z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(C,"lmctl/choice",{branches:Z,..._e!==void 0?{default_next:_e}:{}},N,!1),$=oe-1;continue}if(q==="loop"){let F=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(F[1],"lmctl/loop",Jt(F[2],N,r),N,!1);continue}if(q==="foreach"){let F=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),C=Jt(F[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(F[1],"lmctl/foreach",C,N,!1);continue}if(q==="call"){let F=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),C=F[1],Z=Jt(F[2],N,r),_e=Z.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...we}=Z;_(C,"lmctl/subflow",{workflow_name:_e,...we},N,!1),d.push({declId:C,target:_e,line:N});continue}if(q==="decide"){let F=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),C=F[1],Z=Jt(F[2],N,r),{branches:_e,nextIdx:oe}=T($);_e.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:Z});for(let we of _e)c.push({srcDeclId:C,port:we.label,dstDeclId:we.dst,line:N});$=oe;continue}if(q==="entry"){let F=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=F[1];continue}r(N,`unknown statement \`${q}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let S=$=>{if(Array.isArray($)){for(let O of $)S(O);return}if(typeof $!="object"||$===null)return;let N=$;if(typeof N.alias=="string")for(let[O,q]of[["mcp",h],["skills",g]]){let F=N[O];Array.isArray(F)&&(N[O]=F.map(C=>typeof C=="string"&&q.has(C)?structuredClone(q.get(C)):C))}for(let O of Object.values(N))S(O)};for(let $ of u){let N=l.get($);N.members!==void 0&&S(N.members)}let I=$=>Qp(i,$),v=u.map($=>{let N=l.get($);return{id:I($),name:$,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),k={};for(let $ of c){l.has($.srcDeclId)||r($.line,`edge source references undeclared step: ${$.srcDeclId}`),l.has($.dstDeclId)||r($.line,`dangling edge target: ${$.dstDeclId} is not declared`),l.get($.srcDeclId).isTerminal&&r($.line,`terminal \`${$.srcDeclId}\` cannot have an outgoing edge`);let N=I($.srcDeclId);k[N]??={},k[N][$.port]!==void 0&&r($.line,`duplicate edge port \`${$.port}\` on step \`${$.srcDeclId}\``),k[N][$.port]=[[{step_id:I($.dstDeclId),type:"main",index:0}]]}for(let $ of u){let N=l.get($);JN.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${$}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let $ of d)$.target===i&&r($.line,`subflow cycle: \`call ${$.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let $ of c){let N=R.get($.srcDeclId);N===void 0?R.set($.srcDeclId,[$.dstDeclId]):N.push($.dstDeclId)}for(let $ of u){let N=l.get($);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let q=R.get($);q===void 0?R.set($,[O]):q.push(O)}}let L=new Set([f]),B=[f];for(;B.length>0;){let $=B.shift();for(let N of R.get($)??[])L.has(N)||(L.add(N),B.push(N))}for(let $ of u)L.has($)||r(l.get($).line,`step \`${$}\` is unreachable from entry \`${f}\``);let ee=new Map;for(let $ of c){let N=ee.get($.srcDeclId);N===void 0&&(N=new Set,ee.set($.srcDeclId,N)),N.add($.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let $ of u){let N=l.get($);if(N.isTerminal)continue;let O=ee.get($)??new Set;if(N.type==="lmctl/review"){let F=[...O].some(C=>!x.has(C));!O.has("approve")&&!F&&r(N.line,`uncovered outcome: review step \`${$}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${$} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let q=XN[N.type];if(q!==void 0)for(let F of q)O.has(F)||r(N.line,`uncovered outcome: required outcome \`${F}\` of step \`${$}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${$} -${F}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${$}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let $ of u){let N=l.get($),O=BN[N.type];if(O===void 0)continue;let q={...N.params,...N.members??{},type:O.v2type,state_name:$,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},F=O.schema.safeParse(q);if(!F.success){let C=F.error.issues[0],Z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${$}\` (\`${N.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${Z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${$} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let H={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:v,connections:k,entry_step_id:I(f)},me=ut.safeParse(H);if(!me.success)throw new Vr(me.error.issues.map($=>({line:s[0].n,message:`emitted V3 invalid at ${$.path.length===0?"$":$.path.map(String).join(".")}: ${$.message}`})));return me.data}function GN(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function Jt(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of VN(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=oh(l)}return s}function VN(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function oh(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var BN,qN,th,Vr,JN,XN,rh,nh,ih=E(()=>{"use strict";Gr();eh();Xr();BN={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Po},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Fo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Uo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Wo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Bo}},qN={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};th={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"},Vr=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1385
+ ${Ur}`:Ur;return e.setMemberPromptSnapshot(o.id,l)??o}function gN(t){return`${eN(t.local_path)}-code`}var Wp,Jl=E(()=>{"use strict";$n();ro();On();xl();jl();Ce();Br();Bl();Se();$l();Wp="spec-driven-task"});import Jp from"jexl";function Ht(t){Jp.compile(Xp(t))}async function gr(t,e){return Jp.eval(Xp(t),e)}function Xp(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Jr=E(()=>{"use strict"});import{z as y}from"zod";function Zl(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var wN,Gp,Xl,Gl,Vl,Kl,Yl,zl,Vp,yN,EN,bN,Fn,TN,Po,Fo,Uo,Wo,Bo,Kp,SN,kN,vN,IN,qo,Xr=E(()=>{"use strict";Jr();wN=y.object({kind:y.enum(["success","neutral","failure"])}),Gp=y.enum(["string","number","boolean","object","array"]),Xl=y.object({name:y.string().min(1),type:Gp,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),Gl=y.object({name:y.string().min(1),type:Gp,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),Vl=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),Kl="__failure__",Yl=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),zl=y.object({on_unhandled_failure:y.object({attention_kind:y.string().min(1).default("workflow_failed"),severity:y.enum(["warn","error","critical"]).default("warn"),capture_evidence:y.boolean().default(!0),recommend_recovery:y.string().min(1).optional()}).optional(),on_unhandled_failure_state:y.string().min(1).optional()}).optional(),Vp=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),yN=y.object({name:y.string().min(1),command:y.string().min(1).optional(),args:y.array(y.string()).optional(),env:y.record(y.string(),y.string()).optional(),type:y.enum(["stdio","http","sse"]).optional(),url:y.string().min(1).optional(),headers:y.record(y.string(),y.string()).optional()}).strict(),EN=y.union([y.string().min(1),yN]),bN=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),Fn=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(EN).optional(),skills:y.array(bN).optional()}),TN=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),Po=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:Fn,pre_checks:y.array(TN).optional(),reviewers:y.array(Fn.extend({rubric_artifact:y.string().optional()})).optional(),outcomes:y.object({approve:y.string().min(1),request_changes:y.string().optional(),fail_pre_check:y.string().optional(),max_loops_exceeded:y.string().optional()}),writes_to_project_path:y.boolean().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional(),max_loops:y.number().int().positive().default(5),loop_feedback_artifact:y.string().optional(),outcomes_from_stance:y.record(y.string(),y.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Fo=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(Fn.extend({topic:y.string().min(1)})).optional(),consolidator:Fn,outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),research_artifact_prefix:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),Uo=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:Fn.extend({initial_prompt_template:y.string().min(1)}),termination:y.object({operator_signal:y.boolean().default(!0),agent_signal:y.string().optional(),max_turns:y.number().int().positive().default(20),timeout_seconds:y.number().int().positive().optional()}),outcomes:y.object({done:y.string().min(1),timeout:y.string().optional()}),artifact_name:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),Wo=y.object({type:y.literal("Loop"),state_name:y.string().min(1),over:y.string().min(1),item_var:y.string().min(1),body:y.string().min(1),outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),stop_on_error:y.boolean().default(!0),max_items:y.number().int().positive().default(1e3)}),Bo=y.object({type:y.literal("ShellStep"),state_name:y.string().min(1),command:y.string().min(1),outcomes_from_exit:y.record(y.string(),y.string().min(1)),timeout_ms:y.number().int().nonnegative().optional(),capture_output_to:y.string().optional(),writes_to_project_path:y.boolean().optional()}),Kp=y.object({type:y.literal("Choice"),state_name:y.string().min(1),branches:y.array(y.object({when:y.string().min(1),next:y.string().min(1)})).default([]),default_next:y.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{Ht(Zl(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),SN=y.discriminatedUnion("type",[Vp,Po,Fo,Uo,Wo,Bo,Kp]),kN=y.object({type:y.literal("ForEach"),state_name:y.string().min(1),items_from:y.string().min(1),mode:y.enum(["sequential","parallel"]).default("sequential"),max_concurrency:y.number().int().positive().default(1),on_item_failure:y.enum(["continue","stop"]).default("stop"),body:SN,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{Ht(Zl(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),vN=y.object({type:y.literal("Subflow"),state_name:y.string().min(1),workflow_name:y.string().min(1),inputs:y.record(y.string(),y.string().min(1)).optional(),outcomes:y.record(y.string(),y.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{Ht(Zl(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),IN=y.discriminatedUnion("type",[Vp,Po,Fo,Uo,Wo,Bo,Kp,kN,vN]),qo=y.object({name:y.string().min(1),version:y.number().int().positive(),definition_schema_version:y.union([y.literal(1),y.literal(2)]),description:y.string().optional(),estimated_duration_ms:y.number().int().nonnegative().optional(),primitive_version:y.union([y.literal(1),y.literal(2)]).default(1),start_at:y.string().min(1),states:y.record(y.string().min(1),IN),terminals:y.record(y.string().min(1),wN),errors:zl,concurrency_key:y.string().min(1).optional(),concurrent_limit:y.number().int().positive().optional(),default_task_timeout_ms:y.number().int().positive().max(216e5).optional(),inputs:y.array(Xl).optional(),outputs:y.array(Gl).optional(),triggers:y.array(Vl).optional(),read_only:y.boolean().optional(),requires:Yl}).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 Y}from"zod";var $N,Ho,NN,xN,jN,ut,Gr=E(()=>{"use strict";Xr();$N=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ho=Y.string().regex($N),NN=Y.object({step_id:Ho,type:Y.literal("main"),index:Y.number().int().min(0)}),xN=Y.record(Ho,Y.record(Y.string().min(1),Y.array(Y.array(NN)))),jN=Y.object({id:Ho,name:Y.string().min(1),type:Y.string().min(1),typeVersion:Y.number().int().positive().default(1),parameters:Y.record(Y.string(),Y.unknown()).default({}),members:Y.record(Y.string(),Y.unknown()).optional(),estimated_duration_ms:Y.number().int().nonnegative().optional()}),ut=Y.object({schema_version:Y.literal("lmctl/v3"),definition_schema_version:Y.literal(3),name:Y.string().min(1),version:Y.number().int().positive(),description:Y.string().optional(),estimated_duration_ms:Y.number().int().nonnegative().optional(),default_task_timeout_ms:Y.number().int().positive().max(216e5).optional(),concurrency_key:Y.string().min(1).optional(),concurrent_limit:Y.number().int().positive().optional(),errors:zl,inputs:Y.array(Xl).optional(),outputs:Y.array(Gl).optional(),steps:Y.array(jN).min(1),connections:xN.default({}),entry_step_id:Ho,triggers:Y.array(Vl).optional(),read_only:Y.boolean().optional(),requires:Yl}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Jo(t){return ec(t)}function ec(t){if(Array.isArray(t))return t.map(ec);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=ec(e[n]);if(typeof r.type=="string"){let n=RN[r.type];n!==void 0&&(r.type=n)}return r}var Ql,AN,RN,tc=E(()=>{"use strict";Ql="lmctl.builtin.",AN={Review:`${Ql}Review`,Research:`${Ql}Research`,Consolidate:`${Ql}Consolidate`},RN=Object.fromEntries(Object.entries(AN).map(([t,e])=>[e,t]))});import{readFileSync as ON}from"node:fs";function Zp(t){return LN(t)}function LN(t){let e=Jo(DN(t));if(MN(e),Qp(e)===3)return CN(e);let r=qo.safeParse(e);if(!r.success)throw new It({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=PN(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new It(n);return r.data}function CN(t){let e=ut.safeParse(t);if(!e.success)throw new It({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function MN(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Qp(t);if(!(e===null||Yp.includes(e)))throw new It({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Yp.join(", ")}`}]})}function Qp(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 DN(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1386
+ `)||e.startsWith("{")||e.startsWith("[")?zp(t,"$"):e.endsWith(".json")?zp(ON(e,"utf8"),e):t}function zp(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new It({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function PN(t){let e=[],r=[],n=new Set(Object.keys(t.states));n.has(t.start_at)||r.push({state:"$",ref:t.start_at,kind:"next"}),FN(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function FN(t,e,r){let n=t.errors?.on_unhandled_failure_state;n!==void 0&&(e.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var Yp,It,eh=E(()=>{"use strict";Xr();Gr();tc();Yp=[1,2,3],It=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 UN}from"node:crypto";function th(t,e){let r=WN(e),n=UN("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function WN(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var rh=E(()=>{"use strict";Gr()});function HN(t,e){let r=qN[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function ih(t){let e=[],r=($,N)=>{throw new Vr([{line:$,message:N}])},n=t.split(`
1387
+ `),s=[];for(let $=0;$<n.length;$+=1){let O=GN(n[$]).trim();O.length>0&&s.push({n:$+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=($,N,O,q,F,C)=>{l.has($)&&r(q,`duplicate step/terminal id: ${$}`),/^[A-Za-z][\w-]*$/.test($)||r(q,`invalid id (must start with a letter): ${$}`),l.set($,{declId:$,type:N,params:O,line:q,isTerminal:F,...C?{members:C}:{}}),u.push($)},T=$=>{let N=[],O=$+1;for(;O<s.length;O+=1){let q=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(q===null)break;N.push({label:q[1],dst:q[2]})}return{branches:N,nextIdx:O-1}};for(let $=1;$<s.length;$+=1){let{n:N,text:O}=s[$],q=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){$!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let F=/^meta\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),C=Jt(F[1],N,r);for(let Z of Object.keys(C))sh.has(Z)||r(N,`unknown \`meta\` key \`${Z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...sh].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(q==="step"){let F=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),C=F[1],Z=F[2],_e=F[3],oe=nh[Z];oe===void 0&&r(N,`unknown step type: ${Z} (supported \`step\` archetypes: ${Object.keys(nh).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:ht}=HN(oe,Jt(_e,N,r));_(C,oe,we,N,!1,Object.keys(ht).length>0?ht:void 0);continue}if(q==="trigger"){let F=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),C=F[1],Z=F[2],_e=F[3],oe=oh[Z];oe===void 0&&r(N,`unknown trigger type: ${Z} (registered trigger archetypes: ${Object.keys(oh).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:oe,parameters:Jt(_e,N,r)});continue}if(q==="mcp"||q==="skill"){let F=new RegExp(`^${q}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${q}\` decl (expected \`${q} <name> = {json} | ${q} <name> = "<file|url>"\`): ${O}`),C=F[1],Z=F[2].trim(),_e=q==="mcp"?h:g;_e.has(C)&&r(N,`duplicate ${q} declaration: ${C}`);let oe;if(Z.startsWith("{")){let we=Jt(Z,N,r);q==="mcp"?oe={...we,name:C}:((typeof we.content!="string"||we.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:C,content:we.content})}else{let we=ah(Z);(typeof we!="string"||we.length===0)&&r(N,`\`${q} ${C}\`: string form must be a non-empty file path or http(s) URL`),oe=we}_e.set(C,oe);continue}if(q==="terminal"){let F=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(F[1],"lmctl/terminal",{name:F[2],kind:F[3]??"neutral"},N,!0);continue}if(q==="seq"){let C=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Z=>Z.trim()).filter(Z=>Z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let Z=0;Z+2<C.length+1&&!(Z+2>C.length-1);Z+=2){let _e=C[Z],oe=C[Z+1],we=C[Z+2],ht=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:_e,port:ht,dstDeclId:we,line:N})}continue}if(q==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],Z=[],_e,oe=$+1;for(;oe<s.length;oe+=1){let we=s[oe].text,ht=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(ht!==null){_e!==void 0&&r(s[oe].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let fn=ht[2];Z.push({when:ht[1].trim(),next:`@terminal:${fn}`}),c.push({srcDeclId:C,port:fn,dstDeclId:ht[3],line:s[oe].n});continue}let da=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(da!==null){_e!==void 0&&r(s[oe].n,`\`choice ${C}\` has more than one \`default\``);let fn=da[1];_e=`@terminal:${fn}`,c.push({srcDeclId:C,port:fn,dstDeclId:da[2],line:s[oe].n});continue}break}Z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(C,"lmctl/choice",{branches:Z,..._e!==void 0?{default_next:_e}:{}},N,!1),$=oe-1;continue}if(q==="loop"){let F=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(F[1],"lmctl/loop",Jt(F[2],N,r),N,!1);continue}if(q==="foreach"){let F=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),C=Jt(F[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(F[1],"lmctl/foreach",C,N,!1);continue}if(q==="call"){let F=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),C=F[1],Z=Jt(F[2],N,r),_e=Z.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...we}=Z;_(C,"lmctl/subflow",{workflow_name:_e,...we},N,!1),d.push({declId:C,target:_e,line:N});continue}if(q==="decide"){let F=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),C=F[1],Z=Jt(F[2],N,r),{branches:_e,nextIdx:oe}=T($);_e.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:Z});for(let we of _e)c.push({srcDeclId:C,port:we.label,dstDeclId:we.dst,line:N});$=oe;continue}if(q==="entry"){let F=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=F[1];continue}r(N,`unknown statement \`${q}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let S=$=>{if(Array.isArray($)){for(let O of $)S(O);return}if(typeof $!="object"||$===null)return;let N=$;if(typeof N.alias=="string")for(let[O,q]of[["mcp",h],["skills",g]]){let F=N[O];Array.isArray(F)&&(N[O]=F.map(C=>typeof C=="string"&&q.has(C)?structuredClone(q.get(C)):C))}for(let O of Object.values(N))S(O)};for(let $ of u){let N=l.get($);N.members!==void 0&&S(N.members)}let I=$=>th(i,$),v=u.map($=>{let N=l.get($);return{id:I($),name:$,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),k={};for(let $ of c){l.has($.srcDeclId)||r($.line,`edge source references undeclared step: ${$.srcDeclId}`),l.has($.dstDeclId)||r($.line,`dangling edge target: ${$.dstDeclId} is not declared`),l.get($.srcDeclId).isTerminal&&r($.line,`terminal \`${$.srcDeclId}\` cannot have an outgoing edge`);let N=I($.srcDeclId);k[N]??={},k[N][$.port]!==void 0&&r($.line,`duplicate edge port \`${$.port}\` on step \`${$.srcDeclId}\``),k[N][$.port]=[[{step_id:I($.dstDeclId),type:"main",index:0}]]}for(let $ of u){let N=l.get($);JN.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${$}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let $ of d)$.target===i&&r($.line,`subflow cycle: \`call ${$.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let $ of c){let N=R.get($.srcDeclId);N===void 0?R.set($.srcDeclId,[$.dstDeclId]):N.push($.dstDeclId)}for(let $ of u){let N=l.get($);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let q=R.get($);q===void 0?R.set($,[O]):q.push(O)}}let L=new Set([f]),B=[f];for(;B.length>0;){let $=B.shift();for(let N of R.get($)??[])L.has(N)||(L.add(N),B.push(N))}for(let $ of u)L.has($)||r(l.get($).line,`step \`${$}\` is unreachable from entry \`${f}\``);let ee=new Map;for(let $ of c){let N=ee.get($.srcDeclId);N===void 0&&(N=new Set,ee.set($.srcDeclId,N)),N.add($.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let $ of u){let N=l.get($);if(N.isTerminal)continue;let O=ee.get($)??new Set;if(N.type==="lmctl/review"){let F=[...O].some(C=>!x.has(C));!O.has("approve")&&!F&&r(N.line,`uncovered outcome: review step \`${$}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${$} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let q=XN[N.type];if(q!==void 0)for(let F of q)O.has(F)||r(N.line,`uncovered outcome: required outcome \`${F}\` of step \`${$}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${$} -${F}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${$}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let $ of u){let N=l.get($),O=BN[N.type];if(O===void 0)continue;let q={...N.params,...N.members??{},type:O.v2type,state_name:$,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},F=O.schema.safeParse(q);if(!F.success){let C=F.error.issues[0],Z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${$}\` (\`${N.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${Z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${$} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let H={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:v,connections:k,entry_step_id:I(f)},me=ut.safeParse(H);if(!me.success)throw new Vr(me.error.issues.map($=>({line:s[0].n,message:`emitted V3 invalid at ${$.path.length===0?"$":$.path.map(String).join(".")}: ${$.message}`})));return me.data}function GN(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function Jt(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of VN(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=ah(l)}return s}function VN(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function ah(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var BN,qN,nh,Vr,JN,XN,sh,oh,lh=E(()=>{"use strict";Gr();rh();Xr();BN={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Po},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Fo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Uo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Wo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Bo}},qN={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};nh={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"},Vr=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1388
1388
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1389
- `)}`),this.issues=e,this.name="DslCompileError"}},JN=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"]),XN={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},rh=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),nh={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as KN}from"node:fs";function YN(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function zN(t){for(let e of t.split(`
1390
- `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Re(t){if(typeof t=="string"&&YN()&&zN(t)){let r;try{r=sh(t)}catch(s){throw s instanceof Vr?new $t(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=ut.safeParse(r);if(!n.success)throw new $t(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Jo(QN(t));if(ex(e)&&e.definition_schema_version===3){let r=ut.safeParse(e);if(!r.success)throw new $t(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return ZN(e)}function ZN(t){let e=qo.safeParse(t);if(!e.success)throw new $t(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new $t([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Yp(r)}catch(s){throw s instanceof It?new tc(s):s}}function QN(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1391
- `)||e.startsWith("{")||e.startsWith("[")?ah(t):e.endsWith(".json")?ah(KN(e,"utf8")):t}function ah(t){return JSON.parse(t)}function ex(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var tc,$t,Kr=E(()=>{"use strict";Xr();Zp();ec();Gr();ih();tc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},$t=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Xo(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:tx(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:nx(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function tx(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=rx(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function rx(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function nx(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var rc=E(()=>{"use strict"});var lh={};ie(lh,{enqueueFromAgentOutput:()=>ox,enqueueFromGitHubIssue:()=>nc,enqueueManual:()=>sx,enqueueScheduled:()=>ix});function nc(t,e){return Vo(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:Go(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function sx(t,e){return Vo(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:Go(e.payload),concurrency_key:e.concurrency_key})}function ox(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Vo(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Go(e.payload),concurrency_key:e.concurrency_key})}function ix(t,e){return Vo(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:Go(e.payload),concurrency_key:e.concurrency_key})}function Go(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Vo(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Re(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Xo({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var sc=E(()=>{"use strict";Kr();rc()});async function uh(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return ch(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await ax(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...lx(o.parameters_override)},l=ch(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function ch(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[nc(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function ax(t,e){if(t===null||t.trim().length===0)return!0;try{return await gr(t,e)===!0}catch{return!1}}function lx(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 dh=E(()=>{"use strict";Jr();sc()});import{spawnSync as cx}from"node:child_process";async function ic(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=cx(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!dx(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await uh({dal:t.dal,project:t.project,issue:fx(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function Yr(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=ux(r.intake_config);try{let s=await ic({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function ux(t){if(t===null)return{};try{let e=JSON.parse(t);if(!oc(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function dx(t){return Array.isArray(t)&&t.every(e=>{if(!oc(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:oc(n)&&typeof n.name=="string"))})}function fx(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function oc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ko=E(()=>{"use strict";dh()});function mh(t){return async e=>px(t.app,e,t.log!==void 0?{log:t.log}:{})}async function px(t,e,r={}){let n=hx(e.path),s={"content-type":"application/json",...e.headers??{},[Yo]:ac},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await _x(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${fh(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${fh(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function fh(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function hx(t){let e=t.startsWith("/")?t:`/${t}`;return`${mx}${e}`}async function _x(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==Yo&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Yo,ac,mx,lc=E(()=>{"use strict";Yo="x-mailbox-channel",ac="1",mx="http://mailbox.local"});import{createHash as ph,createHmac as gx,timingSafeEqual as wx}from"node:crypto";function hh(){return async(t,e)=>{let r=_h();if(r===null||Sx(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Yo)===ac){await e();return}let n=t.req.query("token");if(n!==void 0&&zo(n,r)){uc(t,r),await e();return}if(Tx(t,r)){await e();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function _h(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function gh(t){let e=_h();return e!==null&&zo(t,e)}function uc(t,e,r=new Date){t.header("Set-Cookie",`${cc}=${Ex(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function wh(t){t.header("Set-Cookie",`${cc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function Ex(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+yx*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${yh(t,n)}`,"utf8").toString("base64url")}function bx(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:zo(s[2],yh(e,`${s[0]}|${s[1]}`))}function zo(t,e){return wx(ph("sha256").update(t).digest(),ph("sha256").update(e).digest())}function Tx(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&zo(r,e))return!0;let n=kx(t.req.header("cookie")??"")[cc];return n!==void 0&&bx(n,e)}function Sx(t){return t==="/login"||t==="/logout"}function kx(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function yh(t,e){return gx("sha256",t).update(e).digest("hex")}var cc,yx,Eh=E(()=>{"use strict";lc();cc="lmctl_next_session",yx=30});import{existsSync as zr,mkdirSync as vx,readdirSync as Ix,readFileSync as Zo,unlinkSync as $x,writeFileSync as mc}from"node:fs";import{join as wr}from"node:path";function Ve(t){if(!Nx.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Th(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return Rx(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:bh,updated_at:bh}:null}function xx(t,e,r,n){let s=r!==null?`
1389
+ `)}`),this.issues=e,this.name="DslCompileError"}},JN=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"]),XN={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},sh=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),oh={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as KN}from"node:fs";function YN(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function zN(t){for(let e of t.split(`
1390
+ `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Re(t){if(typeof t=="string"&&YN()&&zN(t)){let r;try{r=ih(t)}catch(s){throw s instanceof Vr?new $t(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=ut.safeParse(r);if(!n.success)throw new $t(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Jo(QN(t));if(ex(e)&&e.definition_schema_version===3){let r=ut.safeParse(e);if(!r.success)throw new $t(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return ZN(e)}function ZN(t){let e=qo.safeParse(t);if(!e.success)throw new $t(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new $t([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Zp(r)}catch(s){throw s instanceof It?new rc(s):s}}function QN(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1391
+ `)||e.startsWith("{")||e.startsWith("[")?ch(t):e.endsWith(".json")?ch(KN(e,"utf8")):t}function ch(t){return JSON.parse(t)}function ex(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var rc,$t,Kr=E(()=>{"use strict";Xr();eh();tc();Gr();lh();rc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},$t=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Xo(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:tx(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:nx(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function tx(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=rx(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function rx(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function nx(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var nc=E(()=>{"use strict"});var uh={};ie(uh,{enqueueFromAgentOutput:()=>ox,enqueueFromGitHubIssue:()=>sc,enqueueManual:()=>sx,enqueueScheduled:()=>ix});function sc(t,e){return Vo(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:Go(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function sx(t,e){return Vo(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:Go(e.payload),concurrency_key:e.concurrency_key})}function ox(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Vo(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Go(e.payload),concurrency_key:e.concurrency_key})}function ix(t,e){return Vo(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:Go(e.payload),concurrency_key:e.concurrency_key})}function Go(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Vo(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Re(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Xo({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var oc=E(()=>{"use strict";Kr();nc()});async function fh(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return dh(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await ax(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...lx(o.parameters_override)},l=dh(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function dh(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[sc(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function ax(t,e){if(t===null||t.trim().length===0)return!0;try{return await gr(t,e)===!0}catch{return!1}}function lx(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 mh=E(()=>{"use strict";Jr();oc()});import{spawnSync as cx}from"node:child_process";async function ac(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=cx(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!dx(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await fh({dal:t.dal,project:t.project,issue:fx(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function Yr(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=ux(r.intake_config);try{let s=await ac({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function ux(t){if(t===null)return{};try{let e=JSON.parse(t);if(!ic(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function dx(t){return Array.isArray(t)&&t.every(e=>{if(!ic(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:ic(n)&&typeof n.name=="string"))})}function fx(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function ic(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ko=E(()=>{"use strict";mh()});function hh(t){return async e=>px(t.app,e,t.log!==void 0?{log:t.log}:{})}async function px(t,e,r={}){let n=hx(e.path),s={"content-type":"application/json",...e.headers??{},[Yo]:lc},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await _x(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${ph(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${ph(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function ph(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function hx(t){let e=t.startsWith("/")?t:`/${t}`;return`${mx}${e}`}async function _x(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==Yo&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Yo,lc,mx,cc=E(()=>{"use strict";Yo="x-mailbox-channel",lc="1",mx="http://mailbox.local"});import{createHash as _h,createHmac as gx,timingSafeEqual as wx}from"node:crypto";function gh(){return async(t,e)=>{let r=wh();if(r===null||Sx(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Yo)===lc){await e();return}let n=t.req.query("token");if(n!==void 0&&zo(n,r)){dc(t,r),await e();return}if(Tx(t,r)){await e();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function wh(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function yh(t){let e=wh();return e!==null&&zo(t,e)}function dc(t,e,r=new Date){t.header("Set-Cookie",`${uc}=${Ex(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Eh(t){t.header("Set-Cookie",`${uc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function Ex(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+yx*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${bh(t,n)}`,"utf8").toString("base64url")}function bx(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:zo(s[2],bh(e,`${s[0]}|${s[1]}`))}function zo(t,e){return wx(_h("sha256").update(t).digest(),_h("sha256").update(e).digest())}function Tx(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&zo(r,e))return!0;let n=kx(t.req.header("cookie")??"")[uc];return n!==void 0&&bx(n,e)}function Sx(t){return t==="/login"||t==="/logout"}function kx(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function bh(t,e){return gx("sha256",t).update(e).digest("hex")}var uc,yx,Th=E(()=>{"use strict";cc();uc="lmctl_next_session",yx=30});import{existsSync as zr,mkdirSync as vx,readdirSync as Ix,readFileSync as Zo,unlinkSync as $x,writeFileSync as pc}from"node:fs";import{join as wr}from"node:path";function Ve(t){if(!Nx.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function kh(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return Rx(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:Sh,updated_at:Sh}:null}function xx(t,e,r,n){let s=r!==null?`
1392
1392
  description: ${r}`:"";return`---
1393
1393
  name: ${t}${s}
1394
1394
  type: ${e}
1395
1395
  ---
1396
- ${n}`}function jx(t,e,r,n){let s=wr(t,pc),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=zr(s)?Zo(s,"utf8"):"",a=new RegExp(`^- \\[${Sh(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1396
+ ${n}`}function jx(t,e,r,n){let s=wr(t,hc),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=zr(s)?Zo(s,"utf8"):"",a=new RegExp(`^- \\[${vh(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1397
1397
  `)?`${i}
1398
1398
  ${o}
1399
1399
  `:`${i}${o}
1400
- `,mc(s,i,"utf8")}function Ax(t,e){let r=wr(t,pc);if(!zr(r))return;let n=Zo(r,"utf8"),s=new RegExp(`^- \\[${Sh(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&mc(r,n.replace(s,""),"utf8")}function Sh(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Rx(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function rt(t,e){return t.durable_memory_mode==="db"?new fc(e,t.id):new dc(t.local_path)}var Nx,pc,bh,dc,fc,hc=E(()=>{"use strict";Nx=/^[a-zA-Z0-9_-]+$/;pc="MEMORY.md",bh="1970-01-01T00:00:00.000Z",dc=class{dir;constructor(e){this.dir=wr(e,"durable-memory")}read(e){Ve(e);let r=wr(this.dir,`${e}.md`);if(!zr(r))return null;let n=Zo(r,"utf8");return Th(e,n)}write(e){Ve(e.name),vx(this.dir,{recursive:!0});let r=wr(this.dir,`${e.name}.md`),n=!zr(r),s=xx(e.name,e.type,e.description??null,e.body);return mc(r,s,"utf8"),jx(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){Ve(e);let r=wr(this.dir,`${e}.md`);return zr(r)?($x(r),Ax(this.dir,e),!0):!1}listFiles(){if(!zr(this.dir))return[];let e=Ix(this.dir).filter(n=>n.endsWith(".md")&&n!==pc),r=[];for(let n of e){let s=n.slice(0,-3),o=Zo(wr(this.dir,n),"utf8"),i=Th(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};fc=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){Ve(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(e){Ve(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return Ve(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function vh(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=rt(o,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=rt(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!kh.has(a))return n.json({error:`invalid type: must be one of ${[...kh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=rt(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=rt(o,r),a=n.req.query("type");return n.json(i.list(a))})}var kh,Ih=E(()=>{"use strict";hc();kh=new Set(["user","feedback","project","reference"])});function Lx(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(Ox[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function Cx(t){let e=Math.max(1980,t.getFullYear()),r=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,n=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:r,date:n}}function $h(t,e=new Date){let{time:r,date:n}=Cx(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=Lx(h.data),T=h.data.length,S=new Uint8Array(30+g.length),I=new DataView(S.buffer);I.setUint32(0,67324752,!0),I.setUint16(4,20,!0),I.setUint16(6,0,!0),I.setUint16(8,0,!0),I.setUint16(10,r,!0),I.setUint16(12,n,!0),I.setUint32(14,_,!0),I.setUint32(18,T,!0),I.setUint32(22,T,!0),I.setUint16(26,g.length,!0),I.setUint16(28,0,!0),S.set(g,30),s.push(S,h.data);let v=new Uint8Array(46+g.length),k=new DataView(v.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,r,!0),k.setUint16(14,n,!0),k.setUint32(16,_,!0),k.setUint32(20,T,!0),k.setUint32(24,T,!0),k.setUint16(28,g.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,i,!0),v.set(g,46),o.push(v),i+=S.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var Ox,Nh=E(()=>{"use strict";Ox=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let r=e;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;t[e]=r>>>0}return t})()});import{existsSync as ti,mkdirSync as Mx,readdirSync as Dx,readFileSync as Ah,statSync as Px,unlinkSync as Fx,writeFileSync as Ux}from"node:fs";import{join as Bn}from"node:path";function Rh(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await nt(n);if(typeof s=="string")return A(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return A(n,"missing or empty name",400);if(i===null||i.length===0)return A(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return A(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return A(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return A(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=await nt(n);if(typeof o=="string")return A(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return A(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return A(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return A(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return A(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?A(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await nt(n);if(typeof s=="string")return A(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return A(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return A(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return A(n,"team not found",404);let o=await nt(n);if(typeof o=="string")return A(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return A(n,"missing or empty alias",400);if(a===null||a.length===0)return A(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return A(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return A(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return A(n,"member not found",404);let i=await nt(n);if(typeof i=="string")return A(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return A(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return A(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return A(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return A(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?A(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=rt(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=await nt(n);if(typeof o=="string")return A(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return A(n,"missing or empty name",400);if(a===null)return A(n,"missing body",400);if(l===null||!Qo.includes(l))return A(n,`invalid type: must be one of ${Qo.join("|")}`,400);try{Ve(i)}catch(d){return A(n,d.message,400)}let c=rt(s,r);try{if(c.read(i)!==null)return A(n,`chapter already exists: ${i}`,409)}catch(d){return A(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return A(n,d.message,400)}let u=c.read(i);return u===null?A(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=rt(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return A(n,a.message,400)}return i===null?A(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=n.req.param("chapter"),i=await nt(n);if(typeof i=="string")return A(n,i,400);let a=rt(s,r),l;try{l=a.read(o)}catch(m){return A(n,m.message,400)}if(l===null)return A(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!Qo.includes(d))return A(n,`invalid type: must be one of ${Qo.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return A(n,m.message,400)}let f=a.read(o);return f===null?A(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=rt(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return A(n,a.message,400)}return i?n.json({removed:!0}):A(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?A(n,"project not found",404):n.json(Bx(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=await nt(n);if(typeof o=="string")return A(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return A(n,"missing or empty name",400);if(a===null)return A(n,"missing body",400);if(l===null||!ei.has(l))return A(n,`invalid type: must be one of ${[...ei].join("|")}`,400);try{Ve(i)}catch(f){return A(n,f.message,400)}let c=Un(s.local_path),u=Bn(c,`${i}.md`);if(ti(u))return A(n,`chapter already exists: ${i}`,409);Mx(c,{recursive:!0}),jh(u,i,l,ae(o,"description"),a);let d=Wn(c,i);return d===null?A(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);try{Ve(n.req.param("chapter"))}catch(i){return A(n,i.message,400)}let o=Wn(Un(s.local_path),n.req.param("chapter"));return o===null?A(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=n.req.param("chapter");try{Ve(o)}catch(m){return A(n,m.message,400)}let i=Un(s.local_path),a=Wn(i,o);if(a===null)return A(n,"chapter not found",404);let l=await nt(n);if(typeof l=="string")return A(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!ei.has(d))return A(n,`invalid type: must be one of ${[...ei].join("|")}`,400);jh(Bn(i,`${o}.md`),o,d,u,c);let f=Wn(i,o);return f===null?A(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=n.req.param("chapter");try{Ve(o)}catch(a){return A(n,a.message,400)}let i=Bn(Un(s.local_path),`${o}.md`);return ti(i)?(Fx(i),n.json({removed:!0})):A(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>A(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await nt(n);return typeof s=="string"?A(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(xh))),t.post("/api/chat/sessions",async n=>{let s=await Wx(n);if(typeof s=="string")return A(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(xh,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?A(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return A(n,"chat session not found",404);let o=await nt(n);if(typeof o=="string")return A(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return A(n,"role must be one of user|assistant|tool",400);if(a===null)return A(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return A(n,"invalid run id",400);if(r.getRun(s)===null)return A(n,"run not found",404);let i=mr(r,s),a=[];for(let c of i){let u=Hx(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=Ah(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=$h(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function A(t,e,r){return t.json({error:e},r)}async function nt(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 Wx(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(t,e){let r=t[e];return typeof r!="string"?null:r}function Un(t){return Bn(t,"ai-test")}function Wn(t,e){let r=Bn(t,`${e}.md`);if(!ti(r))return null;let n=Ah(r,"utf8"),s=qx(n),o=Px(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function Bx(t){let e=Un(t);return ti(e)?Dx(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Wn(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function jh(t,e,r,n,s){let o=n!==null&&n.length>0?`
1400
+ `,pc(s,i,"utf8")}function Ax(t,e){let r=wr(t,hc);if(!zr(r))return;let n=Zo(r,"utf8"),s=new RegExp(`^- \\[${vh(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&pc(r,n.replace(s,""),"utf8")}function vh(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Rx(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function rt(t,e){return t.durable_memory_mode==="db"?new mc(e,t.id):new fc(t.local_path)}var Nx,hc,Sh,fc,mc,_c=E(()=>{"use strict";Nx=/^[a-zA-Z0-9_-]+$/;hc="MEMORY.md",Sh="1970-01-01T00:00:00.000Z",fc=class{dir;constructor(e){this.dir=wr(e,"durable-memory")}read(e){Ve(e);let r=wr(this.dir,`${e}.md`);if(!zr(r))return null;let n=Zo(r,"utf8");return kh(e,n)}write(e){Ve(e.name),vx(this.dir,{recursive:!0});let r=wr(this.dir,`${e.name}.md`),n=!zr(r),s=xx(e.name,e.type,e.description??null,e.body);return pc(r,s,"utf8"),jx(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){Ve(e);let r=wr(this.dir,`${e}.md`);return zr(r)?($x(r),Ax(this.dir,e),!0):!1}listFiles(){if(!zr(this.dir))return[];let e=Ix(this.dir).filter(n=>n.endsWith(".md")&&n!==hc),r=[];for(let n of e){let s=n.slice(0,-3),o=Zo(wr(this.dir,n),"utf8"),i=kh(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};mc=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){Ve(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(e){Ve(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return Ve(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function $h(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=rt(o,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=rt(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!Ih.has(a))return n.json({error:`invalid type: must be one of ${[...Ih].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=rt(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=rt(o,r),a=n.req.query("type");return n.json(i.list(a))})}var Ih,Nh=E(()=>{"use strict";_c();Ih=new Set(["user","feedback","project","reference"])});function Lx(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(Ox[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function Cx(t){let e=Math.max(1980,t.getFullYear()),r=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,n=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:r,date:n}}function xh(t,e=new Date){let{time:r,date:n}=Cx(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=Lx(h.data),T=h.data.length,S=new Uint8Array(30+g.length),I=new DataView(S.buffer);I.setUint32(0,67324752,!0),I.setUint16(4,20,!0),I.setUint16(6,0,!0),I.setUint16(8,0,!0),I.setUint16(10,r,!0),I.setUint16(12,n,!0),I.setUint32(14,_,!0),I.setUint32(18,T,!0),I.setUint32(22,T,!0),I.setUint16(26,g.length,!0),I.setUint16(28,0,!0),S.set(g,30),s.push(S,h.data);let v=new Uint8Array(46+g.length),k=new DataView(v.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,r,!0),k.setUint16(14,n,!0),k.setUint32(16,_,!0),k.setUint32(20,T,!0),k.setUint32(24,T,!0),k.setUint16(28,g.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,i,!0),v.set(g,46),o.push(v),i+=S.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var Ox,jh=E(()=>{"use strict";Ox=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let r=e;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;t[e]=r>>>0}return t})()});import{existsSync as ti,mkdirSync as Mx,readdirSync as Dx,readFileSync as Oh,statSync as Px,unlinkSync as Fx,writeFileSync as Ux}from"node:fs";import{join as Bn}from"node:path";function Lh(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await nt(n);if(typeof s=="string")return A(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return A(n,"missing or empty name",400);if(i===null||i.length===0)return A(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return A(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return A(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return A(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=await nt(n);if(typeof o=="string")return A(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return A(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return A(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return A(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return A(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?A(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await nt(n);if(typeof s=="string")return A(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return A(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return A(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return A(n,"team not found",404);let o=await nt(n);if(typeof o=="string")return A(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return A(n,"missing or empty alias",400);if(a===null||a.length===0)return A(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return A(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return A(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return A(n,"member not found",404);let i=await nt(n);if(typeof i=="string")return A(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return A(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return A(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return A(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return A(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?A(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=rt(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=await nt(n);if(typeof o=="string")return A(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return A(n,"missing or empty name",400);if(a===null)return A(n,"missing body",400);if(l===null||!Qo.includes(l))return A(n,`invalid type: must be one of ${Qo.join("|")}`,400);try{Ve(i)}catch(d){return A(n,d.message,400)}let c=rt(s,r);try{if(c.read(i)!==null)return A(n,`chapter already exists: ${i}`,409)}catch(d){return A(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return A(n,d.message,400)}let u=c.read(i);return u===null?A(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=rt(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return A(n,a.message,400)}return i===null?A(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=n.req.param("chapter"),i=await nt(n);if(typeof i=="string")return A(n,i,400);let a=rt(s,r),l;try{l=a.read(o)}catch(m){return A(n,m.message,400)}if(l===null)return A(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!Qo.includes(d))return A(n,`invalid type: must be one of ${Qo.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return A(n,m.message,400)}let f=a.read(o);return f===null?A(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=rt(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return A(n,a.message,400)}return i?n.json({removed:!0}):A(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?A(n,"project not found",404):n.json(Bx(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=await nt(n);if(typeof o=="string")return A(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return A(n,"missing or empty name",400);if(a===null)return A(n,"missing body",400);if(l===null||!ei.has(l))return A(n,`invalid type: must be one of ${[...ei].join("|")}`,400);try{Ve(i)}catch(f){return A(n,f.message,400)}let c=Un(s.local_path),u=Bn(c,`${i}.md`);if(ti(u))return A(n,`chapter already exists: ${i}`,409);Mx(c,{recursive:!0}),Rh(u,i,l,ae(o,"description"),a);let d=Wn(c,i);return d===null?A(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);try{Ve(n.req.param("chapter"))}catch(i){return A(n,i.message,400)}let o=Wn(Un(s.local_path),n.req.param("chapter"));return o===null?A(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=n.req.param("chapter");try{Ve(o)}catch(m){return A(n,m.message,400)}let i=Un(s.local_path),a=Wn(i,o);if(a===null)return A(n,"chapter not found",404);let l=await nt(n);if(typeof l=="string")return A(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!ei.has(d))return A(n,`invalid type: must be one of ${[...ei].join("|")}`,400);Rh(Bn(i,`${o}.md`),o,d,u,c);let f=Wn(i,o);return f===null?A(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=n.req.param("chapter");try{Ve(o)}catch(a){return A(n,a.message,400)}let i=Bn(Un(s.local_path),`${o}.md`);return ti(i)?(Fx(i),n.json({removed:!0})):A(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>A(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await nt(n);return typeof s=="string"?A(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Ah))),t.post("/api/chat/sessions",async n=>{let s=await Wx(n);if(typeof s=="string")return A(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(Ah,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?A(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return A(n,"chat session not found",404);let o=await nt(n);if(typeof o=="string")return A(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return A(n,"role must be one of user|assistant|tool",400);if(a===null)return A(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return A(n,"invalid run id",400);if(r.getRun(s)===null)return A(n,"run not found",404);let i=mr(r,s),a=[];for(let c of i){let u=Hx(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=Oh(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=xh(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function A(t,e,r){return t.json({error:e},r)}async function nt(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 Wx(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(t,e){let r=t[e];return typeof r!="string"?null:r}function Un(t){return Bn(t,"ai-test")}function Wn(t,e){let r=Bn(t,`${e}.md`);if(!ti(r))return null;let n=Oh(r,"utf8"),s=qx(n),o=Px(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function Bx(t){let e=Un(t);return ti(e)?Dx(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Wn(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function Rh(t,e,r,n,s){let o=n!==null&&n.length>0?`
1401
1401
  description: ${n}`:"",i=`---
1402
1402
  name: ${e}${o}
1403
1403
  type: ${r}
1404
1404
  ---
1405
- ${s}`;Ux(t,i,"utf8")}function qx(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:o?.[1]?.trim()??null,body:n}}function Hx(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.path!==null?Jx(t.path):Xx(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function Jx(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function Xx(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var Qo,ei,xh,Oh=E(()=>{"use strict";kt();Nh();hc();Qo=["user","feedback","project","reference"],ei=new Set(["smoke","integration","vision","scenario","regression"]),xh="operator"});function $e(t,e){return`<!doctype html>
1405
+ ${s}`;Ux(t,i,"utf8")}function qx(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:o?.[1]?.trim()??null,body:n}}function Hx(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.path!==null?Jx(t.path):Xx(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function Jx(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function Xx(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var Qo,ei,Ah,Ch=E(()=>{"use strict";kt();jh();_c();Qo=["user","feedback","project","reference"],ei=new Set(["smoke","integration","vision","scenario","regression"]),Ah="operator"});function $e(t,e){return`<!doctype html>
1406
1406
  <html lang="en">
1407
1407
  <head>
1408
1408
  <meta charset="utf-8">
@@ -1463,46 +1463,46 @@ ${s}`;Ux(t,i,"utf8")}function qx(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1463
1463
  </nav>
1464
1464
  <main>${e}</main>
1465
1465
  </body>
1466
- </html>`}function b(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function ue(t,e){let r=t.map(s=>`<th>${b(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(o=>`<td>${o}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function le(t){return`<pre>${b(JSON.stringify(t,null,2))}</pre>`}var _c=E(()=>{"use strict"});function Lh(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
1466
+ </html>`}function b(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function ue(t,e){let r=t.map(s=>`<th>${b(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(o=>`<td>${o}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function le(t){return`<pre>${b(JSON.stringify(t,null,2))}</pre>`}var gc=E(()=>{"use strict"});function Mh(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
1467
1467
  JOIN step s ON s.id = sa.step_id
1468
1468
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,t).length>0)return;let n=e.getRun(t);if(n===null)return;let s=e.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t);if(s.length===0)return;let o=s[0].id,i=e.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",t),a=e.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
1469
1469
  JOIN step s ON s.id = sa.step_id
1470
1470
  WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let x of a){let H=l.get(x.step_id)??[];H.push({kind:x.kind,id:x.id}),l.set(x.step_id,H)}let c=i.map(x=>({id:x.id,state_name:x.state_name,outcome:x.outcome,duration_ms:x.started_at!==null&&x.ended_at!==null?Math.max(0,new Date(x.ended_at).getTime()-new Date(x.started_at).getTime()):null,artifacts:l.get(x.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let x of d)try{let H=JSON.parse(x.payload);typeof H.elapsedMs=="number"&&H.elapsedMs>0&&(f+=H.elapsedMs)}catch{}let m=u.map(x=>({kind:x.kind,count:x.count,total_elapsed_ms:x.kind==="tool_result"?f:0})),p=c.filter(x=>x.outcome==="request_changes"),h=[...new Set(p.map(x=>x.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),S=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,I=S!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1471
1471
  WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,S,g,_):[],k=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1472
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],R=k?.input!==null&&k?.input!==void 0?`input: ${k.input}, output: ${k.output??0}`:"n/a",L=e.getWorkflow(n.workflow_id),B=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,ee={run_id:t,workflow_name:L?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:B,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:I,token_totals:R};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(ee)})}var Ch=E(()=>{"use strict"});import{spawnSync as Dh}from"node:child_process";function gc(t){return Gx[t]??`no install hint; ensure '${t}' is on PATH`}function Vx(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 Mh(t){return Dh("which",[t],{encoding:"utf8"}).status===0}function Ph(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Mh(e)){let r=gc(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!Mh(e)){let s=gc(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=Vx(e);if(r===null)continue;let n=Dh(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:gc(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var Gx,Fh=E(()=>{"use strict";Gx={gh:"install: https://cli.github.com/",git:"install: apt-get install git OR brew install git",node:"install: https://nodejs.org/",claude:"install: https://docs.anthropic.com/en/docs/claude-code/quickstart",codex:"install: https://github.com/openai/codex",gemini:"install: https://github.com/google-gemini/gemini-cli",opencode:"install: https://opencode.ai/",qwen:"install: https://github.com/QwenLM/qwen-code"}});import{existsSync as Kx,readdirSync as Yx,readFileSync as zx}from"node:fs";import{join as Uh}from"node:path";function Zx(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1473
- `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function Wh(t,e){let r=t.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function Bh(t,e){if(e.length===0)return null;let r=Uh(t,"durable-memory");if(!Kx(r))return null;let n;try{n=Yx(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=zx(Uh(r,o),"utf8");if(Zx(i).some(l=>e.includes(l))){let l=Wh(i,"name")??o.replace(".md",""),c=Wh(i,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var qh=E(()=>{"use strict"});function Ec(t){let e=t.trim().replace(Qx,"").trim();for(let r=0;r<4;r+=1){let n=ej.exec(e);if(n===null)break;e=n[2].trim()}return e}function Hh(t){let e=t.trim(),r=tj.exec(e);if(r!==null)return r[2];let n=rj.exec(e);return n!==null?n[0]:null}function qn(t,e){let r=t.split(`
1474
- `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=Ec(r[i]),l=wc.exec(a);if(l===null)continue;let c=l[1].trim();if(yc.test(c))continue;let u=Hh(c);u!==null&&(n=u,s=i)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let o={};for(let i=s-1;i>=0;i-=1){let a=Ec(r[i]),l=wc.exec(a);if(l===null)break;let c=yc.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function Jh(t){let e=t.split(`
1475
- `),r=null;for(let n=0;n<e.length;n+=1){let s=Ec(e[n]),o=wc.exec(s);if(o===null)continue;let i=o[1].trim();if(yc.test(i))continue;let a=Hh(i);if(a===null||!$r(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var Qx,ej,wc,yc,tj,rj,bc=E(()=>{"use strict";wn();Qx=/^#{1,6}\s+/,ej=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,wc=/^STANCE:\s+(.+)$/,yc=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,tj=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,rj=/^[A-Za-z0-9_-]+/});function Xh(t,e,r){return n=>{let s=r(),o=Date.now(),i=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var Gh=E(()=>{"use strict"});import{readFileSync as nj}from"node:fs";import{dirname as sj,join as oj}from"node:path";import{fileURLToPath as ij}from"node:url";function cj(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function mj(t){let e=[],r=[];for(let n of t)aj.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function pj(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&lj.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function hj(t,e){if(t.length===0)return{matched:!1};let r=mj(t);for(let n of r){let s=pj(n,e);if(s.matched)return s}return{matched:!1}}function Tc(t){return hj(t,fj)}function _j(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 Sc(t){return _j(t).split(" ").filter(e=>e.length>0)}var aj,lj,uj,dj,fj,Vh=E(()=>{"use strict";aj=new Set(["&&","||",";","|",">",">>","<","<<"]),lj=/^[A-Za-z_][A-Za-z0-9_]*=/;uj=sj(ij(import.meta.url)),dj=JSON.parse(nj(oj(uj,"side_effect_classifier.json"),"utf-8")),fj=cj(dj)});function ri(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function Kh(t,e){try{return await gr(kc(t)??t,ri(e))===!0}catch{return!1}}async function ni(t,e){try{return await gr(kc(t)??t,ri(e))}catch{return}}async function Yh(t,e){if(typeof t!="string")return t;let r=kc(t);if(r===null)return t;try{return await gr(r,ri(e))}catch{return}}async function zh(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=gj(await gr(a,ri(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function kc(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function gj(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Hn=E(()=>{"use strict";Jr()});import{existsSync as Zh,readdirSync as Qh,readFileSync as wj,statSync as e_}from"node:fs";import{join as oi}from"node:path";function t_(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function V(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function Ke(t,e,r,n,s={}){let o=D(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Jn}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=$r(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:xs,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:yj(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function yj(t){return t.length>8e3?`${t.slice(0,8e3)}
1476
- \u2026[truncated ${t.length-8e3} chars]`:t}function K(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function z(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function r_(t,e){let r=e.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let o=Xt(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function We(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=Xt(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=Xt(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=Ej(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return zh(n,e)}function Ej(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function Xt(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 Xn(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=Xh(e.dal,e.run_id,()=>o),c=vc(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let S=Sc(T.summary),I=Tc(S);I.matched&&!c&&(u.violation={summary:T.summary,kind:I.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),bj(T,(S,I)=>{m+=S,p+=I})},g=await Cr({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:ke(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),Tj(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&Ic(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function bj(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=si(s.input_tokens),a=si(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=si(o.input_tokens),a=si(o.output_tokens);(i>0||a>0)&&e(i,a)}}function si(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Nt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await Xn({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function Zr(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=X(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(of(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await We(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1472
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],R=k?.input!==null&&k?.input!==void 0?`input: ${k.input}, output: ${k.output??0}`:"n/a",L=e.getWorkflow(n.workflow_id),B=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,ee={run_id:t,workflow_name:L?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:B,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:I,token_totals:R};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(ee)})}var Dh=E(()=>{"use strict"});import{spawnSync as Fh}from"node:child_process";function wc(t){return Gx[t]??`no install hint; ensure '${t}' is on PATH`}function Vx(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 Ph(t){return Fh("which",[t],{encoding:"utf8"}).status===0}function Uh(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Ph(e)){let r=wc(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!Ph(e)){let s=wc(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=Vx(e);if(r===null)continue;let n=Fh(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:wc(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var Gx,Wh=E(()=>{"use strict";Gx={gh:"install: https://cli.github.com/",git:"install: apt-get install git OR brew install git",node:"install: https://nodejs.org/",claude:"install: https://docs.anthropic.com/en/docs/claude-code/quickstart",codex:"install: https://github.com/openai/codex",gemini:"install: https://github.com/google-gemini/gemini-cli",opencode:"install: https://opencode.ai/",qwen:"install: https://github.com/QwenLM/qwen-code"}});import{existsSync as Kx,readdirSync as Yx,readFileSync as zx}from"node:fs";import{join as Bh}from"node:path";function Zx(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1473
+ `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function qh(t,e){let r=t.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function Hh(t,e){if(e.length===0)return null;let r=Bh(t,"durable-memory");if(!Kx(r))return null;let n;try{n=Yx(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=zx(Bh(r,o),"utf8");if(Zx(i).some(l=>e.includes(l))){let l=qh(i,"name")??o.replace(".md",""),c=qh(i,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var Jh=E(()=>{"use strict"});function bc(t){let e=t.trim().replace(Qx,"").trim();for(let r=0;r<4;r+=1){let n=ej.exec(e);if(n===null)break;e=n[2].trim()}return e}function Xh(t){let e=t.trim(),r=tj.exec(e);if(r!==null)return r[2];let n=rj.exec(e);return n!==null?n[0]:null}function qn(t,e){let r=t.split(`
1474
+ `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=bc(r[i]),l=yc.exec(a);if(l===null)continue;let c=l[1].trim();if(Ec.test(c))continue;let u=Xh(c);u!==null&&(n=u,s=i)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let o={};for(let i=s-1;i>=0;i-=1){let a=bc(r[i]),l=yc.exec(a);if(l===null)break;let c=Ec.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function Gh(t){let e=t.split(`
1475
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=bc(e[n]),o=yc.exec(s);if(o===null)continue;let i=o[1].trim();if(Ec.test(i))continue;let a=Xh(i);if(a===null||!$r(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var Qx,ej,yc,Ec,tj,rj,Tc=E(()=>{"use strict";wn();Qx=/^#{1,6}\s+/,ej=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,yc=/^STANCE:\s+(.+)$/,Ec=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,tj=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,rj=/^[A-Za-z0-9_-]+/});function Vh(t,e,r){return n=>{let s=r(),o=Date.now(),i=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var Kh=E(()=>{"use strict"});import{readFileSync as nj}from"node:fs";import{dirname as sj,join as oj}from"node:path";import{fileURLToPath as ij}from"node:url";function cj(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function mj(t){let e=[],r=[];for(let n of t)aj.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function pj(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&lj.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function hj(t,e){if(t.length===0)return{matched:!1};let r=mj(t);for(let n of r){let s=pj(n,e);if(s.matched)return s}return{matched:!1}}function Sc(t){return hj(t,fj)}function _j(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 kc(t){return _j(t).split(" ").filter(e=>e.length>0)}var aj,lj,uj,dj,fj,Yh=E(()=>{"use strict";aj=new Set(["&&","||",";","|",">",">>","<","<<"]),lj=/^[A-Za-z_][A-Za-z0-9_]*=/;uj=sj(ij(import.meta.url)),dj=JSON.parse(nj(oj(uj,"side_effect_classifier.json"),"utf-8")),fj=cj(dj)});function ri(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function zh(t,e){try{return await gr(vc(t)??t,ri(e))===!0}catch{return!1}}async function ni(t,e){try{return await gr(vc(t)??t,ri(e))}catch{return}}async function Zh(t,e){if(typeof t!="string")return t;let r=vc(t);if(r===null)return t;try{return await gr(r,ri(e))}catch{return}}async function Qh(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=gj(await gr(a,ri(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function vc(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function gj(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Hn=E(()=>{"use strict";Jr()});import{existsSync as e_,readdirSync as t_,readFileSync as wj,statSync as r_}from"node:fs";import{join as oi}from"node:path";function n_(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function V(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function Ke(t,e,r,n,s={}){let o=D(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Jn}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=$r(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:xs,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:yj(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function yj(t){return t.length>8e3?`${t.slice(0,8e3)}
1476
+ \u2026[truncated ${t.length-8e3} chars]`:t}function K(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function z(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function s_(t,e){let r=e.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let o=Xt(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function We(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=Xt(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=Xt(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=Ej(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return Qh(n,e)}function Ej(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function Xt(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 Xn(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=Vh(e.dal,e.run_id,()=>o),c=Ic(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let S=kc(T.summary),I=Sc(S);I.matched&&!c&&(u.violation={summary:T.summary,kind:I.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),bj(T,(S,I)=>{m+=S,p+=I})},g=await Cr({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:ke(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),Tj(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&$c(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function bj(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=si(s.input_tokens),a=si(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=si(o.input_tokens),a=si(o.output_tokens);(i>0||a>0)&&e(i,a)}}function si(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Nt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await Xn({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function Zr(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=X(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(lf(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await We(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1477
1477
 
1478
- `);try{let p=await Xn({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=qn(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function Qr(t,e){return(e?.length??0)>0?Bh(t.project.local_path,e):null}function n_(t){return Tc(Sc(t))}function vc(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1478
+ `);try{let p=await Xn({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=qn(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function Qr(t,e){return(e?.length??0)>0?Hh(t.project.local_path,e):null}function o_(t){return Sc(kc(t))}function Ic(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1479
1479
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1480
- ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(r.length===0)return!1;let n=r[0];return t.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function Ic(t,e){if(!Zh(t))return!1;let r=oi(t,"durable-memory");function n(s){let o;try{o=Qh(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=oi(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(e_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function Tj(t,e,r){let n=oi(t.local_path,"durable-memory");if(!Zh(n))return;let s;try{s=Qh(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=oi(n,o),a;try{a=e_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=wj(i,"utf8")}catch{continue}let c=kj(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1481
- `);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 kj(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!Sj.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var Jn,Sj,De=E(()=>{"use strict";Ce();Xr();$n();qh();bc();wn();Gh();Vh();Hn();Jn="__paused__:";Sj=new Set(["user","feedback","project","reference"])});import{spawnSync as s_}from"node:child_process";function vj(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=s_("git",["diff","--quiet"],{cwd:o}).status!==0,a=s_("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),K(t,r,n,Vl),{kind:"terminal",terminal:z(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),K(t,r,n,"clean"),V(t.workflow,e.next)}var o_,i_=E(()=>{"use strict";De();o_={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=>vj(t,t.state)}});async function Ij(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await Kh(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),K(t,r,n,"matched"),V(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),K(t,r,n,"no_match"),e.default_next!==void 0?V(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":z(t.workflow)}}var a_,l_=E(()=>{"use strict";De();Hn();a_={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=>Ij(t,t.state)}});async function $j(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=Qr(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await Zr(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1480
+ ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(r.length===0)return!1;let n=r[0];return t.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function $c(t,e){if(!e_(t))return!1;let r=oi(t,"durable-memory");function n(s){let o;try{o=t_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=oi(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(r_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function Tj(t,e,r){let n=oi(t.local_path,"durable-memory");if(!e_(n))return;let s;try{s=t_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=oi(n,o),a;try{a=r_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=wj(i,"utf8")}catch{continue}let c=kj(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1481
+ `);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 kj(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!Sj.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var Jn,Sj,De=E(()=>{"use strict";Ce();Xr();$n();Jh();Tc();wn();Kh();Yh();Hn();Jn="__paused__:";Sj=new Set(["user","feedback","project","reference"])});import{spawnSync as i_}from"node:child_process";function vj(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=i_("git",["diff","--quiet"],{cwd:o}).status!==0,a=i_("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),K(t,r,n,Kl),{kind:"terminal",terminal:z(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),K(t,r,n,"clean"),V(t.workflow,e.next)}var a_,l_=E(()=>{"use strict";De();a_={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=>vj(t,t.state)}});async function Ij(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await zh(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),K(t,r,n,"matched"),V(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),K(t,r,n,"no_match"),e.default_next!==void 0?V(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":z(t.workflow)}}var c_,u_=E(()=>{"use strict";De();Hn();c_={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=>Ij(t,t.state)}});async function $j(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=Qr(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await Zr(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1482
1482
  ${m}`:null).filter(m=>m!==null).join(`
1483
1483
 
1484
- `),c=`${n}:consolidator`,u=await Zr(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&K(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:z(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),K(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Nt(t,n,m,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.ok)}var c_,u_=E(()=>{"use strict";De();c_={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=>$j(t,t.state)}});async function Nj(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await ni(e.items_from,t),a=Rj(i);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:z(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await jj(t,e,s.id,a,l):await xj(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),K(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:z(t.workflow)}}return V(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function xj(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await f_(t,e,r,n[i],i,s);if(s.routed!==null||(o.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return o}async function jj(t,e,r,n,s){let o=new Array(n.length),i=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;i<n.length&&s.routed===null;){let l=i;i+=1,o[l]=await f_(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function f_(t,e,r,n,s,o){let i=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=i}(l.kind==="paused"||l.kind==="escalate")&&o.routed===null&&(o.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":Aj(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:u}}),{index:s,value:n,outcome:u}}function Aj(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Rj(t){if(!Array.isArray(t))return null;let e=[];for(let r of t)if(typeof r=="string")e.push(r);else if(typeof r=="number"||typeof r=="boolean")e.push(String(r));else return null;return e}var d_,m_=E(()=>{"use strict";De();Hn();d_={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=>Nj(t,t.state)}});async function Oj(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:z(t.workflow)}}let i=Qr(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,r);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[n]="done",e.write_back_durable_memory&&await Nt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),K(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:z(t.workflow)}}let f=a.last_operator_input??"";try{let m=await Xn({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:z(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),K(t,r,n,"done"),e.write_back_durable_memory&&await Nt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(p_({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ee?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:z(t.workflow)}}}return{kind:"paused"}}let l=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await We(e.agent.initial_prompt_template,t,n),d=i?`${i}
1484
+ `),c=`${n}:consolidator`,u=await Zr(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&K(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:z(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),K(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Nt(t,n,m,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.ok)}var d_,f_=E(()=>{"use strict";De();d_={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=>$j(t,t.state)}});async function Nj(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await ni(e.items_from,t),a=Rj(i);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:z(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await jj(t,e,s.id,a,l):await xj(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),K(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:z(t.workflow)}}return V(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function xj(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await p_(t,e,r,n[i],i,s);if(s.routed!==null||(o.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return o}async function jj(t,e,r,n,s){let o=new Array(n.length),i=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;i<n.length&&s.routed===null;){let l=i;i+=1,o[l]=await p_(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function p_(t,e,r,n,s,o){let i=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=i}(l.kind==="paused"||l.kind==="escalate")&&o.routed===null&&(o.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":Aj(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:u}}),{index:s,value:n,outcome:u}}function Aj(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Rj(t){if(!Array.isArray(t))return null;let e=[];for(let r of t)if(typeof r=="string")e.push(r);else if(typeof r=="number"||typeof r=="boolean")e.push(String(r));else return null;return e}var m_,h_=E(()=>{"use strict";De();Hn();m_={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=>Nj(t,t.state)}});async function Oj(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:z(t.workflow)}}let i=Qr(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,r);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[n]="done",e.write_back_durable_memory&&await Nt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),K(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:z(t.workflow)}}let f=a.last_operator_input??"";try{let m=await Xn({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:z(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),K(t,r,n,"done"),e.write_back_durable_memory&&await Nt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(__({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ee?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:z(t.workflow)}}}return{kind:"paused"}}let l=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await We(e.agent.initial_prompt_template,t,n),d=i?`${i}
1485
1485
 
1486
- ${u}`:u;try{let f=await Xn({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:z(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Nt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(p_({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:z(t.workflow)}}}function p_(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=D();e.dal.setRunPausedState(e.run_id,`${Jn}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(Lj({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function Lj(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=Cj(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:Mj(o,3),paused_at:i,created_run_inputs:Xt(e.job.payload)}}function Cj(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function Mj(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var h_,__=E(()=>{"use strict";$n();De();h_={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=>Oj(t,t.state)}});async function Dj(t,e){let r=t.stateId,n=t.displayName,s=r_(t,e.over);if(s===null){let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:z(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:z(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=Pj(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),K(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:z(t.workflow)}}return V(t.workflow,e.outcomes.ok)}function Pj(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var g_,w_=E(()=>{"use strict";De();g_={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>Dj(t,t.state)}});import{createHash as Fj}from"node:crypto";import{existsSync as Uj,mkdirSync as Wj,readFileSync as Bj,writeFileSync as qj}from"node:fs";import{dirname as Hj,isAbsolute as E_,normalize as Jj,resolve as Gn}from"node:path";import{Document as Xj,ExternalHyperlink as Gj,HeadingLevel as en,LevelFormat as Vj,Packer as Kj,Paragraph as st,Table as Yj,TableCell as zj,TableRow as Zj,TextRun as ot,WidthType as Qj}from"docx";import{marked as eA}from"marked";async function tA(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await rA(t,e,n),i=await nA(t,e),a=await sA(t,e.title),l=await cA(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return Wj(Hj(i),{recursive:!0}),qj(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:Fj("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),K(t,r,n,{output_path:i,path:i,bytes:l.length}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),K(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function rA(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await We(e.markdown_source,t,r)).trim(),o=(n.length===0?lA(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=iA(t.project.local_path,o);if(i!==null){if(!Uj(i))throw new Error(`markdown_source file not found: ${i}`);return ii(Bj(i,"utf8"))}return ii(o)}async function nA(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await We(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=oA(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function sA(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await We(e,t,t.stateId)).trim();return r.length===0?null:r}function oA(t,e){let r=Gn(t);return Jj(E_(e)?Gn(e):Gn(r,e))}function iA(t,e){return aA(e)?E_(e)?Gn(e):Gn(t,e):null}function aA(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function lA(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return ii(s);let o=t.dal.query(`SELECT sa.content
1486
+ ${u}`:u;try{let f=await Xn({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:z(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Nt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(__({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:z(t.workflow)}}}function __(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=D();e.dal.setRunPausedState(e.run_id,`${Jn}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(Lj({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function Lj(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=Cj(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:Mj(o,3),paused_at:i,created_run_inputs:Xt(e.job.payload)}}function Cj(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function Mj(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var g_,w_=E(()=>{"use strict";$n();De();g_={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=>Oj(t,t.state)}});async function Dj(t,e){let r=t.stateId,n=t.displayName,s=s_(t,e.over);if(s===null){let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:z(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:z(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=Pj(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),K(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:z(t.workflow)}}return V(t.workflow,e.outcomes.ok)}function Pj(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var y_,E_=E(()=>{"use strict";De();y_={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>Dj(t,t.state)}});import{createHash as Fj}from"node:crypto";import{existsSync as Uj,mkdirSync as Wj,readFileSync as Bj,writeFileSync as qj}from"node:fs";import{dirname as Hj,isAbsolute as T_,normalize as Jj,resolve as Gn}from"node:path";import{Document as Xj,ExternalHyperlink as Gj,HeadingLevel as en,LevelFormat as Vj,Packer as Kj,Paragraph as st,Table as Yj,TableCell as zj,TableRow as Zj,TextRun as ot,WidthType as Qj}from"docx";import{marked as eA}from"marked";async function tA(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await rA(t,e,n),i=await nA(t,e),a=await sA(t,e.title),l=await cA(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return Wj(Hj(i),{recursive:!0}),qj(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:Fj("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),K(t,r,n,{output_path:i,path:i,bytes:l.length}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),K(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function rA(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await We(e.markdown_source,t,r)).trim(),o=(n.length===0?lA(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=iA(t.project.local_path,o);if(i!==null){if(!Uj(i))throw new Error(`markdown_source file not found: ${i}`);return ii(Bj(i,"utf8"))}return ii(o)}async function nA(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await We(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=oA(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function sA(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await We(e,t,t.stateId)).trim();return r.length===0?null:r}function oA(t,e){let r=Gn(t);return Jj(T_(e)?Gn(e):Gn(r,e))}function iA(t,e){return aA(e)?T_(e)?Gn(e):Gn(t,e):null}function aA(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function lA(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return ii(s);let o=t.dal.query(`SELECT sa.content
1487
1487
  FROM step_artifact sa
1488
1488
  JOIN step s ON s.id = sa.step_id
1489
1489
  WHERE s.run_id = ?
1490
1490
  AND s.state_name LIKE ?
1491
1491
  AND sa.content IS NOT NULL
1492
1492
  ORDER BY sa.id DESC
1493
- LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:ii(o[0].content)}function ii(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function cA(t,e){let r=T_(eA.lexer(t,{gfm:!0})),n=new Xj({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:Vj.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new st("")]:r}]});return Kj.toBuffer(n)}function T_(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new st({heading:_A(r.depth),children:Vt(Gt(r))}));break;case"paragraph":e.push(new st({children:Vt(Gt(r))}));break;case"text":e.push(new st({children:Gt(r).length===0?[new ot(r.text)]:Vt(Gt(r))}));break;case"blockquote":e.push(...T_(Gt(r)).map(n=>n instanceof st?n:new st({children:[new ot(r.text)]})));break;case"list":mA(r)&&e.push(...uA(r));break;case"table":pA(r)&&e.push(dA(r));break;case"code":hA(r)&&e.push(...fA(r));break;case"hr":e.push(new st(""));break;case"html":r.text.trim().length>0&&e.push(new st({children:[new ot(r.text)]}));break;default:break}return e}function Vt(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new ot({text:n.text,...$c(e)}));break;case"strong":r.push(...Vt(Gt(n),{...e,bold:!0}));break;case"em":r.push(...Vt(Gt(n),{...e,italics:!0}));break;case"codespan":r.push(new ot({text:n.text,...$c({...e,code:!0})}));break;case"link":r.push(new Gj({link:n.href,children:Vt(Gt(n),{...e})}));break;case"br":r.push(new ot({text:"",break:1}));break;case"image":r.push(new ot({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new ot({text:n.text,strike:!0}));break;default:r.push(new ot({text:n.raw,...$c(e)}));break}return r.length===0?[new ot("")]:r}function $c(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function uA(t){return t.items.map(e=>new st({children:Vt(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:y_(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:y_(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function y_(t){return t.task?`[${t.checked?"x":" "}] `:""}function dA(t){let e=[t.header,...t.rows].map(r=>new Zj({children:r.map(n=>new zj({children:[new st({children:Vt(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new Yj({width:{size:100,type:Qj.PERCENTAGE},rows:e})}function fA(t){return t.text.split(`
1494
- `).map(r=>new st({children:[new ot({text:r.length===0?" ":r,font:"Courier New"})]}))}function Gt(t){let e=t.tokens;return Array.isArray(e)?e:[]}function mA(t){return t.type==="list"&&Array.isArray(t.items)}function pA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function hA(t){return t.type==="code"&&typeof t.text=="string"}function _A(t){switch(t){case 1:return en.HEADING_1;case 2:return en.HEADING_2;case 3:return en.HEADING_3;case 4:return en.HEADING_4;case 5:return en.HEADING_5;default:return en.HEADING_6}}var b_,S_=E(()=>{"use strict";De();b_={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=>tA(t,t.state)}});import{createHash as gA}from"node:crypto";import{existsSync as wA,mkdirSync as yA,readFileSync as k_,statSync as EA}from"node:fs";import{dirname as bA,isAbsolute as v_,normalize as TA,resolve as Vn}from"node:path";import SA from"exceljs";import{marked as kA}from"marked";async function vA(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await IA(t,e),i=$A(e.input_format),a=await NA(t,e),l=await xA(t,e.title),c=i==="markdown"?PA(o):OA(o);await FA({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=EA(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=gA("sha256").update(k_(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),K(t,r,n,{output_path:a,path:a,bytes:u}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),K(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function IA(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await We(e.source,t,t.stateId)).trim(),n=AA(t.project.local_path,r);if(n!==null){if(!wA(n))throw new Error(`source file not found: ${n}`);return k_(n,"utf8")}return r}function $A(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function NA(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await We(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=jA(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function xA(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await We(e,t,t.stateId)).trim();return r.length===0?null:r}function jA(t,e){let r=Vn(t);return TA(v_(e)?Vn(e):Vn(r,e))}function AA(t,e){return RA(e)?v_(e)?Vn(e):Vn(t,e):null}function RA(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function OA(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!ai(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>LA(r,n))}function LA(t,e){if(!ai(t))throw new Error(`sheets[${e}] must be an object`);let r=CA(t.headers,`sheets[${e}].headers`),n=MA(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:r,rows:n,headerStyle:DA(t.styles)}}function CA(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))throw new Error(`${e} must be an array of strings`);return t}function MA(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function DA(t){if(!ai(t)||!ai(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 PA(t){let e=kA.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(HA(s)){n=s.text;continue}JA(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function FA(t){yA(bA(t.outputPath),{recursive:!0});let e=new SA.Workbook;e.creator="lmctl",e.created=new Date,e.modified=new Date,e.title=t.title;let r=new Set;for(let n of t.sheets){let s=e.addWorksheet(WA(n.name,r));if(n.headers.length>0){let o=s.addRow(n.headers);o.font={bold:n.headerStyle?.bold??!0};let i=qA(n.headerStyle?.fill);i!==null&&o.eachCell(a=>{a.fill={type:"pattern",pattern:"solid",fgColor:{argb:i}}})}for(let o of n.rows)s.addRow(o);UA(s,n)}await e.xlsx.writeFile(t.outputPath)}function UA(t,e){let r=Math.max(e.headers.length,...e.rows.map(n=>n.length),1);for(let n=1;n<=r;n+=1){let s=[e.headers[n-1],...e.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));t.getColumn(n).width=o}}function WA(t,e){let r=BA(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function BA(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function qA(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`FF${e.toUpperCase()}`:null}function HA(t){return t.type==="heading"&&typeof t.text=="string"}function JA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ai(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var I_,$_=E(()=>{"use strict";De();I_={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=>vA(t,t.state)}});import{spawnSync as XA}from"node:child_process";async function VA(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(XA("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),K(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?V(t.workflow,h):{kind:"terminal",terminal:z(t.workflow)}}let o=Qr(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await Zr(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1495
- ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=Jh(p.text);if(g!==null){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let T=Object.keys(e.outcomes_from_stance),S=qn(p.text,T);if(S.outcome===null){let v=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,null,`unhandled_stance:${S.reason}`),{kind:"escalate",token:"",reason:`no_stance:${S.reason}`}}let I=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(I.id,S.outcome,"outcomes_from_stance"),K(t,r,n,S.outcome),V(t.workflow,e.outcomes_from_stance[S.outcome])}let g=qn(p.text,GA);if(g.outcome!==null){let T=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),K(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),K(t,r,n,"approve"),e.write_back_durable_memory){let T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await Nt(t,n,T,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>Zr(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1493
+ LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:ii(o[0].content)}function ii(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function cA(t,e){let r=k_(eA.lexer(t,{gfm:!0})),n=new Xj({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:Vj.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new st("")]:r}]});return Kj.toBuffer(n)}function k_(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new st({heading:_A(r.depth),children:Vt(Gt(r))}));break;case"paragraph":e.push(new st({children:Vt(Gt(r))}));break;case"text":e.push(new st({children:Gt(r).length===0?[new ot(r.text)]:Vt(Gt(r))}));break;case"blockquote":e.push(...k_(Gt(r)).map(n=>n instanceof st?n:new st({children:[new ot(r.text)]})));break;case"list":mA(r)&&e.push(...uA(r));break;case"table":pA(r)&&e.push(dA(r));break;case"code":hA(r)&&e.push(...fA(r));break;case"hr":e.push(new st(""));break;case"html":r.text.trim().length>0&&e.push(new st({children:[new ot(r.text)]}));break;default:break}return e}function Vt(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new ot({text:n.text,...Nc(e)}));break;case"strong":r.push(...Vt(Gt(n),{...e,bold:!0}));break;case"em":r.push(...Vt(Gt(n),{...e,italics:!0}));break;case"codespan":r.push(new ot({text:n.text,...Nc({...e,code:!0})}));break;case"link":r.push(new Gj({link:n.href,children:Vt(Gt(n),{...e})}));break;case"br":r.push(new ot({text:"",break:1}));break;case"image":r.push(new ot({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new ot({text:n.text,strike:!0}));break;default:r.push(new ot({text:n.raw,...Nc(e)}));break}return r.length===0?[new ot("")]:r}function Nc(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function uA(t){return t.items.map(e=>new st({children:Vt(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:b_(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:b_(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function b_(t){return t.task?`[${t.checked?"x":" "}] `:""}function dA(t){let e=[t.header,...t.rows].map(r=>new Zj({children:r.map(n=>new zj({children:[new st({children:Vt(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new Yj({width:{size:100,type:Qj.PERCENTAGE},rows:e})}function fA(t){return t.text.split(`
1494
+ `).map(r=>new st({children:[new ot({text:r.length===0?" ":r,font:"Courier New"})]}))}function Gt(t){let e=t.tokens;return Array.isArray(e)?e:[]}function mA(t){return t.type==="list"&&Array.isArray(t.items)}function pA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function hA(t){return t.type==="code"&&typeof t.text=="string"}function _A(t){switch(t){case 1:return en.HEADING_1;case 2:return en.HEADING_2;case 3:return en.HEADING_3;case 4:return en.HEADING_4;case 5:return en.HEADING_5;default:return en.HEADING_6}}var S_,v_=E(()=>{"use strict";De();S_={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=>tA(t,t.state)}});import{createHash as gA}from"node:crypto";import{existsSync as wA,mkdirSync as yA,readFileSync as I_,statSync as EA}from"node:fs";import{dirname as bA,isAbsolute as $_,normalize as TA,resolve as Vn}from"node:path";import SA from"exceljs";import{marked as kA}from"marked";async function vA(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await IA(t,e),i=$A(e.input_format),a=await NA(t,e),l=await xA(t,e.title),c=i==="markdown"?PA(o):OA(o);await FA({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=EA(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=gA("sha256").update(I_(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),K(t,r,n,{output_path:a,path:a,bytes:u}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),K(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function IA(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await We(e.source,t,t.stateId)).trim(),n=AA(t.project.local_path,r);if(n!==null){if(!wA(n))throw new Error(`source file not found: ${n}`);return I_(n,"utf8")}return r}function $A(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function NA(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await We(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=jA(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function xA(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await We(e,t,t.stateId)).trim();return r.length===0?null:r}function jA(t,e){let r=Vn(t);return TA($_(e)?Vn(e):Vn(r,e))}function AA(t,e){return RA(e)?$_(e)?Vn(e):Vn(t,e):null}function RA(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function OA(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!ai(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>LA(r,n))}function LA(t,e){if(!ai(t))throw new Error(`sheets[${e}] must be an object`);let r=CA(t.headers,`sheets[${e}].headers`),n=MA(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:r,rows:n,headerStyle:DA(t.styles)}}function CA(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))throw new Error(`${e} must be an array of strings`);return t}function MA(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function DA(t){if(!ai(t)||!ai(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 PA(t){let e=kA.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(HA(s)){n=s.text;continue}JA(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function FA(t){yA(bA(t.outputPath),{recursive:!0});let e=new SA.Workbook;e.creator="lmctl",e.created=new Date,e.modified=new Date,e.title=t.title;let r=new Set;for(let n of t.sheets){let s=e.addWorksheet(WA(n.name,r));if(n.headers.length>0){let o=s.addRow(n.headers);o.font={bold:n.headerStyle?.bold??!0};let i=qA(n.headerStyle?.fill);i!==null&&o.eachCell(a=>{a.fill={type:"pattern",pattern:"solid",fgColor:{argb:i}}})}for(let o of n.rows)s.addRow(o);UA(s,n)}await e.xlsx.writeFile(t.outputPath)}function UA(t,e){let r=Math.max(e.headers.length,...e.rows.map(n=>n.length),1);for(let n=1;n<=r;n+=1){let s=[e.headers[n-1],...e.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));t.getColumn(n).width=o}}function WA(t,e){let r=BA(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function BA(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function qA(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`FF${e.toUpperCase()}`:null}function HA(t){return t.type==="heading"&&typeof t.text=="string"}function JA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ai(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var N_,x_=E(()=>{"use strict";De();N_={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=>vA(t,t.state)}});import{spawnSync as XA}from"node:child_process";async function VA(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(XA("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),K(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?V(t.workflow,h):{kind:"terminal",terminal:z(t.workflow)}}let o=Qr(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await Zr(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1495
+ ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=Gh(p.text);if(g!==null){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let T=Object.keys(e.outcomes_from_stance),S=qn(p.text,T);if(S.outcome===null){let v=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,null,`unhandled_stance:${S.reason}`),{kind:"escalate",token:"",reason:`no_stance:${S.reason}`}}let I=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(I.id,S.outcome,"outcomes_from_stance"),K(t,r,n,S.outcome),V(t.workflow,e.outcomes_from_stance[S.outcome])}let g=qn(p.text,GA);if(g.outcome!==null){let T=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),K(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),K(t,r,n,"approve"),e.write_back_durable_memory){let T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await Nt(t,n,T,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>Zr(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1496
1496
  ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),K(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await Nt(t,n,_,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1497
1497
 
1498
- `),e.loop_feedback_artifact!==void 0){let g=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),K(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:z(t.workflow)}}var GA,N_,x_=E(()=>{"use strict";bc();De();GA=["blocked","failed","aborted"],N_={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=>VA(t,t.state)}});import{spawnSync as KA}from"node:child_process";async function YA(t,e){let r=t.stateId,n=t.displayName,s=await We(e.command,t,n),o=vc(t,n),i=n_(s);if(i.matched&&!o){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=KA("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Ic(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:z(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),K(t,r,n,m),V(t.workflow,p))}var j_,A_=E(()=>{"use strict";De();j_={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=>YA(t,t.state)}});async function zA(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:z(t.workflow)};let i=Re(o.definition),a=await ZA(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:z(t.workflow)};K(t,r,n,QA(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:z(t.workflow)}:V(t.workflow,u)}async function ZA(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await Yh(s,t);r[n]=o===s?await ni(s,t):o}return r}function QA(t,e,r){let n={};for(let s of r)n[s.name]=eR(t,e,s);return n}function eR(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=tR(s,r.source_field);if(o.found)return o.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function tR(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 R_,O_=E(()=>{"use strict";Kr();De();Hn();R_={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=>zA(t,t.state)}});function rR(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),K(t,r,n,s),{kind:"terminal",terminal:s}}var L_,C_=E(()=>{"use strict";De();L_={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=>rR(t,t.state)}});async function nR(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=sR(t.cursor),a=o.filter(oR).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function sR(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function oR(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 M_,D_=E(()=>{"use strict";M_={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=>nR(t)}});async function iR(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var P_,F_=E(()=>{"use strict";P_={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=>iR(t)}});function U_(t){t.register(o_),t.register(N_),t.register(c_),t.register(h_),t.register(g_),t.register(b_),t.register(I_),t.register(j_),t.register(a_),t.register(d_),t.register(R_),t.register(L_),t.register(P_),t.register(M_)}var W_=E(()=>{"use strict";i_();l_();u_();m_();__();w_();S_();$_();x_();A_();O_();C_();D_();F_()});function ci(){return li===null&&(li=new Nc,U_(li)),li}var aR,Nc,li,xc=E(()=>{"use strict";W_();aR={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"},Nc=class{types=new Map;register(e){let r=`${e.description.namespace}/${e.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,e)}get(e){let r=e.includes("/")?e:aR[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},li=null});async function H_(t){K_(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let r=t.dal.getProjectByJob(t.job.id);if(r===null)throw new Error(`job ${t.job.id} has no project`);let n=cR(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Kn(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=Ph(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Kn(n)){let m=jc({dal:t.dal,workflow:di(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:Xt(t.job.payload)??{},team_id:t.team.id}),p=await X_(n,m,i.current_state??n.entry_step_id);return q_(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=jc({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:Xt(t.job.payload)??{},team_id:t.team.id}),f=await J_(d,i.current_state??n.start_at);return q_(t.dal,r.id,i.id,n.name,f),f}function q_(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function jc(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await Ac(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{K_(n);let o=Kn(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=jc({dal:t.dal,workflow:Kn(n)?di(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Kn(n)?X_(n,a,i.current_state??n.entry_step_id):J_(a,i.current_state??n.start_at)}};return e}async function J_(t,e){let r=e;if(r.startsWith(Jn))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return xt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=ui(t,z(t.workflow));if(l.kind==="paused")return Oe(t);if(l.kind==="escalate")return Ke(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Oe(t);if(l.kind==="terminal")return xt(t,l.terminal);r=l.state;continue}let i,a=V_(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===gn)return xt(t,Ea);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):Ke(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Ac(t,r,o);if(i.kind==="paused")return Oe(t);if(i.kind==="escalate")return Ke(t,{id:r,name:r,type:o.type},i.token,i.reason),Oe(t);if(i.kind==="terminal"){let l=ui(t,i.terminal);if(l.kind==="paused")return Oe(t);if(l.kind==="escalate")return Ke(t,{id:r,name:r,type:o.type},l.token,l.reason),Oe(t);if(l.kind==="terminal")return xt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=ui(t,z(t.workflow));return n.kind==="terminal"?xt(t,n.terminal):xt(t,z(t.workflow))}async function X_(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return Ke(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Oe(e);let l=V_(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===gn)return xt(e,Ea);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 Ke(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}),Oe(e);o=h;continue}let c=await lR(e,t,a);if(c.kind==="paused")return Oe(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return Ke(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Oe(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=di(t,a);try{let p=ui(e,d);if(p.kind==="paused")return Oe(e);if(p.kind==="escalate")return Ke(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Oe(e);if(p.kind==="terminal")return xt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return Ke(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Oe(e);o=h.id;continue}finally{e.workflow=m}}if($r(d))return Ke(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Oe(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 Ke(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Oe(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),xt(e,"aborted")}async function lR(t,e,r){let n=G_(e,r),s=t.workflow;t.workflow=di(e,r);try{return await Ac(t,r.id,n,r.name)}finally{t.workflow=s}}function G_(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function Ac(t,e,r,n){let s=ci().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?fR(t,s):void 0,t.progress_step_id=null;try{return await s.execute(t_(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function cR(t,e){try{let r=JSON.parse(t);if(dR(r)&&r.definition_schema_version===3)return ut.parse(r)}catch{return e}return e}function Kn(t){return t.definition_schema_version===3}function di(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=G_(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:uR(e.parameters.kind)}),n.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:n,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function uR(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function dR(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function fR(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function xt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Lh(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Oe(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function V_(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function ui(t,e){if(!mR(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let r=t.workflow.errors;return r===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&pR(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function mR(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function pR(t,e,r){let n=hR(t),s=r.capture_evidence&&n!==null?_R(t,n.id):[];t.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function hR(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 _R(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(n=>n.path)}function K_(t){if(!B_.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${B_.join(", ")}`)}var B_,Y_=E(()=>{"use strict";Gr();Ch();Fh();De();xc();wn();B_=[1,2,3]});import{readFileSync as gR,readdirSync as wR}from"node:fs";import{basename as yR,join as ER,resolve as bR}from"node:path";function Q_(t={}){let e=bR(t.workflowsDir??"workflows"),r=wR(e).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:r.map(n=>TR(ER(e,n)))}}function TR(t){let e=yR(t);try{let r=gR(t,"utf8"),n=Re(r);return rg(e,n)}catch(r){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:ng(r)}}}function eg(t,e){try{let r=Re(e);return rg(t,r)}catch(r){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:ng(r)}}}function tg(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1498
+ `),e.loop_feedback_artifact!==void 0){let g=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),K(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:z(t.workflow)}}var GA,j_,A_=E(()=>{"use strict";Tc();De();GA=["blocked","failed","aborted"],j_={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=>VA(t,t.state)}});import{spawnSync as KA}from"node:child_process";async function YA(t,e){let r=t.stateId,n=t.displayName,s=await We(e.command,t,n),o=Ic(t,n),i=o_(s);if(i.matched&&!o){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=KA("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&$c(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:z(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),K(t,r,n,m),V(t.workflow,p))}var R_,O_=E(()=>{"use strict";De();R_={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=>YA(t,t.state)}});async function zA(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:z(t.workflow)};let i=Re(o.definition),a=await ZA(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:z(t.workflow)};K(t,r,n,QA(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:z(t.workflow)}:V(t.workflow,u)}async function ZA(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await Zh(s,t);r[n]=o===s?await ni(s,t):o}return r}function QA(t,e,r){let n={};for(let s of r)n[s.name]=eR(t,e,s);return n}function eR(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=tR(s,r.source_field);if(o.found)return o.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function tR(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 L_,C_=E(()=>{"use strict";Kr();De();Hn();L_={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=>zA(t,t.state)}});function rR(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),K(t,r,n,s),{kind:"terminal",terminal:s}}var M_,D_=E(()=>{"use strict";De();M_={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=>rR(t,t.state)}});async function nR(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=sR(t.cursor),a=o.filter(oR).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function sR(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function oR(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 P_,F_=E(()=>{"use strict";P_={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=>nR(t)}});async function iR(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var U_,W_=E(()=>{"use strict";U_={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=>iR(t)}});function B_(t){t.register(a_),t.register(j_),t.register(d_),t.register(g_),t.register(y_),t.register(S_),t.register(N_),t.register(R_),t.register(c_),t.register(m_),t.register(L_),t.register(M_),t.register(U_),t.register(P_)}var q_=E(()=>{"use strict";l_();u_();f_();h_();w_();E_();v_();x_();A_();O_();C_();D_();F_();W_()});function ci(){return li===null&&(li=new xc,B_(li)),li}var aR,xc,li,jc=E(()=>{"use strict";q_();aR={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"},xc=class{types=new Map;register(e){let r=`${e.description.namespace}/${e.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,e)}get(e){let r=e.includes("/")?e:aR[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},li=null});async function X_(t){z_(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let r=t.dal.getProjectByJob(t.job.id);if(r===null)throw new Error(`job ${t.job.id} has no project`);let n=cR(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Kn(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=Uh(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Kn(n)){let m=Ac({dal:t.dal,workflow:di(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:Xt(t.job.payload)??{},team_id:t.team.id}),p=await V_(n,m,i.current_state??n.entry_step_id);return J_(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Ac({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:Xt(t.job.payload)??{},team_id:t.team.id}),f=await G_(d,i.current_state??n.start_at);return J_(t.dal,r.id,i.id,n.name,f),f}function J_(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function Ac(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await Rc(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{z_(n);let o=Kn(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=Ac({dal:t.dal,workflow:Kn(n)?di(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Kn(n)?V_(n,a,i.current_state??n.entry_step_id):G_(a,i.current_state??n.start_at)}};return e}async function G_(t,e){let r=e;if(r.startsWith(Jn))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return xt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=ui(t,z(t.workflow));if(l.kind==="paused")return Oe(t);if(l.kind==="escalate")return Ke(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Oe(t);if(l.kind==="terminal")return xt(t,l.terminal);r=l.state;continue}let i,a=Y_(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===gn)return xt(t,ba);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):Ke(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Rc(t,r,o);if(i.kind==="paused")return Oe(t);if(i.kind==="escalate")return Ke(t,{id:r,name:r,type:o.type},i.token,i.reason),Oe(t);if(i.kind==="terminal"){let l=ui(t,i.terminal);if(l.kind==="paused")return Oe(t);if(l.kind==="escalate")return Ke(t,{id:r,name:r,type:o.type},l.token,l.reason),Oe(t);if(l.kind==="terminal")return xt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=ui(t,z(t.workflow));return n.kind==="terminal"?xt(t,n.terminal):xt(t,z(t.workflow))}async function V_(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return Ke(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Oe(e);let l=Y_(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===gn)return xt(e,ba);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 Ke(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}),Oe(e);o=h;continue}let c=await lR(e,t,a);if(c.kind==="paused")return Oe(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return Ke(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Oe(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=di(t,a);try{let p=ui(e,d);if(p.kind==="paused")return Oe(e);if(p.kind==="escalate")return Ke(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Oe(e);if(p.kind==="terminal")return xt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return Ke(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Oe(e);o=h.id;continue}finally{e.workflow=m}}if($r(d))return Ke(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Oe(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 Ke(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Oe(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),xt(e,"aborted")}async function lR(t,e,r){let n=K_(e,r),s=t.workflow;t.workflow=di(e,r);try{return await Rc(t,r.id,n,r.name)}finally{t.workflow=s}}function K_(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function Rc(t,e,r,n){let s=ci().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?fR(t,s):void 0,t.progress_step_id=null;try{return await s.execute(n_(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function cR(t,e){try{let r=JSON.parse(t);if(dR(r)&&r.definition_schema_version===3)return ut.parse(r)}catch{return e}return e}function Kn(t){return t.definition_schema_version===3}function di(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=K_(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:uR(e.parameters.kind)}),n.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:n,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function uR(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function dR(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function fR(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function xt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Mh(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Oe(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Y_(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function ui(t,e){if(!mR(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let r=t.workflow.errors;return r===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&pR(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function mR(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function pR(t,e,r){let n=hR(t),s=r.capture_evidence&&n!==null?_R(t,n.id):[];t.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function hR(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 _R(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(n=>n.path)}function z_(t){if(!H_.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${H_.join(", ")}`)}var H_,Z_=E(()=>{"use strict";Gr();Dh();Wh();De();jc();wn();H_=[1,2,3]});import{readFileSync as gR,readdirSync as wR}from"node:fs";import{basename as yR,join as ER,resolve as bR}from"node:path";function tg(t={}){let e=bR(t.workflowsDir??"workflows"),r=wR(e).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:r.map(n=>TR(ER(e,n)))}}function TR(t){let e=yR(t);try{let r=gR(t,"utf8"),n=Re(r);return sg(e,n)}catch(r){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:og(r)}}}function rg(t,e){try{let r=Re(e);return sg(t,r)}catch(r){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:og(r)}}}function ng(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1499
1499
  `)}
1500
- `}function rg(t,e){let r=kR(e),n=vR(e);if(r===null||n===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=SR(e.inputs);return s.length>0?{file:t,workflow_name:e.name,status:"PASS_NEEDS_INPUTS",first_step_id:r,first_step_type:n,first_step_disposition:`needs_inputs:${n}`,note:`load ok; graph ok; entry step is ${r}; requires inputs: ${s.join(", ")}`}:{file:t,workflow_name:e.name,status:"PASS",first_step_id:r,first_step_type:n,first_step_disposition:`ready:${n}`,note:"load ok; graph ok; first step entered without inputs"}}function SR(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function kR(t){return Rc(t)?t.entry_step_id:t.start_at}function vR(t){return Rc(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Rc(t){return t.definition_schema_version===3}function ng(t){return t instanceof $t?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 sg(t){let e=new Set;if(Rc(t))for(let r of t.steps){let n=r.members??{};z_(n,e)}else for(let r of Object.values(t.states))z_(r,e);return[...e].sort()}function z_(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=Z_(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=Z_(i);a!==null&&e.add(a)}}}function Z_(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var fi=E(()=>{"use strict";Kr()});function IR({dal:t}){let e=t.listProjects();for(let r of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,mi)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=$R(t,r,i);if(a<20)continue;let c=i??"initial",u=`${Yn}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:mi,source_ref:Yn,payload:JSON.stringify({kind:Yn,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function $R(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1500
+ `}function sg(t,e){let r=kR(e),n=vR(e);if(r===null||n===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=SR(e.inputs);return s.length>0?{file:t,workflow_name:e.name,status:"PASS_NEEDS_INPUTS",first_step_id:r,first_step_type:n,first_step_disposition:`needs_inputs:${n}`,note:`load ok; graph ok; entry step is ${r}; requires inputs: ${s.join(", ")}`}:{file:t,workflow_name:e.name,status:"PASS",first_step_id:r,first_step_type:n,first_step_disposition:`ready:${n}`,note:"load ok; graph ok; first step entered without inputs"}}function SR(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function kR(t){return Oc(t)?t.entry_step_id:t.start_at}function vR(t){return Oc(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Oc(t){return t.definition_schema_version===3}function og(t){return t instanceof $t?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 ig(t){let e=new Set;if(Oc(t))for(let r of t.steps){let n=r.members??{};Q_(n,e)}else for(let r of Object.values(t.states))Q_(r,e);return[...e].sort()}function Q_(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=eg(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=eg(i);a!==null&&e.add(a)}}}function eg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var fi=E(()=>{"use strict";Kr()});function IR({dal:t}){let e=t.listProjects();for(let r of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,mi)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=$R(t,r,i);if(a<20)continue;let c=i??"initial",u=`${Yn}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:mi,source_ref:Yn,payload:JSON.stringify({kind:Yn,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function $R(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1501
1501
  FROM run r
1502
1502
  JOIN job j ON j.id = r.job_id
1503
1503
  WHERE j.project_id = ?
1504
1504
  AND r.terminal_state IS NOT NULL
1505
- ${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function og(t){for(let e of NR)try{e(t)}catch{}}var mi,Yn,NR,Oc=E(()=>{"use strict";mi="memory_policy",Yn="memory_consolidation_request";NR=[IR]});var dg={};ie(dg,{getOrInsertConsolidationWorkflow:()=>ag,runJobById:()=>zn,runOnce:()=>Er,startWorker:()=>OR});import{createHash as xR}from"node:crypto";import{readFileSync as jR}from"node:fs";import{pathToFileURL as AR}from"node:url";function ag(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{jo({swallow:!0});let n=Ao(e);if(n===null)return null;let s=jR(n,"utf8"),o=Re(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:AR(n).href,source_sha256:xR("sha256").update(s).digest("hex")})}catch{return null}}async function Er(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??ig,evaluator:n=>cg(t.dal,n)}),r===null?null:await lg(t.dal,r,e)}catch(n){if(r!==null)return Kt(t.dal,r,"worker_run_failed",yr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:pi(yr(n))})})}catch{}return null}finally{t.max_concurrent}}async function zn(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??ig,evaluator:s=>cg(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await lg(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...Kt(t.dal,r,"worker_run_failed",yr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:pi(yr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function lg(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return Kt(t,e,"worker_project_missing","project_not_found",r);let s=e.source===mi&&e.source_ref===Yn,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=ag(t):i=ug(t,e,n),i===null)return Kt(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return Kt(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Re(i.definition)}catch(d){return Kt(t,e,"worker_workflow_invalid",yr(d),r,n)}let u=LR(c,l);if(u.length>0)return Kt(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await H_({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return Kt(t,e,"worker_run_failed",yr(d),r,n,a)}}function cg(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=ug(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Re(n.definition)}catch{s=null}return Xo({workflow:s,job:e,project:r})}function ug(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function OR(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Er(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:pi(yr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??RR))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function Kt(t,e,r,n,s,o,i){let a=pi(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function yr(t){return t instanceof Error?t.message:String(t)}function pi(t){return t.length>4096?t.slice(0,4096):t}function LR(t,e){let r=sg(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var ig,RR,Zn=E(()=>{"use strict";Ro();Y_();Kr();fi();rc();Oc();ig=6e5,RR=5e3});import{existsSync as CR,readFileSync as MR}from"node:fs";import{marked as DR}from"marked";function hg(t,e){t.get("/layman",r=>r.html($e("Layman Home",PR(e.dal)))),t.get("/api/layman",r=>r.json(yg(e.dal))),t.get("/layman/start/:workflow",r=>{let n=pg(r);return n===null?r.notFound():r.html($e(`Start ${tn(n)}`,WR(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=pg(r);return n===null?r.notFound():n==="newspaper"?fg(r,e.dal):BR(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=fr(e.dal,hi(r,"id"));return n===null?r.notFound():r.html($e(`Run ${n.id}`,JR(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=fr(e.dal,hi(r,"id"));return n===null?r.notFound():r.json(rO(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>GR(r,e.dal)),t.get("/layman/newspaper",r=>r.html($e("Newspaper Subscriptions",eO(e.dal)))),t.post("/layman/newspaper",r=>fg(r,e.dal)),t.delete("/layman/newspaper/:id",r=>mg(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>mg(r,e.dal))}function PR(t){let e=yg(t);return`<section class="layman-home">
1505
+ ${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function ag(t){for(let e of NR)try{e(t)}catch{}}var mi,Yn,NR,Lc=E(()=>{"use strict";mi="memory_policy",Yn="memory_consolidation_request";NR=[IR]});var mg={};ie(mg,{getOrInsertConsolidationWorkflow:()=>cg,runJobById:()=>zn,runOnce:()=>Er,startWorker:()=>OR});import{createHash as xR}from"node:crypto";import{readFileSync as jR}from"node:fs";import{pathToFileURL as AR}from"node:url";function cg(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{jo({swallow:!0});let n=Ao(e);if(n===null)return null;let s=jR(n,"utf8"),o=Re(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:AR(n).href,source_sha256:xR("sha256").update(s).digest("hex")})}catch{return null}}async function Er(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??lg,evaluator:n=>dg(t.dal,n)}),r===null?null:await ug(t.dal,r,e)}catch(n){if(r!==null)return Kt(t.dal,r,"worker_run_failed",yr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:pi(yr(n))})})}catch{}return null}finally{t.max_concurrent}}async function zn(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??lg,evaluator:s=>dg(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await ug(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...Kt(t.dal,r,"worker_run_failed",yr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:pi(yr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function ug(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return Kt(t,e,"worker_project_missing","project_not_found",r);let s=e.source===mi&&e.source_ref===Yn,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=cg(t):i=fg(t,e,n),i===null)return Kt(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return Kt(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Re(i.definition)}catch(d){return Kt(t,e,"worker_workflow_invalid",yr(d),r,n)}let u=LR(c,l);if(u.length>0)return Kt(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await X_({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return Kt(t,e,"worker_run_failed",yr(d),r,n,a)}}function dg(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=fg(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Re(n.definition)}catch{s=null}return Xo({workflow:s,job:e,project:r})}function fg(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function OR(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Er(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:pi(yr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??RR))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function Kt(t,e,r,n,s,o,i){let a=pi(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function yr(t){return t instanceof Error?t.message:String(t)}function pi(t){return t.length>4096?t.slice(0,4096):t}function LR(t,e){let r=ig(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var lg,RR,Zn=E(()=>{"use strict";Ro();Z_();Kr();fi();nc();Lc();lg=6e5,RR=5e3});import{existsSync as CR,readFileSync as MR}from"node:fs";import{marked as DR}from"marked";function gg(t,e){t.get("/layman",r=>r.html($e("Layman Home",PR(e.dal)))),t.get("/api/layman",r=>r.json(bg(e.dal))),t.get("/layman/start/:workflow",r=>{let n=_g(r);return n===null?r.notFound():r.html($e(`Start ${tn(n)}`,WR(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=_g(r);return n===null?r.notFound():n==="newspaper"?pg(r,e.dal):BR(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=fr(e.dal,hi(r,"id"));return n===null?r.notFound():r.html($e(`Run ${n.id}`,JR(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=fr(e.dal,hi(r,"id"));return n===null?r.notFound():r.json(rO(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>GR(r,e.dal)),t.get("/layman/newspaper",r=>r.html($e("Newspaper Subscriptions",eO(e.dal)))),t.post("/layman/newspaper",r=>pg(r,e.dal)),t.delete("/layman/newspaper/:id",r=>hg(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>hg(r,e.dal))}function PR(t){let e=bg(t);return`<section class="layman-home">
1506
1506
  <h1>Welcome</h1>
1507
1507
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1508
1508
  <div class="grid">${_i.map(FR).join("")}</div>
@@ -1517,7 +1517,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1517
1517
  <h2>${b(t.title)}</h2>
1518
1518
  <p>${b(t.description)}</p>
1519
1519
  <p><a href="/layman/start/${encodeURIComponent(t.name)}">Start</a></p>
1520
- </article>`}function UR(t){return ue(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${b(e.id)}</a>`,b(tn(e.workflow_name)),b(e.terminal_state??e.current_state??"queued"),b(e.started_at)]))}function WR(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${b(tn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${b(tn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=_g(n);return e==="info-qa"?`<h1>Ask a Question</h1>
1520
+ </article>`}function UR(t){return ue(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${b(e.id)}</a>`,b(tn(e.workflow_name)),b(e.terminal_state??e.current_state??"queued"),b(e.started_at)]))}function WR(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${b(tn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${b(tn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=wg(n);return e==="info-qa"?`<h1>Ask a Question</h1>
1521
1521
  <form method="post" action="/layman/start/info-qa">
1522
1522
  ${s}
1523
1523
  <label>Ask anything<textarea name="question" rows="8" required></textarea></label>
@@ -1530,36 +1530,36 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1530
1530
  <label>Slug<input name="slug" placeholder="my-document" required></label>
1531
1531
  <label>Output directory<input name="output_dir" value="drafts"></label>
1532
1532
  <button type="submit">Start Document Wizard</button>
1533
- </form>`:wg(n,"/layman/start/newspaper")}function _g(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${b(e.id)}">${b(e.name)}</option>`).join("")}</select></label>`}async function BR(t,e,r){let n=await t.req.parseBody(),s=Tg(e,n);if(s===null)return t.html($e("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html($e("Start workflow",`<p class="error">${b(tn(r))} is not loaded.</p>`),400);let i=r==="info-qa"?qR(n):HR(n);if(typeof i=="string")return t.html($e("Start workflow",`<p class="error">${b(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await Er({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 qR(t){let e=Be(t.question).trim();if(e.length===0)return"Enter a question.";let r=Be(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function HR(t){let e=Be(t.task_description).trim(),r=cO(Be(t.slug).trim()),n=Be(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function JR(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${b(tn(r))}</h1>
1534
- <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${KR(t,e,r)}`;let s=bg(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${XR(e,s)}`:`${n}<section hx-get="/layman/run/${b(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1533
+ </form>`:Eg(n,"/layman/start/newspaper")}function wg(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${b(e.id)}">${b(e.name)}</option>`).join("")}</select></label>`}async function BR(t,e,r){let n=await t.req.parseBody(),s=kg(e,n);if(s===null)return t.html($e("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html($e("Start workflow",`<p class="error">${b(tn(r))} is not loaded.</p>`),400);let i=r==="info-qa"?qR(n):HR(n);if(typeof i=="string")return t.html($e("Start workflow",`<p class="error">${b(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await Er({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 qR(t){let e=Be(t.question).trim();if(e.length===0)return"Enter a question.";let r=Be(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function HR(t){let e=Be(t.task_description).trim(),r=cO(Be(t.slug).trim()),n=Be(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function JR(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${b(tn(r))}</h1>
1534
+ <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${KR(t,e,r)}`;let s=Sg(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${XR(e,s)}`:`${n}<section hx-get="/layman/run/${b(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1535
1535
  <h2>Running</h2>
1536
1536
  <p class="muted">Current stage: <strong>${b(e.current_state??"starting")}</strong></p>
1537
- ${gg(e)}
1538
- </section>`}function gg(t){let e=t.steps.map(r=>[b(r.id),b(`\u25B6 ${r.state_name}`),b(r.outcome??"running"),b(r.status_detail??"")]);return ue(["step","stage","outcome","detail"],e)}function XR(t,e){return`<section class="metric paused-interactive">
1537
+ ${yg(e)}
1538
+ </section>`}function yg(t){let e=t.steps.map(r=>[b(r.id),b(`\u25B6 ${r.state_name}`),b(r.outcome??"running"),b(r.status_detail??"")]);return ue(["step","stage","outcome","detail"],e)}function XR(t,e){return`<section class="metric paused-interactive">
1539
1539
  <h2>${b(oO(e.state_name))}</h2>
1540
1540
  <p class="muted">The agent is waiting for your response.</p>
1541
1541
  <h3>Agent output</h3>
1542
- <div class="metric">${Pc(e.last_agent_output??"")}</div>
1542
+ <div class="metric">${Fc(e.last_agent_output??"")}</div>
1543
1543
  <form method="post" action="/layman/run/${b(t.id)}/respond">
1544
1544
  <input type="hidden" name="step_id" value="${b(e.step_id)}">
1545
1545
  <label>Your response<textarea name="input" rows="7"></textarea></label>
1546
1546
  <button type="submit" name="done" value="false">Send response</button>
1547
1547
  <button type="submit" name="done" value="true">Done with this stage</button>
1548
1548
  </form>
1549
- </section>`}async function GR(t,e){let r=hi(t,"id"),n=await t.req.parseBody(),s=Number(Be(n.step_id)),o=Be(n.input),i=Be(n.done)==="true";if(!Number.isInteger(s))return t.html($e("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(VR(e,a.run.id),await Er({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html($e("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function VR(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!Cc(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>Cc(i)&&i.name===r.current_state&&typeof i.id=="string");Cc(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function KR(t,e,r){let n=iO(e.terminal_state);return`<section class="metric terminal-run">
1549
+ </section>`}async function GR(t,e){let r=hi(t,"id"),n=await t.req.parseBody(),s=Number(Be(n.step_id)),o=Be(n.input),i=Be(n.done)==="true";if(!Number.isInteger(s))return t.html($e("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(VR(e,a.run.id),await Er({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html($e("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function VR(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!Mc(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>Mc(i)&&i.name===r.current_state&&typeof i.id=="string");Mc(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function KR(t,e,r){let n=iO(e.terminal_state);return`<section class="metric terminal-run">
1550
1550
  <h2>${n?"Complete":"Stopped"}</h2>
1551
1551
  <p>Status: <strong>${b(e.terminal_state)}</strong></p>
1552
1552
  ${n?YR(t,e,r):ZR(e)}
1553
1553
  <h2>Stage Log</h2>
1554
- ${gg(e)}
1555
- </section>`}function YR(t,e,r){if(r==="info-qa"){let n=Dc(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Pc(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return zR(t,e);if(r==="newspaper"){let n=Dc(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Pc(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function zR(t,e){let r=mr(t,e.id),n=Lc(r,["render_docx"]),s=Lc(r,["render_xlsx"]),o=Dc(e,["review:coder[0]_transcript","chat_output_md"])??QR(Lc(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${b(a)}">${b(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1554
+ ${yg(e)}
1555
+ </section>`}function YR(t,e,r){if(r==="info-qa"){let n=Pc(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Fc(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return zR(t,e);if(r==="newspaper"){let n=Pc(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Fc(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function zR(t,e){let r=mr(t,e.id),n=Cc(r,["render_docx"]),s=Cc(r,["render_xlsx"]),o=Pc(e,["review:coder[0]_transcript","chat_output_md"])??QR(Cc(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${b(a)}">${b(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1556
1556
  <pre>${b(lO(aO(o??"No preview available."),30))}</pre>
1557
1557
  <h3>Downloads</h3>
1558
- ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function ZR(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${b(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function Dc(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Lc(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function QR(t){if(t===null||!CR(t)||!t.endsWith(".md"))return null;try{return MR(t,"utf8")}catch{return null}}function eO(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1559
- ${tO(Eg(t))}
1558
+ ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function ZR(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${b(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function Pc(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Cc(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function QR(t){if(t===null||!CR(t)||!t.endsWith(".md"))return null;try{return MR(t,"utf8")}catch{return null}}function eO(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1559
+ ${tO(Tg(t))}
1560
1560
  <h2>Add Subscription</h2>
1561
- ${e.length===0?'<p class="error">Create a project before subscribing.</p>':wg(e,"/layman/newspaper")}`}function wg(t,e){return`<form method="post" action="${b(e)}">
1562
- ${_g(t)}
1561
+ ${e.length===0?'<p class="error">Create a project before subscribing.</p>':Eg(e,"/layman/newspaper")}`}function Eg(t,e){return`<form method="post" action="${b(e)}">
1562
+ ${wg(t)}
1563
1563
  <label>Topics<textarea name="topics" rows="5" placeholder="local news, AI safety, climate" required></textarea></label>
1564
1564
  <label>Schedule<select name="schedule">
1565
1565
  <option value="daily">Daily at 6am</option>
@@ -1569,31 +1569,31 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1569
1569
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1570
1570
  <label>Output directory<input name="output_dir" value="digests"></label>
1571
1571
  <button type="submit">Create subscription</button>
1572
- </form>`}async function fg(t,e){let r=await t.req.parseBody(),n=Tg(e,r);if(n===null)return t.html($e("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html($e("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Be(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html($e("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Be(r.output_dir).trim()||"digests",schedule:sO(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function mg(t,e){let r=hi(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function tO(t){return ue(["id","project","topics","status","action"],t.map(e=>{let r=uO(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[b(e.id),b(e.project_name),b(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function yg(t){let e=Eg(t);return{workflows:_i,recent_runs:nO(t),newspaper_subscriptions:e.length}}function rO(t,e){let r=bg(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.terminal_state,paused_interactive:r?.status==="waiting_operator"?{step_id:r.step_id,state_name:r.state_name,last_agent_output:r.last_agent_output}:null,steps:e.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function nO(t){return t.query(`SELECT r.*, w.name AS workflow_name
1572
+ </form>`}async function pg(t,e){let r=await t.req.parseBody(),n=kg(e,r);if(n===null)return t.html($e("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html($e("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Be(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html($e("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Be(r.output_dir).trim()||"digests",schedule:sO(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function hg(t,e){let r=hi(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function tO(t){return ue(["id","project","topics","status","action"],t.map(e=>{let r=uO(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[b(e.id),b(e.project_name),b(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function bg(t){let e=Tg(t);return{workflows:_i,recent_runs:nO(t),newspaper_subscriptions:e.length}}function rO(t,e){let r=Sg(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.terminal_state,paused_interactive:r?.status==="waiting_operator"?{step_id:r.step_id,state_name:r.state_name,last_agent_output:r.last_agent_output}:null,steps:e.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function nO(t){return t.query(`SELECT r.*, w.name AS workflow_name
1573
1573
  FROM run r
1574
1574
  JOIN workflow w ON w.id = r.workflow_id
1575
- WHERE w.name IN (${Mc.map(()=>"?").join(",")})
1575
+ WHERE w.name IN (${Dc.map(()=>"?").join(",")})
1576
1576
  ORDER BY r.id DESC
1577
- LIMIT 10`,...Mc)}function Eg(t){return t.query(`SELECT pw.*, p.name AS project_name
1577
+ LIMIT 10`,...Dc)}function Tg(t){return t.query(`SELECT pw.*, p.name AS project_name
1578
1578
  FROM project_workflow pw
1579
1579
  JOIN workflow w ON w.id = pw.workflow_id
1580
1580
  JOIN project p ON p.id = pw.project_id
1581
1581
  WHERE w.name = ?
1582
- ORDER BY pw.id DESC`,"newspaper")}function bg(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Tg(t,e){let r=Number(Be(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function sO(t){let e=Be(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Be(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function pg(t){let e=t.req.param("workflow");return Mc.includes(e)?e:null}function tn(t){return _i.find(e=>e.name===t)?.title??t}function oO(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Pc(t){return DR.parse(t,{async:!1})}function iO(t){return t==="done"||t==="pr_ready"||t==="merged"}function aO(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function lO(t,e){return t.split(`
1582
+ ORDER BY pw.id DESC`,"newspaper")}function Sg(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function kg(t,e){let r=Number(Be(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function sO(t){let e=Be(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Be(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function _g(t){let e=t.req.param("workflow");return Dc.includes(e)?e:null}function tn(t){return _i.find(e=>e.name===t)?.title??t}function oO(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Fc(t){return DR.parse(t,{async:!1})}function iO(t){return t==="done"||t==="pr_ready"||t==="merged"}function aO(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function lO(t,e){return t.split(`
1583
1583
  `).slice(0,e).join(`
1584
- `)}function cO(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Be(t){return typeof t=="string"?t:""}function uO(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 Cc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function hi(t,e){return Number(t.req.param(e))}var _i,Mc,Sg=E(()=>{"use strict";Zn();kt();_c();_i=[{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."}],Mc=_i.map(t=>t.name)});function fO(t){return t.replace(/^\/+/,"")}function kg(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function rn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=fO(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return kg(t.userId)&&kg(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${dO}/${t.identityId}/`}function pO(t){return String(Math.max(0,Math.floor(t))).padStart(mO,"0")}function Fc(t,e,r){return`${t}${e}${pO(r)}.json`}function gi(t,e){return`${t}${e}`}function wi(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var dO,mO,yi=E(()=>{"use strict";dO="mailbox";mO=12});function jt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Ei[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=Ei[a&15]+i,a=a>>4;let l=Ei[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Ei[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Ei,bi=E(()=>{"use strict";Ei="0123456789abcdef"});function Wc(t,e){return!Number.isFinite(t)||t<=0?e:t}function Bc(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 xg(t){return t.conversation_id===Ng&&gO(t.payload)}function gO(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function wO(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:xg(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var vg,Ig,$g,hO,Ng,_O,Uc,br,Ti=E(()=>{"use strict";yi();bi();vg=3e3,Ig=1e4,$g=12e3,hO=1e3,Ng="__lmctl_heartbeat__",_O={kind:"heartbeat"},Uc={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},br=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=rn({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=Wc(e.readIntervalMs??e.pollIntervalMs??vg,vg),this.heartbeatIdleMs=Wc(e.heartbeatIdleMs??Ig,Ig),this.backoffReadIntervalMs=Wc(e.backoffReadIntervalMs??e.pollIntervalMs??$g,$g)}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??Uc;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=gi(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:hO,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=wi(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:jt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=Fc(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??Uc;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let e=(this.cursor??0)+1,r=Fc(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(Bc(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),xg(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=wO(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??Uc;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Ng,_O)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as yO}from"@hono/node-server/conninfo";function jg(t,e){let r=e.bucket??EO,n=e.remoteAddressOf??(o=>TO(o)),s=o=>{let i=n(o);return SO(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=qc(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Bc(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Hc(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=qc(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:Hc(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=qc(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=bO(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:Hc(d)},500)}})}function qc(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function bO(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function TO(t){try{return yO(t).remote.address}catch{return}}function SO(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Hc(t){return t instanceof Error?t.message:String(t)}var EO,Ag=E(()=>{"use strict";Ti();EO="local"});function Rg(t,e){t.get("/mailbox/workspace",r=>IO(r,e)),t.get("/mailbox/projects",r=>$O(r,e)),t.get("/mailbox/projects/:id",r=>NO(r,e)),t.post("/mailbox/projects",r=>xO(r,e)),t.patch("/mailbox/projects/:id",r=>jO(r,e)),t.delete("/mailbox/projects/:id",r=>AO(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>RO(r,e)),t.get("/mailbox/prompts/:id",r=>OO(r,e))}function IO(t,e){e.dal.ensureWorkspace({id:sn,name:Jc});let r=Og(e.dal),n={id:sn,name:Jc,created_at:vO,projects:r};return t.json({workspace:n})}function $O(t,e){return t.json({projects:Og(e.dal)})}function NO(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(nn)){let s=Xc(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:vi(s)})}let n=Cg(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Lg(n)})}async function xO(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:sn,name:Jc});let s=e.dal.insertWebProject({workspace_id:sn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:vi(s)},201)}async function jO(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(nn)){let o=Xc(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:vi(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function AO(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(nn)){let n=Xc(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function RO(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Cg(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${kO}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await LO({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${ki}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function OO(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=CO(e.dal,r);return t.json({result:n})}function Og(t){let e=t.listProjects().map(Lg),r=t.listWebProjectsActive(sn).map(vi);return[...e,...r].sort(JO)}function Lg(t){return{id:`${ki}${t.id}`,workspace_id:sn,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 vi(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${nn}${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 Xc(t,e){if(!e.startsWith(nn))return null;let r=e.slice(nn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Cg(t,e){if(e.startsWith(ki)){let n=e.slice(ki.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function LO(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(sc(),lh));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function CO(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=BO(t,o?.team_id??null),a=WO(s),l=qO(n,a,i.length>0),c=HO(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:MO(t,o.workflow_name),d=u.totalEstimatedMs,f=Mg(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:DO(t,s.id),g=PO(s,a,h,u.perStep,i),_=FO(h,u.perStep),T=UO(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Si(d,f),...T},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Si(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...Si(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Si(d,f),...T},errors_json:null,duration_ms:c}}function MO(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function DO(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function PO(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Mg(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function FO(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function UO(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Mg(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Si(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function WO(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function BO(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function qO(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function HO(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function JO(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var ki,nn,kO,sn,Jc,vO,Dg=E(()=>{"use strict";ki="project:",nn="web_project:",kO="prompt:",sn="default",Jc="Default workspace",vO=new Date(0).toISOString()});import{Buffer as Pg}from"node:buffer";function Fg(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Ug(t){return VO[t]}function Wg(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var XO,GO,Ii,VO,Gc=E(()=>{"use strict";XO=1e4,GO=256*1024,Ii=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Fg(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,XO),this.pushByteCap=Fg(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,GO),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=Pg.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${r} bytes=${Pg.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1584
+ `)}function cO(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Be(t){return typeof t=="string"?t:""}function uO(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 Mc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function hi(t,e){return Number(t.req.param(e))}var _i,Dc,vg=E(()=>{"use strict";Zn();kt();gc();_i=[{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."}],Dc=_i.map(t=>t.name)});function fO(t){return t.replace(/^\/+/,"")}function Ig(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function rn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=fO(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return Ig(t.userId)&&Ig(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${dO}/${t.identityId}/`}function pO(t){return String(Math.max(0,Math.floor(t))).padStart(mO,"0")}function Uc(t,e,r){return`${t}${e}${pO(r)}.json`}function gi(t,e){return`${t}${e}`}function wi(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var dO,mO,yi=E(()=>{"use strict";dO="mailbox";mO=12});function jt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Ei[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=Ei[a&15]+i,a=a>>4;let l=Ei[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Ei[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Ei,bi=E(()=>{"use strict";Ei="0123456789abcdef"});function Bc(t,e){return!Number.isFinite(t)||t<=0?e:t}function qc(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 Ag(t){return t.conversation_id===jg&&gO(t.payload)}function gO(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function wO(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Ag(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var $g,Ng,xg,hO,jg,_O,Wc,br,Ti=E(()=>{"use strict";yi();bi();$g=3e3,Ng=1e4,xg=12e3,hO=1e3,jg="__lmctl_heartbeat__",_O={kind:"heartbeat"},Wc={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},br=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=rn({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=Bc(e.readIntervalMs??e.pollIntervalMs??$g,$g),this.heartbeatIdleMs=Bc(e.heartbeatIdleMs??Ng,Ng),this.backoffReadIntervalMs=Bc(e.backoffReadIntervalMs??e.pollIntervalMs??xg,xg)}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??Wc;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=gi(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:hO,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=wi(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:jt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=Uc(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??Wc;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let e=(this.cursor??0)+1,r=Uc(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(qc(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Ag(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=wO(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??Wc;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(jg,_O)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as yO}from"@hono/node-server/conninfo";function Rg(t,e){let r=e.bucket??EO,n=e.remoteAddressOf??(o=>TO(o)),s=o=>{let i=n(o);return SO(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Hc(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return qc(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Jc(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Hc(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:Jc(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=Hc(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=bO(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:Jc(d)},500)}})}function Hc(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function bO(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function TO(t){try{return yO(t).remote.address}catch{return}}function SO(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Jc(t){return t instanceof Error?t.message:String(t)}var EO,Og=E(()=>{"use strict";Ti();EO="local"});function Lg(t,e){t.get("/mailbox/workspace",r=>IO(r,e)),t.get("/mailbox/projects",r=>$O(r,e)),t.get("/mailbox/projects/:id",r=>NO(r,e)),t.post("/mailbox/projects",r=>xO(r,e)),t.patch("/mailbox/projects/:id",r=>jO(r,e)),t.delete("/mailbox/projects/:id",r=>AO(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>RO(r,e)),t.get("/mailbox/prompts/:id",r=>OO(r,e))}function IO(t,e){e.dal.ensureWorkspace({id:sn,name:Xc});let r=Cg(e.dal),n={id:sn,name:Xc,created_at:vO,projects:r};return t.json({workspace:n})}function $O(t,e){return t.json({projects:Cg(e.dal)})}function NO(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(nn)){let s=Gc(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:vi(s)})}let n=Dg(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Mg(n)})}async function xO(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:sn,name:Xc});let s=e.dal.insertWebProject({workspace_id:sn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:vi(s)},201)}async function jO(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(nn)){let o=Gc(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:vi(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function AO(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(nn)){let n=Gc(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function RO(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Dg(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${kO}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await LO({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${ki}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function OO(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=CO(e.dal,r);return t.json({result:n})}function Cg(t){let e=t.listProjects().map(Mg),r=t.listWebProjectsActive(sn).map(vi);return[...e,...r].sort(JO)}function Mg(t){return{id:`${ki}${t.id}`,workspace_id:sn,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 vi(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${nn}${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 Gc(t,e){if(!e.startsWith(nn))return null;let r=e.slice(nn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Dg(t,e){if(e.startsWith(ki)){let n=e.slice(ki.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function LO(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(oc(),uh));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function CO(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=BO(t,o?.team_id??null),a=WO(s),l=qO(n,a,i.length>0),c=HO(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:MO(t,o.workflow_name),d=u.totalEstimatedMs,f=Pg(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:DO(t,s.id),g=PO(s,a,h,u.perStep,i),_=FO(h,u.perStep),T=UO(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Si(d,f),...T},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Si(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...Si(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Si(d,f),...T},errors_json:null,duration_ms:c}}function MO(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function DO(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function PO(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Pg(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function FO(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function UO(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Pg(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Si(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function WO(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function BO(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function qO(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function HO(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function JO(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var ki,nn,kO,sn,Xc,vO,Fg=E(()=>{"use strict";ki="project:",nn="web_project:",kO="prompt:",sn="default",Xc="Default workspace",vO=new Date(0).toISOString()});import{Buffer as Ug}from"node:buffer";function Wg(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Bg(t){return VO[t]}function qg(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var XO,GO,Ii,VO,Vc=E(()=>{"use strict";XO=1e4,GO=256*1024,Ii=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Wg(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,XO),this.pushByteCap=Wg(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,GO),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=Ug.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${r} bytes=${Ug.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1585
1585
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1586
- `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};VO={claude:{cmd:"claude",args:["--dangerously-skip-permissions"]},codex:{cmd:"codex",args:["--yolo","--sandbox","danger-full-access"]},gemini:{cmd:"gemini",args:["-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--yolo"]},qwen:{cmd:"qwen",args:["--approval-mode","yolo"]},opencode:{cmd:"opencode",args:[]}}});function qg(t,e){t.post("/mailbox/terminal/launch",r=>KO(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>YO(r,e)),t.get("/mailbox/terminal/sessions",r=>zO(r,e))}async function KO(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Bg.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Wg(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Ug(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function YO(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Bg.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function zO(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var Bg,Hg=E(()=>{"use strict";Gc();Bg=/^[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 ZO}from"node:buffer";function tL(t){try{return ZO.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function Jg(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Xg(t){return rL[t]}function Gg(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var QO,eL,$i,rL,Vc=E(()=>{"use strict";QO=2e3,eL=64*1024,$i=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Jg(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,QO),this.pushByteCap=Jg(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,eL),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=tL(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};rL={codex:{cmd:"codex",args:["app-server","--listen","stdio://"]},claude:{cmd:"claude",args:["-p","","--output-format","stream-json","--input-format","stream-json","--verbose","--dangerously-skip-permissions"]},gemini:{cmd:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--acp","--yolo"]},opencode:{cmd:"opencode",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function Kg(t,e){t.post("/mailbox/chat/launch",r=>nL(r,e)),t.post("/mailbox/chat/end/:session_id",r=>sL(r,e)),t.get("/mailbox/chat/sessions",r=>oL(r,e))}async function nL(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Vg.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Gg(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Xg(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function sL(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Vg.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),t.json({session_id:n,ended:!0}))}function oL(t,e){let r=e.persistentSessionManager;return r===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:r.listSessions()})}var Vg,Yg=E(()=>{"use strict";Vc();Vg=/^[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 iL}from"node:fs";function Zg(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return zg(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=iL(e.path,{encoding:"utf8"});return zg(r)}catch{return[]}}function zg(t){let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);return e.length===0?[]:e.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var Qg=E(()=>{"use strict"});function ew(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function Ni(t,e){let r=t.query(`SELECT id, kind FROM attention
1586
+ `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};VO={claude:{cmd:"claude",args:["--dangerously-skip-permissions"]},codex:{cmd:"codex",args:["--yolo","--sandbox","danger-full-access"]},gemini:{cmd:"gemini",args:["-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--yolo"]},qwen:{cmd:"qwen",args:["--approval-mode","yolo"]},opencode:{cmd:"opencode",args:[]}}});function Jg(t,e){t.post("/mailbox/terminal/launch",r=>KO(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>YO(r,e)),t.get("/mailbox/terminal/sessions",r=>zO(r,e))}async function KO(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Hg.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=qg(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Bg(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function YO(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Hg.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function zO(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var Hg,Xg=E(()=>{"use strict";Vc();Hg=/^[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 ZO}from"node:buffer";function tL(t){try{return ZO.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function Gg(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Vg(t){return rL[t]}function Kg(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var QO,eL,$i,rL,Kc=E(()=>{"use strict";QO=2e3,eL=64*1024,$i=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Gg(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,QO),this.pushByteCap=Gg(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,eL),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=tL(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};rL={codex:{cmd:"codex",args:["app-server","--listen","stdio://"]},claude:{cmd:"claude",args:["-p","","--output-format","stream-json","--input-format","stream-json","--verbose","--dangerously-skip-permissions"]},gemini:{cmd:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--acp","--yolo"]},opencode:{cmd:"opencode",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function zg(t,e){t.post("/mailbox/chat/launch",r=>nL(r,e)),t.post("/mailbox/chat/end/:session_id",r=>sL(r,e)),t.get("/mailbox/chat/sessions",r=>oL(r,e))}async function nL(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Yg.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Kg(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Vg(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function sL(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Yg.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),t.json({session_id:n,ended:!0}))}function oL(t,e){let r=e.persistentSessionManager;return r===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:r.listSessions()})}var Yg,Zg=E(()=>{"use strict";Kc();Yg=/^[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 iL}from"node:fs";function ew(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Qg(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=iL(e.path,{encoding:"utf8"});return Qg(r)}catch{return[]}}function Qg(t){let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);return e.length===0?[]:e.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var tw=E(()=>{"use strict"});function rw(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function Ni(t,e){let r=t.query(`SELECT id, kind FROM attention
1587
1587
  WHERE run_id = ?
1588
1588
  AND acknowledged_at IS NULL
1589
1589
  AND requires_user = 1
1590
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var xi=E(()=>{"use strict"});function uw(t,e){t.all("/runtime/*",r=>aL(r.req.raw,e))}async function aL(t,e){try{return Response.json(await lL(t,e))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function lL(t,e){let r=new URL(t.url),n=hL(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Kc(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ji(t,n.id,s[2]),cL(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ji(t,n.id,s[2]);let o=rw(e.dal,s[4]);return tw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Kc(t),e.dal.listTeams().map(o=>pL(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=nw(e.dal,sw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead chat body does not match route team");return iw(t,n.id,i.context),ow(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=nw(e.dal,sw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead message body does not match route team");iw(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return ow(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ji(t,n.id,s[2]);let o=rw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new se(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return fL(e.dal,o,a),tw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Qn(t,n.id),e.dal.listWorkflows().map(o=>_L(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Qn(t,n.id);let o=wL(e.dal,s[2]);return gL(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Qn(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return yL(e.dal,o,i).map(l=>lw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Qn(t,n.id);let o=aw(e.dal,s[2]);return lw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Qn(t,n.id);let o=aw(e.dal,s[2]),i=bL(e.dal,o);return{runId:eu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function cL(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>dw(t,e,r))}}function tw(t,e,r){let n=dw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:uL(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:dL(t,r)}}function dw(t,e,r){let n=fw(t,r.id),s=zc(n);return{id:r.name,workspaceId:e.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function uL(t,e){let r=fw(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:zc(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function dL(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function fL(t,e,r){let n=mL(t,e.id);if(n!==null){let s=Ni(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new se(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=ct(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new se(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function fw(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",e)[0]??null}function mL(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 zc(t){return t===null?"queued":t.terminal_state===null?"running":t.terminal_state==="done"||t.terminal_state==="success"?"succeeded":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"cancelled":"failed"}function rw(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function nw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new se(404,`team not found: ${e}`);return r}function sw(t){return t.startsWith("team:")?t.slice(5):t}function pL(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function ow(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??cw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function hL(t){let e=t.workspaceName??pn()??nr.default;return{id:e,name:e}}function Kc(t){if(t.headers.get("x-lmctl-workspace-id")!==cw)throw new se(400,"runtime request requires global-admin workspace identity")}function ji(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new se(400,"runtime workspace identity does not match route")}function Qn(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==e)throw new se(400,"runtime workspace identity does not match server workspace")}function iw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");ji(t,e,r.workspaceId);return}Kc(t)}function Zc(t){return`${on}${Qc(t.name)}`}function Qc(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function eu(t){return`${Yc}${t.id}`}function _L(t){let e=Ai(t.definition);return{id:Zc(t),name:t.name,...e.description===null?{}:{description:e.description}}}function gL(t){let e=Ai(t.definition);return{id:Zc(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Ai(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function wL(t,e){if(!e.startsWith(on))throw new se(404,`template not found: ${e}`);let r=e.slice(on.length),n=t.listWorkflows().filter(s=>Qc(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new se(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function aw(t,e){if(!e.startsWith(Yc))throw new se(404,`run not found: ${e}`);let r=e.slice(Yc.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new se(404,`run not found: ${e}`);return s}function yL(t,e,r){if(r!==null){if(!r.startsWith(on))return[];let s=r.slice(on.length),o=t.listWorkflows().filter(a=>Qc(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function lw(t,e){let r=t.getWorkflow(e.workflow_id),n=zc(e),s=EL(r,e);return{id:eu(e),templateId:r===null?`${on}unknown`:Zc(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function EL(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[Ai(t.definition).nameToId.get(r)??r]}function bL(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Ai(r.definition),s=c=>n.nameToId.get(c)??c,o=eu(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=TL(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),d=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function TL(t){if(t.outcome===null)return"step.failed";let e=t.status_detail;return e==="failed"||e==="error"||e==="aborted"?"step.failed":"step.completed"}var cw,on,Yc,se,mw=E(()=>{"use strict";qe();xi();kt();cw="global-admin";on="template:",Yc="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as SL,writeFileSync as kL}from"node:fs";import{randomUUID as pw}from"node:crypto";import{dirname as vL,resolve as Ri,sep as hw}from"node:path";async function gw(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!jL(n))return t.text("missing image file",400);if(n.size>IL)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=AL(s);if(o===null||!(o in _w))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=$L(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Ri(xL()):Ri(i.local_path),l=Ri(a,"uploads",pw()),c=Ri(l,`${pw()}${_w[o]}`);if(!NL(c,a))return t.text("invalid upload path",400);SL(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);kL(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function $L(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function NL(t,e){let r=e.endsWith(hw)?e:`${e}${hw}`;return t.startsWith(r)}function xL(){return vL(de())}function jL(t){return typeof File<"u"&&t instanceof File}function AL(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 IL,_w,ww=E(()=>{"use strict";qe();IL=10*1024*1024,_w={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Oi}from"node:fs";import{basename as RL,dirname as OL,extname as LL,isAbsolute as CL,join as ML,relative as DL}from"node:path";import{fileURLToPath as PL}from"node:url";import{Hono as FL}from"hono";import{serveStatic as dt}from"@hono/node-server/serve-static";function vw(t){let e=new FL,r=[],n=t.localWebui!==void 0?ru(t.localWebui.webuiDir):UL();if(t.localWebui!==void 0&&jg(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=WL();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,dt({root:n})),e.use("/vendor/*",s,dt({root:n})),e.use("/src/*",s,dt({root:n})),e.get("/",s,dt({root:n,path:"index.html"})),e.get("/admin",s,dt({root:n,path:"index.html"})),e.get("/admin/*",s,dt({root:n,path:"index.html"})),e.get("/terminal",s,dt({root:n,path:"index.html"})),e.get("/terminal/*",s,dt({root:n,path:"index.html"})),e.get("/chat",s,dt({root:n,path:"index.html"})),e.get("/chat/*",s,dt({root:n,path:"index.html"}))}else e.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return e.use("*",hh()),e.get("/login",s=>s.html($e("Login",`
1590
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var xi=E(()=>{"use strict"});function fw(t,e){t.all("/runtime/*",r=>aL(r.req.raw,e))}async function aL(t,e){try{return Response.json(await lL(t,e))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function lL(t,e){let r=new URL(t.url),n=hL(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Yc(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ji(t,n.id,s[2]),cL(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ji(t,n.id,s[2]);let o=sw(e.dal,s[4]);return nw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Yc(t),e.dal.listTeams().map(o=>pL(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=ow(e.dal,iw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead chat body does not match route team");return lw(t,n.id,i.context),aw(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=ow(e.dal,iw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead message body does not match route team");lw(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return aw(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ji(t,n.id,s[2]);let o=sw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new se(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return fL(e.dal,o,a),nw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Qn(t,n.id),e.dal.listWorkflows().map(o=>_L(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Qn(t,n.id);let o=wL(e.dal,s[2]);return gL(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Qn(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return yL(e.dal,o,i).map(l=>uw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Qn(t,n.id);let o=cw(e.dal,s[2]);return uw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Qn(t,n.id);let o=cw(e.dal,s[2]),i=bL(e.dal,o);return{runId:tu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function cL(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>mw(t,e,r))}}function nw(t,e,r){let n=mw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:uL(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:dL(t,r)}}function mw(t,e,r){let n=pw(t,r.id),s=Zc(n);return{id:r.name,workspaceId:e.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function uL(t,e){let r=pw(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:Zc(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function dL(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function fL(t,e,r){let n=mL(t,e.id);if(n!==null){let s=Ni(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new se(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=ct(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new se(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function pw(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 mL(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 Zc(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 sw(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function ow(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new se(404,`team not found: ${e}`);return r}function iw(t){return t.startsWith("team:")?t.slice(5):t}function pL(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function aw(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??dw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function hL(t){let e=t.workspaceName??pn()??nr.default;return{id:e,name:e}}function Yc(t){if(t.headers.get("x-lmctl-workspace-id")!==dw)throw new se(400,"runtime request requires global-admin workspace identity")}function ji(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new se(400,"runtime workspace identity does not match route")}function Qn(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==e)throw new se(400,"runtime workspace identity does not match server workspace")}function lw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");ji(t,e,r.workspaceId);return}Yc(t)}function Qc(t){return`${on}${eu(t.name)}`}function eu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function tu(t){return`${zc}${t.id}`}function _L(t){let e=Ai(t.definition);return{id:Qc(t),name:t.name,...e.description===null?{}:{description:e.description}}}function gL(t){let e=Ai(t.definition);return{id:Qc(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Ai(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function wL(t,e){if(!e.startsWith(on))throw new se(404,`template not found: ${e}`);let r=e.slice(on.length),n=t.listWorkflows().filter(s=>eu(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new se(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function cw(t,e){if(!e.startsWith(zc))throw new se(404,`run not found: ${e}`);let r=e.slice(zc.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new se(404,`run not found: ${e}`);return s}function yL(t,e,r){if(r!==null){if(!r.startsWith(on))return[];let s=r.slice(on.length),o=t.listWorkflows().filter(a=>eu(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function uw(t,e){let r=t.getWorkflow(e.workflow_id),n=Zc(e),s=EL(r,e);return{id:tu(e),templateId:r===null?`${on}unknown`:Qc(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function EL(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[Ai(t.definition).nameToId.get(r)??r]}function bL(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Ai(r.definition),s=c=>n.nameToId.get(c)??c,o=tu(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=TL(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),d=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function TL(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 dw,on,zc,se,hw=E(()=>{"use strict";qe();xi();kt();dw="global-admin";on="template:",zc="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as SL,writeFileSync as kL}from"node:fs";import{randomUUID as _w}from"node:crypto";import{dirname as vL,resolve as Ri,sep as gw}from"node:path";async function yw(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!jL(n))return t.text("missing image file",400);if(n.size>IL)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=AL(s);if(o===null||!(o in ww))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=$L(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Ri(xL()):Ri(i.local_path),l=Ri(a,"uploads",_w()),c=Ri(l,`${_w()}${ww[o]}`);if(!NL(c,a))return t.text("invalid upload path",400);SL(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);kL(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function $L(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function NL(t,e){let r=e.endsWith(gw)?e:`${e}${gw}`;return t.startsWith(r)}function xL(){return vL(de())}function jL(t){return typeof File<"u"&&t instanceof File}function AL(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 IL,ww,Ew=E(()=>{"use strict";qe();IL=10*1024*1024,ww={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Oi}from"node:fs";import{basename as RL,dirname as OL,extname as LL,isAbsolute as CL,join as ML,relative as DL}from"node:path";import{fileURLToPath as PL}from"node:url";import{Hono as FL}from"hono";import{serveStatic as dt}from"@hono/node-server/serve-static";function $w(t){let e=new FL,r=[],n=t.localWebui!==void 0?nu(t.localWebui.webuiDir):UL();if(t.localWebui!==void 0&&Rg(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=WL();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,dt({root:n})),e.use("/vendor/*",s,dt({root:n})),e.use("/src/*",s,dt({root:n})),e.get("/",s,dt({root:n,path:"index.html"})),e.get("/admin",s,dt({root:n,path:"index.html"})),e.get("/admin/*",s,dt({root:n,path:"index.html"})),e.get("/terminal",s,dt({root:n,path:"index.html"})),e.get("/terminal/*",s,dt({root:n,path:"index.html"})),e.get("/chat",s,dt({root:n,path:"index.html"})),e.get("/chat/*",s,dt({root:n,path:"index.html"}))}else e.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return e.use("*",gh()),e.get("/login",s=>s.html($e("Login",`
1591
1591
  <h1>Login</h1>
1592
1592
  <form method="post" action="/login">
1593
1593
  <label>Token <input name="token" type="password"></label>
1594
1594
  <button type="submit">Login</button>
1595
1595
  </form>
1596
- `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return gh(i)?(uc(s,i),s.redirect("/",302)):s.html($e("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(wh(s),s.redirect("/login",302))),hg(e,{dal:t.dal}),uw(e,{dal:t.dal}),Rg(e,{dal:t.dal}),qg(e,{terminalSessionManager:t.terminalSessionManager}),Kg(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=xn(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await _l(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return U(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),vh(e,{dal:t.dal}),Rh(e,{dal:t.dal}),e.get("/api/status",s=>U(s,lo(t.dal),VL)),e.get("/api/projects",s=>U(s,co(t.dal),KL)),e.get("/api/teams",s=>U(s,Um(t.dal),ZL)),e.get("/api/workflows",s=>U(s,uo(t.dal),QL)),e.get("/api/workflows/verify",s=>{let o=Q_();return s.req.header("accept")?.includes("text/plain")?s.text(tg(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,Wm(t.dal,{status:s.req.query("status")}),eC)),e.post("/api/uploads",s=>gw(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=fo(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return U(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Zn(),dg)),i=fo(t.dal,Q(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():U(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():U(s,t.dal.listProjectWorkflows(o.id),YL)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await an(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{Ht(u)}catch{return s.text("invalid condition",400)}let d=HL(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return U(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(Q(s,"id"))?U(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(Q(s,"id"),!0);return o===null?s.notFound():U(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(Q(s,"id"),!1);return o===null?s.notFound():U(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=Ew(s.req.query("status"),JL);if(typeof i=="string")return s.text(i,400);let a=Ew(s.req.query("severity"),$w);return typeof a=="string"?s.text(a,400):U(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),zL)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await an(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=XL(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=GL(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return U(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=Q(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await an(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):U(s,c,le)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await an(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):U(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(Q(s,"id"));if(o===null)return s.notFound();let i=await an(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return U(s,t.dal.closeIssue(Q(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(Q(s,"id"));if(o===null)return s.notFound();let i=await an(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return U(s,t.dal.reopenIssue(Q(s,"id"),a),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return U(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=Q(s,"run_id"),i=s.req.query("kind"),a=mr(t.dal,o,i);return U(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=Q(s,"run_id"),i=s.req.param("kind"),a=mr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):U(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=BL(l.path);if(qL(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=RL(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return U(s,l,le)}return U(s,l,le)}),e.get("/api/runs",s=>U(s,Dr(t.dal,{limit:tu(s,"limit")??100}),tC)),e.get("/api/runs/:id",s=>{let o=fr(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,rC)}),e.get("/api/runs/:id/where",s=>{let o=Pr(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(po(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=ho(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(_o(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(Q(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(Li(t.daemon),U(s,i,bw)):U(s,i,bw,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=Q(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Li(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>yw(s,t.dal,o=>U(s,o,sC))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Jm(t.dal,Q(s,"id"),Q(s,"step_id"));return o===null?s.notFound():Iw(s)?s.html(`<pre>${b(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>yw(s,t.dal,o=>{let i=Zg(o);return U(s,i,a=>ue(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),e.get("/api/external-objects",s=>U(s,Xm(t.dal,{type:s.req.query("type")}),oC)),e.get("/api/external-signals",s=>U(s,Gm(t.dal,{unhandled:s.req.query("unhandled")==="true"}),iC)),e.get("/api/attentions",s=>U(s,Bt(t.dal,{unacked:s.req.query("unacked")==="true"}),aC)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(Q(s,"id"));return o===null?s.notFound():U(s,o,i=>`<p>acknowledged attention ${b(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=mo(t.dal,l);return U(s,c,u=>`<h1>Escalations</h1>${ue(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[b(d.attention_id),b(d.project),b(d.run_id),b(d.workflow_name),b(d.state_name),b((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=ct(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=Q(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=ct(t.dal,o);if(c===null)return s.notFound();let u=Bt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Li(t.daemon);let p=Bt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return Li(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=Bm(t.dal,{status:i,pr_url:o});return U(s,a,lC)}),e.get("/api/submitted-prs/:id",s=>{let o=Q(s,"id"),i=qm(t.dal,o);return i===null?s.notFound():U(s,i,cC)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),Tw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=xn(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),Tw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=xn(s.req.param("team_name"));try{let i=await Om(t.dal,o,s.req.param("alias"));return U(s,i,a=>Sw("compacted",a.row))}catch(i){if(i instanceof Nn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=xn(s.req.param("team_name")),i=await _l(t.dal,o,s.req.param("alias"));return U(s,i,a=>Sw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,kw)),e.post("/api/intake/scan",async s=>(r=await Yr(t.dal),U(s,r,kw))),e.get("/api/stats/run-throughput",s=>U(s,Ym(t.dal),uC)),e.get("/api/daemon/state",s=>U(s,t.daemon?.state??null,dC)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return U(s,{disabled:!0},le);let o=await t.daemon.runCycle();return U(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=Q(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=Sl(t.dal,o),l=kl(t.dal,{project_id:o});return s.html($e(`Metrics \u2014 ${i.name}`,fC(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=Q(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=tu(s,"since_days");return s.json(Sl(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=Q(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=tu(s,"since_days");return s.json(kl(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(Q(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function yw(t,e,r){let n=Tl(e,Q(t,"id"),Q(t,"step_id"));return n===null?t.notFound():r(n)}function Li(t){t!==void 0&&t.runCycle().catch(()=>{})}function U(t,e,r,n=200){return Iw(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function Iw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function UL(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Oi(`${t}/index.html`)?ru(t):null;let e="src/serve/webui-dist";if(Oi(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Oi(`${r}/index.html`))return r;let n=ML(OL(PL(import.meta.url)),"webui-dist");return Oi(`${n}/index.html`)?ru(n):null}function ru(t){if(!CL(t))return t;let e=DL(process.cwd(),t);return e.length===0?".":e}function WL(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function Q(t,e){return Number(t.req.param(e))}function tu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function BL(t){switch(LL(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 qL(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function an(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 HL(t){if(t==null)return null;if(typeof t=="string"){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return JSON.stringify(e)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof t=="object"&&!Array.isArray(t)?JSON.stringify(t):"error:parameters_override must be a JSON object"}function Ew(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function XL(t){if(t!=null)return typeof t=="string"&&$w.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function GL(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function VL(t){return`<h1>Status</h1><div class="grid">
1596
+ `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return yh(i)?(dc(s,i),s.redirect("/",302)):s.html($e("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Eh(s),s.redirect("/login",302))),gg(e,{dal:t.dal}),fw(e,{dal:t.dal}),Lg(e,{dal:t.dal}),Jg(e,{terminalSessionManager:t.terminalSessionManager}),zg(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=xn(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await gl(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return U(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),$h(e,{dal:t.dal}),Lh(e,{dal:t.dal}),e.get("/api/status",s=>U(s,lo(t.dal),VL)),e.get("/api/projects",s=>U(s,co(t.dal),KL)),e.get("/api/teams",s=>U(s,Bm(t.dal),ZL)),e.get("/api/workflows",s=>U(s,uo(t.dal),QL)),e.get("/api/workflows/verify",s=>{let o=tg();return s.req.header("accept")?.includes("text/plain")?s.text(ng(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,qm(t.dal,{status:s.req.query("status")}),eC)),e.post("/api/uploads",s=>yw(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=fo(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return U(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Zn(),mg)),i=fo(t.dal,Q(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():U(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():U(s,t.dal.listProjectWorkflows(o.id),YL)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await an(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{Ht(u)}catch{return s.text("invalid condition",400)}let d=HL(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return U(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(Q(s,"id"))?U(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(Q(s,"id"),!0);return o===null?s.notFound():U(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(Q(s,"id"),!1);return o===null?s.notFound():U(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=Tw(s.req.query("status"),JL);if(typeof i=="string")return s.text(i,400);let a=Tw(s.req.query("severity"),xw);return typeof a=="string"?s.text(a,400):U(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),zL)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await an(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=XL(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=GL(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return U(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=Q(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await an(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):U(s,c,le)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await an(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):U(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(Q(s,"id"));if(o===null)return s.notFound();let i=await an(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return U(s,t.dal.closeIssue(Q(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(Q(s,"id"));if(o===null)return s.notFound();let i=await an(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return U(s,t.dal.reopenIssue(Q(s,"id"),a),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return U(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=Q(s,"run_id"),i=s.req.query("kind"),a=mr(t.dal,o,i);return U(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=Q(s,"run_id"),i=s.req.param("kind"),a=mr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):U(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=BL(l.path);if(qL(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=RL(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return U(s,l,le)}return U(s,l,le)}),e.get("/api/runs",s=>U(s,Dr(t.dal,{limit:ru(s,"limit")??100}),tC)),e.get("/api/runs/:id",s=>{let o=fr(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,rC)}),e.get("/api/runs/:id/where",s=>{let o=Pr(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(po(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=ho(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(_o(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(Q(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(Li(t.daemon),U(s,i,Sw)):U(s,i,Sw,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=Q(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Li(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=>bw(s,t.dal,o=>U(s,o,sC))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Gm(t.dal,Q(s,"id"),Q(s,"step_id"));return o===null?s.notFound():Nw(s)?s.html(`<pre>${b(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>bw(s,t.dal,o=>{let i=ew(o);return U(s,i,a=>ue(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),e.get("/api/external-objects",s=>U(s,Vm(t.dal,{type:s.req.query("type")}),oC)),e.get("/api/external-signals",s=>U(s,Km(t.dal,{unhandled:s.req.query("unhandled")==="true"}),iC)),e.get("/api/attentions",s=>U(s,Bt(t.dal,{unacked:s.req.query("unacked")==="true"}),aC)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(Q(s,"id"));return o===null?s.notFound():U(s,o,i=>`<p>acknowledged attention ${b(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=mo(t.dal,l);return U(s,c,u=>`<h1>Escalations</h1>${ue(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[b(d.attention_id),b(d.project),b(d.run_id),b(d.workflow_name),b(d.state_name),b((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=ct(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=Q(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=ct(t.dal,o);if(c===null)return s.notFound();let u=Bt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Li(t.daemon);let p=Bt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return Li(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=Hm(t.dal,{status:i,pr_url:o});return U(s,a,lC)}),e.get("/api/submitted-prs/:id",s=>{let o=Q(s,"id"),i=Jm(t.dal,o);return i===null?s.notFound():U(s,i,cC)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),kw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=xn(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),kw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=xn(s.req.param("team_name"));try{let i=await Cm(t.dal,o,s.req.param("alias"));return U(s,i,a=>vw("compacted",a.row))}catch(i){if(i instanceof Nn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=xn(s.req.param("team_name")),i=await gl(t.dal,o,s.req.param("alias"));return U(s,i,a=>vw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,Iw)),e.post("/api/intake/scan",async s=>(r=await Yr(t.dal),U(s,r,Iw))),e.get("/api/stats/run-throughput",s=>U(s,Zm(t.dal),uC)),e.get("/api/daemon/state",s=>U(s,t.daemon?.state??null,dC)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return U(s,{disabled:!0},le);let o=await t.daemon.runCycle();return U(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=Q(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=kl(t.dal,o),l=vl(t.dal,{project_id:o});return s.html($e(`Metrics \u2014 ${i.name}`,fC(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=Q(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=ru(s,"since_days");return s.json(kl(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=Q(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=ru(s,"since_days");return s.json(vl(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(Q(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function bw(t,e,r){let n=Sl(e,Q(t,"id"),Q(t,"step_id"));return n===null?t.notFound():r(n)}function Li(t){t!==void 0&&t.runCycle().catch(()=>{})}function U(t,e,r,n=200){return Nw(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function Nw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function UL(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Oi(`${t}/index.html`)?nu(t):null;let e="src/serve/webui-dist";if(Oi(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Oi(`${r}/index.html`))return r;let n=ML(OL(PL(import.meta.url)),"webui-dist");return Oi(`${n}/index.html`)?nu(n):null}function nu(t){if(!CL(t))return t;let e=DL(process.cwd(),t);return e.length===0?".":e}function WL(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function Q(t,e){return Number(t.req.param(e))}function ru(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function BL(t){switch(LL(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 qL(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function an(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 HL(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 Tw(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function XL(t){if(t!=null)return typeof t=="string"&&xw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function GL(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function VL(t){return`<h1>Status</h1><div class="grid">
1597
1597
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
1598
1598
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
1599
1599
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
@@ -1613,7 +1613,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1613
1613
  </fieldset>
1614
1614
  </form>
1615
1615
  <div id="pause-result" style="margin-top:0.6em;"></div>
1616
- </section>`}function sC(t){return`<section><h3>${b(t.state_name)}</h3>${le(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function bw(t){return t.resumed?`<p>resumed run ${b(t.run.id)}</p>`:`<p>resume failed: ${b(t.reason)}</p>`}function oC(t){return`<h1>External Objects</h1>${ue(["id","type","provider","external_id","status","url"],t.map(e=>[b(e.id),b(e.type),b(e.provider),b(e.external_id),b(e.status),b(e.url)]))}`}function iC(t){return`<h1>External Signals</h1>${ue(["id","object","kind","handled"],t.map(e=>[b(e.id),b(e.object_id),b(e.kind),b(e.handled_at)]))}`}function aC(t){let e=`<style>
1616
+ </section>`}function sC(t){return`<section><h3>${b(t.state_name)}</h3>${le(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function Sw(t){return t.resumed?`<p>resumed run ${b(t.run.id)}</p>`:`<p>resume failed: ${b(t.reason)}</p>`}function oC(t){return`<h1>External Objects</h1>${ue(["id","type","provider","external_id","status","url"],t.map(e=>[b(e.id),b(e.type),b(e.provider),b(e.external_id),b(e.status),b(e.url)]))}`}function iC(t){return`<h1>External Signals</h1>${ue(["id","object","kind","handled"],t.map(e=>[b(e.id),b(e.object_id),b(e.kind),b(e.handled_at)]))}`}function aC(t){let e=`<style>
1617
1617
  @keyframes attn-flicker { 0%,100%{background:#fff8e6;} 50%{background:#ffd766;} }
1618
1618
  tr.requires-user { animation: attn-flicker 1.4s ease-in-out infinite; font-weight:600; }
1619
1619
  tr.requires-user td:first-child::before { content:"\u2605 "; color:#d28e00; }
@@ -1627,7 +1627,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1627
1627
  <dt>submitted_at</dt><dd>${b(t.submitted_at)}</dd>
1628
1628
  <dt>last_scanned_at</dt><dd>${b(t.last_scanned_at??"\u2014")}</dd>
1629
1629
  <dt>last_known_state</dt><dd>${b(t.last_known_state??"\u2014")}</dd>
1630
- </dl>`}function Tw(t){return`<h1>Sessions</h1>${ue(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=no(e.team_name),n=encodeURIComponent(e.alias);return[b(e.team_name),b(e.alias),b(e.sessionid),b(e.input_tokens),b(e.cache_tokens),b(e.output_tokens),b(e.total_tokens),b(e.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function Sw(t,e){return e===null?`<span>${b(t)}</span>`:`<span>${b(t)} ${b(e.team_name)}/${b(e.alias)}</span>`}function uC(t){return`<h1>Run Throughput</h1>${ue(["workflow","terminal","count"],t.map(e=>[b(e.workflow_name),b(e.terminal_state),b(e.count)]))}`}function kw(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${ue(["project","scanned","new jobs","error"],t.map(e=>[b(e.project_name),b(e.scanned),b(e.new_jobs),b(e.error)]))}`}function dC(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${le(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function fC(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[b(l.state_name),b(l.total),b(l.request_changes),b(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[b(l.state_name),b(l.lt_5min),b(l.btw_5_15min),b(l.btw_15_60min),b(l.gt_60min),b(l.no_end)]),i=e.retry_counts.map(l=>[b(l.state_name),b(l.retried_runs),b(l.avg_retries)]),a=r.map(l=>[b(l.tool_name),b(l.invocations),b(l.successes),b(l.hit_rate_pct),b(l.avg_latency_ms??"n/a"),b(l.p50_latency_ms??"n/a"),b(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${b(t)}</h1>
1630
+ </dl>`}function kw(t){return`<h1>Sessions</h1>${ue(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=no(e.team_name),n=encodeURIComponent(e.alias);return[b(e.team_name),b(e.alias),b(e.sessionid),b(e.input_tokens),b(e.cache_tokens),b(e.output_tokens),b(e.total_tokens),b(e.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function vw(t,e){return e===null?`<span>${b(t)}</span>`:`<span>${b(t)} ${b(e.team_name)}/${b(e.alias)}</span>`}function uC(t){return`<h1>Run Throughput</h1>${ue(["workflow","terminal","count"],t.map(e=>[b(e.workflow_name),b(e.terminal_state),b(e.count)]))}`}function Iw(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${ue(["project","scanned","new jobs","error"],t.map(e=>[b(e.project_name),b(e.scanned),b(e.new_jobs),b(e.error)]))}`}function dC(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${le(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function fC(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[b(l.state_name),b(l.total),b(l.request_changes),b(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[b(l.state_name),b(l.lt_5min),b(l.btw_5_15min),b(l.btw_15_60min),b(l.gt_60min),b(l.no_end)]),i=e.retry_counts.map(l=>[b(l.state_name),b(l.retried_runs),b(l.avg_retries)]),a=r.map(l=>[b(l.tool_name),b(l.invocations),b(l.successes),b(l.hit_rate_pct),b(l.avg_latency_ms??"n/a"),b(l.p50_latency_ms??"n/a"),b(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${b(t)}</h1>
1631
1631
  <h2>Request-changes rate</h2>
1632
1632
  <p>Total: ${b(n.request_changes)} of ${b(n.total)} steps (${b(n.rate_pct)})</p>
1633
1633
  ${ue(["state","total steps","request_changes","rate"],s)}
@@ -1636,43 +1636,43 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1636
1636
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
1637
1637
  ${ue(["state","retried runs","avg attempts"],i)}
1638
1638
  <h2>Tool efficacy</h2>
1639
- ${ue(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var JL,$w,Nw=E(()=>{"use strict";Ko();Jr();Eh();Ih();Oh();kt();_c();Sg();Ag();Dg();Hg();Yg();Qg();mw();so();ww();fi();JL=["open","assigned","closed","reopened"],$w=["low","medium","high","critical"]});function mC(t){return Math.floor(t/6e4)*6e4}function pC(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)hC(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function hC(t,e){let r=Date.now(),n=mC(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function xw(t,e=250){let r=setInterval(()=>{try{pC(t)}catch{}},e);return{stop(){clearInterval(r)}}}var jw=E(()=>{"use strict"});function gC({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1639
+ ${ue(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var JL,xw,jw=E(()=>{"use strict";Ko();Jr();Th();Nh();Ch();kt();gc();vg();Og();Fg();Xg();Zg();tw();hw();so();Ew();fi();JL=["open","assigned","closed","reopened"],xw=["low","medium","high","critical"]});function mC(t){return Math.floor(t/6e4)*6e4}function pC(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)hC(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function hC(t,e){let r=Date.now(),n=mC(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Aw(t,e=250){let r=setInterval(()=>{try{pC(t)}catch{}},e);return{stop(){clearInterval(r)}}}var Rw=E(()=>{"use strict"});function gC({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1640
1640
  FROM run r
1641
1641
  JOIN job j ON j.id = r.job_id
1642
1642
  WHERE j.project_id = ?
1643
1643
  AND r.terminal_state IS NOT NULL
1644
1644
  ORDER BY r.id DESC
1645
- LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,_C).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,Aw)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Aw,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function Rw(t){for(let e of wC)try{e(t)}catch{}}var _C,Aw,wC,Ow=E(()=>{"use strict";_C="request_changes",Aw="reviewer_rejection_rate_high";wC=[gC]});function es(){let t=process.env.LMCTL_DAEMON_INTERVAL_MS;if(t===void 0||t.trim().length===0)return 5e3;let e=Number(t);return Number.isFinite(e)&&e>0?e:5e3}function Lw(t){let e=t.intervalMs??es(),r=t.runOnceFn??Er,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??xw)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Cw(t.dal,t.monitorSessionActivityFn??gl,e,n).finally(()=>{a=null})),a.finally(()=>u(wl(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=yC(t.dal,r,t.collectSessionSizesFn??Rm,t.scanIntakeFn??Yr,t.monitorSessionActivityFn??gl,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function yC(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(og({dal:t}),Rw({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await Cw(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function Cw(t,e,r,n){let s=wl(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var nu=E(()=>{"use strict";Ko();Zn();Oc();so();jw();Ow();yl()});function Mw(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var Dw=E(()=>{"use strict"});import{mkdirSync as EC,readFileSync as bC,readdirSync as TC,statSync as SC,writeFileSync as kC}from"node:fs";import{dirname as vC,join as Fw,sep as Pw}from"node:path";function Ci(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Uw:return IC(t,s.input);case Ww:return $C(t,s.input);case Bw:return NC(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:iu,GetObjectCommand:ou,PutObjectCommand:su}}}function IC(t,e){let r=qw(t,e.Key);return EC(vC(r),{recursive:!0}),kC(r,e.Body),{}}function $C(t,e){let r=qw(t,e.Key),n;try{n=bC(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function NC(t,e){let r=e.Prefix??"";Hw(r);let s=xC(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function qw(t,e){return Hw(e),Fw(t,e)}function Hw(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function xC(t){let e=[],r=(n,s)=>{let o;try{o=TC(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=Fw(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Pw==="/"?a:a.split(Pw).join("/");e.push({key:c,lastModified:SC(l).mtime})}}};return r(t,""),e}var Uw,Ww,Bw,su,ou,iu,au=E(()=>{"use strict";Uw="localfs-put",Ww="localfs-get",Bw="localfs-list",su=class{input;_localfsTag=Uw;constructor(e){this.input=e}},ou=class{input;_localfsTag=Ww;constructor(e){this.input=e}},iu=class{input;_localfsTag=Bw;constructor(e){this.input=e}}});function Jw(){return{put:0,get:0,list:0}}function lu(t,e=jC){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function cu(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var jC,Mi,uu=E(()=>{"use strict";jC={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Mi=class{counts=Jw();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Jw(),e}estimateCostUsd(e){return lu(this.counts,e)}}});function Xw(t){let e=t.now??Date.now,r=t.timers??AC,n=null,s=null;async function o(){let l=e(),c=cu(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=lu(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===cu(e())}}}var AC,Gw=E(()=>{"use strict";uu();AC={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var du=E(()=>{"use strict";yi();bi();bi()});function RC(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function OC(t){return t.reply_to!==void 0&&t.response!==void 0}function LC(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Vw(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var Di,ts,Kw=E(()=>{"use strict";du();Di=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},ts=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new Di("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=jt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(Vw(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Vw(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new Di;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=RC(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(OC(n)){let l=this.pending.get(n.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${n.reply_to}`);return}this.pending.delete(n.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(n.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${n.message_id}`);return}let s=r?.conversation_id??LC(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:jt(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function fu(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;return!(e.kind!=="terminal"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.data!="string"||typeof e.ts!="number")}var Yw=E(()=>{"use strict"});function mu(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var zw=E(()=>{"use strict"});function hu(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var pu,Zw=E(()=>{"use strict";pu="daemon:events"});function ey(t){return{kind:"prompt",prompt_id:t.prompt_id??jt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function _u(t){if(t===null||typeof t!="object")return!1;let e=t;return e.kind==="prompt"&&typeof e.prompt_id=="string"&&e.prompt_id.length>0&&typeof e.root_teamfile=="string"&&e.root_teamfile.length>0&&typeof e.text=="string"}var Qw,gu=E(()=>{"use strict";du();Qw="prompt:root"});function rs(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(ry(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function CC(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(ry(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function ty(t,e=60){if(typeof t!="string"||t==="")return!0;let r=CC(t);return r===null?!0:Date.now()/1e3>=r-e}function ry(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var wu=E(()=>{"use strict"});async function Pi(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":MC},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var MC,yu=E(()=>{"use strict";MC="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as ny,mkdirSync as sy,readFileSync as oy,writeFileSync as iy}from"node:fs";import{homedir as ay}from"node:os";import{dirname as ly,join as cy}from"node:path";function ns(){return process.env.LMCTL_DEVICE_AUTH_PATH??cy(ay(),".lmctl","device-auth.json")}function uy(){return process.env.LMCTL_TOKEN_PATH??cy(ay(),".lmctl","cli-tokens.json")}function Eu(t=ns()){try{let e=JSON.parse(oy(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 dy(t,e=ns()){sy(ly(e),{recursive:!0,mode:448}),iy(e,JSON.stringify(t,null,2));try{ny(e,384)}catch{}}function bu(t,e=uy()){let r={};try{r=JSON.parse(oy(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};sy(ly(e),{recursive:!0,mode:448}),iy(e,JSON.stringify(s,null,2));try{ny(e,384)}catch{}}async function fy(t){let e=t.deviceAuthPath??ns(),r=Eu(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Pi({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return bu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??uy()),{idToken:n.idToken,userId:r.userId}}var Tu=E(()=>{"use strict";yu()});function my(t){if(t.length===0||!t.startsWith("---"))throw new ft("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1646
- `);if(e[0]!=="---")throw new ft("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new ft(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!DC.has(c))throw new ft(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Fi.join(", ")}`);r[c]=u}if(n===-1)throw new ft("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Fi)if(r[i]===void 0)throw new ft(`missing required frontmatter key "${i}" \u2014 required: ${Fi.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var Fi,DC,ft,py=E(()=>{"use strict";Fi=["title","description","members"],DC=new Set(Fi),ft=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as PC,writeFileSync as z3,renameSync as Z3,existsSync as wy,realpathSync as Su,statSync as FC}from"node:fs";import{basename as yy,resolve as Yt,dirname as ku}from"node:path";function BC(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function qC(t){return/^\s*_MEMBER_\s+\S/.test(t)}function HC(t){return/^\s*_SESSION_\s+\S/.test(t)}function JC(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function XC(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Iu(t){let e=yy(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Ne(t){let e=PC(t,"utf-8"),r=ku(Yt(t)),n=$u(e,Iu(t),{baseDir:r,sourcePath:Yt(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Yt(r,s.sessiondir));return n}function GC(t,e){let r={},n=[],s=t.replace(/^\s*_CONNECT_\s*/,""),o=0;function i(a){return s.slice(a).trim().split(/\s+/u)[0]??""}for(;o<s.length;){for(;o<s.length&&/\s/u.test(s[o]);)o+=1;if(o>=s.length)break;let a=o,l=/^[A-Za-z_][A-Za-z0-9_]*/u.exec(s.slice(o));if(l===null){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}let c=l[0];if(o+=c.length,s[o]!=="="){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}o+=1;let u="";if(s[o]==='"'){o+=1;let d=o;for(;o<s.length&&s[o]!=='"';)o+=1;if(o>=s.length){n.push(`line ${e}: unterminated quoted value for "${c}" on _CONNECT_ line: ${t.trim()}`);break}if(u=s.slice(d,o),o+=1,o<s.length&&!/\s/u.test(s[o])){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}}else{let d=o;for(;o<s.length&&!/\s/u.test(s[o]);)o+=1;u=s.slice(d,o)}if(!_y.includes(c)){n.push(`line ${e}: unknown key "${c}" on _CONNECT_ line: ${t.trim()}
1647
- allowed keys: ${_y.join(", ")}`);continue}if(Object.prototype.hasOwnProperty.call(r,c)){n.push(`line ${e}: duplicate key "${c}" on _CONNECT_ line: ${t.trim()}`);continue}r[c]=u}return{kvs:r,errors:n}}function $u(t,e,r={}){let n=[],s=[],o=[],i=[],a=new Set,l=r.baseDir??WC,c;if(r.sourcePath!==void 0)try{c=Su(r.sourcePath)}catch{c=void 0}let u=t;if(u.startsWith("#teamfile:")){let m=u.indexOf(`
1648
- `);u=m>=0?u.slice(m+1):""}let d=null;if(u.startsWith("---"))try{d=my(u)}catch(m){if(m instanceof ft)i.push(`frontmatter: ${m.message}`);else throw m}let f=t.split(`
1649
- `);for(let m=0;m<f.length;m++){let p=f[m],h=m+1;if(HC(p))throw new Error(`line ${h}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${p.trim()})`);if(JC(p)){let{kvs:S,errors:I}=GC(p,h);if(i.push(...I),I.length>0)continue;let v=S.alias,k=S.teamfile;if(v||i.push(`line ${h}: _CONNECT_ missing alias: ${p.trim()}`),k||i.push(`line ${h}: _CONNECT_ missing teamfile: ${p.trim()}`),!v||!k)continue;let R=Yt(l,k);try{let L=Su(R);if(c!==void 0&&L===c){i.push(`line ${h}: ${Ui}`);continue}let B=`${v}\0${L}`;if(a.has(B)){i.push(`line ${h}: duplicate _CONNECT_ alias "${v}" for teamfile "${k}"`);continue}a.add(B),s.push({alias:v,teamfile:L})}catch(L){i.push(`line ${h}: _CONNECT_ teamfile missing/unreadable: ${R}: ${L instanceof Error?L.message:String(L)}`)}continue}if(XC(p)){let S=p.replace(/^\s*_SKILL_\s*/,"").trim(),I=S.length===0?[]:S.split(/\s+/u);if(I.length!==1){i.push(`line ${h}: _SKILL_ requires exactly one https:// URL or local path: ${p.trim()}`);continue}let v=I[0];try{if(new URL(v).protocol!=="https:"){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${v}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(v)&&!/^[A-Za-z]:[\\/]/u.test(v)){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${v}`);continue}}o.push(v);continue}if(!qC(p))continue;let g=BC(p);for(let S of Object.keys(g))if(!hy.includes(S))throw new Error(`line ${h}: unknown key "${S}" on _MEMBER_ line: ${p.trim()}
1650
- allowed keys: ${hy.join(", ")}`);if(!g.provider&&!g.teamfile){i.push(`line ${h}: member line missing provider (or teamfile): ${p.trim()}`);continue}let T={alias:g.alias||`member${n.length+1}`,provider:g.provider||"",extra:{}};g.sessionid&&(T.session=g.sessionid),g.sessiondir&&(T.sessiondir=g.sessiondir),g.teamfile&&(T.teamfile=g.teamfile),g.model&&(T.model=g.model),n.push(T)}return{name:e,members:n,connections:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:d}}function Nu(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===vu.toLowerCase());n.length>1&&r.push({field:vu,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?Yt(e,o.teamfile):Yt(o.teamfile);if(!wy(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Ne(a),c=mt(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else UC.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function mt(t){return t.members.find(e=>e.alias.toLowerCase()===vu.toLowerCase())}function xu(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=Yt(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!wy(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Ne(o),l=mt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return xu(l,ku(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||ku(o),alias:t.alias,resolvedFrom:o,model:l.model}}function gy(t){let e;try{e=Su(t)}catch(n){throw new Error(`connect target missing/unreadable: ${t}: ${n instanceof Error?n.message:String(n)}`)}let r=FC(e);return{path:e,key:`${r.dev}:${r.ino}`}}function VC(t){return t.map(e=>yy(e)).join(" -> ")}function KC(t){let e=new Map;for(let i of t){let a=e.get(i.from.key)??[];a.push(i),e.set(i.from.key,a)}let r=new Set,n=new Set,s=[];function o(i){if(r.has(i.key)){let a=s.findIndex(c=>c.key===i.key),l=a>=0?s.slice(a).map(c=>c.path):[i.path];return l.push(i.path),l}if(n.has(i.key))return null;r.add(i.key),s.push(i);for(let a of e.get(i.key)??[]){let l=o(a.to);if(l!==null)return l}return s.pop(),r.delete(i.key),n.add(i.key),null}for(let i of t){let a=o(i.from);if(a!==null)return a}return null}function Tr(t){let e=gy(Yt(t)),r=new Map,n=new Map,s=[];function o(a,l){if(r.has(a.key))return;r.set(a.key,a);let c;try{c=Ne(a.path)}catch(d){throw new Error(`connect parse error in ${a.path}: ${d instanceof Error?d.message:String(d)}`)}if(c.parseErrors.length>0){let d=c.parseErrors.find(f=>f.includes("_CONNECT_ teamfile missing/unreadable"));throw d!==void 0?new Error(`${a.path}: ${d}`):new Error(`connect parse error in ${a.path}: ${c.parseErrors.join("; ")}`)}let u=[];n.set(a.key,{source_teamfile:a.path,connections:u});for(let d of c.connections){let f=gy(d.teamfile);if(f.key===a.key)throw new Error(Ui);let m;try{m=Ne(f.path)}catch(p){throw new Error(`connect target missing/unreadable: ${d.alias} -> ${f.path}: ${p instanceof Error?p.message:String(p)}`)}if(m.parseErrors.length>0)throw new Error(`connect target invalid: ${d.alias} -> ${f.path}: ${m.parseErrors.join("; ")}`);if(ss(m,d.alias)===void 0)throw new Error(`connect target has no member alias "${d.alias}": ${f.path}`);s.push({from:a,to:f,alias:d.alias}),u.push({target_name:d.alias,target_teamfile:f.path}),!l.has(f.key)&&o(f,new Set([...l,f.key]))}}o(e,new Set([e.key]));let i=KC(s);if(i!==null)throw new Error(`connect cycle: ${VC(i)}`);return{root_teamfile:e.path,snapshots:[...n.values()],edges:s}}function ss(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var vu,Ui,UC,WC,hy,_y,At=E(()=>{"use strict";py();vu="Lead",Ui="_CONNECT_ cannot target its own team (self-edge); intra-team members are connected implicitly via _MEMBER_",UC=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]),WC=process.cwd();hy=["alias","provider","sessionid","sessiondir","teamfile","model"],_y=["alias","teamfile"]});import{existsSync as YC,realpathSync as zC}from"node:fs";import{dirname as ZC}from"node:path";function ju(t){QC(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function QC(t){let e=t.payload.root_teamfile;try{e=zC(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await ln(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await ln(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=eM(e);if("error"in r)return await ln(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-nM(t.env??process.env)).toISOString()});if(!s.acquired){let o=rM(r.alias,s.current);return await ln(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??ur)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await ln(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await ln(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function eM(t){if(!YC(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Ne(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=mt(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??ZC(t)}}async function ln(t,e){let r=Ty(e.message),n=e.response===null?null:Ty(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Ty(t){return t.length<=Ey?{text:t,truncated:!1}:{text:t.slice(0,Ey),truncated:!0}}function tM(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function rM(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:tM(t,e)}function nM(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return by;let r=Number(e);return!Number.isFinite(r)||r<=0?by:r}var Ey,by,Sy=E(()=>{"use strict";St();At();Ey=256*1024,by=30*60*1e3});import{chmodSync as xy,existsSync as sM,mkdirSync as jy,readFileSync as Hi,writeFileSync as Ay}from"node:fs";import{dirname as Au,resolve as Wi,join as Ry}from"node:path";import{fileURLToPath as oM}from"node:url";import{homedir as Oy}from"node:os";import{CognitoIdentityClient as iM,GetIdCommand as aM}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as ky}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as lM,ListObjectsV2Command as cM,PutObjectCommand as uM,S3Client as vy}from"@aws-sdk/client-s3";function is(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:hM(t.selfUrl),n={},s;for(let v of r)if(sM(v)){n=pM(v),s=v;break}let o=(...v)=>{for(let k of v)if(typeof k=="string"&&k!=="")return k},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??dM,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??fM,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??mM,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ji,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=qi(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=qi(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=qi(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=qi(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),S=o(e.LMCTL_MAILBOX_KEY),I=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...S!==void 0?{mailboxKey:S}:{},...I!==void 0?{tokenPath:I}:{}},f}function pM(t){try{let e=Hi(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function hM(t){let e=Au(oM(t??import.meta.url));return[Wi(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Wi(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Wi(e,"..","..","..","infra","terraform","terraform.tfstate"),Wi(e,"..","..","infra","terraform","terraform.tfstate")]}function qi(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function _M(t){let e=gM(t.intervalMs)??Ly,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function gM(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Cy(t){let e=t.tokenPath??Ry(Oy(),".lmctl","cli-tokens.json"),r=$y(t.tokenPath);if(ty(r.cognito?.idToken)&&Eu()!==null)try{await fy({region:t.region,clientId:t.cognitoClientId??Ji,cliTokensPath:e}),r=$y(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let H=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await Ny({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=ky({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new vy({region:t.region,credentials:a}),c={ListObjectsV2Command:cM,GetObjectCommand:lM,PutObjectCommand:uM},u=rs(n),d=u??o,f=t.deviceId,m=rn({identityId:o,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 H=!1,me=0;for(;!H&&me<2;){me+=1;try{let $=gi(m,"web"),N=0,O;do{let q=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:$,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of q.Contents??[]){let C=wi(F.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}O=q.IsTruncated===!0?q.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),H=!0}catch($){let N=$ instanceof Error?$.message:String($);if(i&&me===1&&EM($)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),yM(e),i=!1,o=await Ny({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=ky({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new vy({region:t.region,credentials:a}),m=rn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,S=t.promptTriggerStore,I=new Mi,v=new br({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>I.record(x),onMessage:async x=>{if(_!==void 0&&fu(x.payload)){_.onInbound(x.payload);return}if(T!==void 0&&mu(x.payload)){await T.onInbound(x.payload);return}if(!hu(x.payload)){if(S!==void 0&&_u(x.payload)){ju({store:S,payload:x.payload,log:t.log});return}g!==null&&await g.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}:{}});g=new ts({client:v,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async x=>v.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),T!==void 0&&T.setPublish(async x=>v.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let k=x=>v.putMessage({conversation_id:pu,payload:x});v.start();let R=t.chatLogTailStore===void 0?void 0:_M({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Ly,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let L=t.deviceId??o,B=`${d}/usage/`,ee;return ee=t.usageStore===void 0?void 0:Xw({meter:I,store:t.usageStore,userId:d,deviceId:L,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:H,ceilingUsd:me})=>{t.log?.(`[usage] month ${x} cost $${H.toFixed(4)} >= ceiling $${me} \u2014 blocking mailbox`),v.stop().catch(()=>{}),ee?.stop()},publishOwnRollup:async(x,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${B}${L}-${x}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let H={put:0,get:0,list:0},me;do{let $=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:B,MaxKeys:1e3,...me!==void 0?{ContinuationToken:me}:{}}));for(let N of $.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${x}.json`))try{let q=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(q.Body===void 0)continue;let F=JSON.parse(await q.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}me=$.IsTruncated===!0?$.NextContinuationToken:void 0}while(me!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:v,fetchClient:g,publishDaemonEvent:k,async stop(){R?.stop(),ee!==void 0&&(await ee.flushNow().catch(()=>{}),ee.stop()),await g.stop().catch(()=>{}),await v.stop().catch(()=>{})}}}async function My(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Ci(t.rootDir),r=rn({identityId:os,userId:os,deviceId:Iy}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new br({bucket:"local",identityId:os,userId:os,deviceId:Iy,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&fu(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&mu(c.payload)){await o.onInbound(c.payload);return}if(!hu(c.payload)){if(i!==void 0&&_u(c.payload)){ju({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Bi,readIntervalMs:t.readIntervalMs??Bi,heartbeatIdleMs:t.heartbeatIdleMs??Bi,backoffReadIntervalMs:t.backoffReadIntervalMs??Bi});n=new ts({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:pu,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:os,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function $y(t){let e=t??Ry(Oy(),".lmctl","cli-tokens.json");try{let r=Hi(e,"utf8");return JSON.parse(r)}catch{return{}}}function wM(t,e){if(e===void 0||e==="")return;let r={};try{let s=Hi(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};jy(Au(t),{recursive:!0,mode:448}),Ay(t,JSON.stringify(n,null,2));try{xy(t,384)}catch{}}function yM(t){let e={};try{let n=Hi(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,jy(Au(t),{recursive:!0,mode:448}),Ay(t,JSON.stringify(r,null,2));try{xy(t,384)}catch{}}async function Ny(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new iM({region:t.region}).send(new aM({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{wM(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function EM(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var Ly,Bi,Ji,dM,fM,mM,os,Iy,Ru=E(()=>{"use strict";Ti();au();uu();Gw();Kw();Yw();zw();Zw();gu();yi();wu();Tu();Sy();Ly=3e3,Bi=1e3,Ji="79u5jhkk46qofog661c9i0bdcs",dM="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",fM="us-east-1_4iUdFggDn",mM="lmctl-next-preview-mailbox-254332045686";os="local",Iy="local"});import{spawn as Mu}from"node:child_process";import{createInterface as Dy}from"node:readline";var Ou,Lu,Cu,Py,Fy=E(()=>{"use strict";Aa();Je();Ou=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=Mu(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=Dy({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1645
+ LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,_C).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,Ow)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Ow,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function Lw(t){for(let e of wC)try{e(t)}catch{}}var _C,Ow,wC,Cw=E(()=>{"use strict";_C="request_changes",Ow="reviewer_rejection_rate_high";wC=[gC]});function es(){let t=process.env.LMCTL_DAEMON_INTERVAL_MS;if(t===void 0||t.trim().length===0)return 5e3;let e=Number(t);return Number.isFinite(e)&&e>0?e:5e3}function Mw(t){let e=t.intervalMs??es(),r=t.runOnceFn??Er,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??Aw)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Dw(t.dal,t.monitorSessionActivityFn??wl,e,n).finally(()=>{a=null})),a.finally(()=>u(yl(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=yC(t.dal,r,t.collectSessionSizesFn??Lm,t.scanIntakeFn??Yr,t.monitorSessionActivityFn??wl,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function yC(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(ag({dal:t}),Lw({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await Dw(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function Dw(t,e,r,n){let s=yl(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var su=E(()=>{"use strict";Ko();Zn();Lc();so();Rw();Cw();El()});function Pw(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var Fw=E(()=>{"use strict"});import{mkdirSync as EC,readFileSync as bC,readdirSync as TC,statSync as SC,writeFileSync as kC}from"node:fs";import{dirname as vC,join as Ww,sep as Uw}from"node:path";function Ci(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Bw:return IC(t,s.input);case qw:return $C(t,s.input);case Hw:return NC(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:au,GetObjectCommand:iu,PutObjectCommand:ou}}}function IC(t,e){let r=Jw(t,e.Key);return EC(vC(r),{recursive:!0}),kC(r,e.Body),{}}function $C(t,e){let r=Jw(t,e.Key),n;try{n=bC(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function NC(t,e){let r=e.Prefix??"";Xw(r);let s=xC(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function Jw(t,e){return Xw(e),Ww(t,e)}function Xw(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function xC(t){let e=[],r=(n,s)=>{let o;try{o=TC(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=Ww(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Uw==="/"?a:a.split(Uw).join("/");e.push({key:c,lastModified:SC(l).mtime})}}};return r(t,""),e}var Bw,qw,Hw,ou,iu,au,lu=E(()=>{"use strict";Bw="localfs-put",qw="localfs-get",Hw="localfs-list",ou=class{input;_localfsTag=Bw;constructor(e){this.input=e}},iu=class{input;_localfsTag=qw;constructor(e){this.input=e}},au=class{input;_localfsTag=Hw;constructor(e){this.input=e}}});function Gw(){return{put:0,get:0,list:0}}function cu(t,e=jC){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function uu(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var jC,Mi,du=E(()=>{"use strict";jC={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Mi=class{counts=Gw();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Gw(),e}estimateCostUsd(e){return cu(this.counts,e)}}});function Vw(t){let e=t.now??Date.now,r=t.timers??AC,n=null,s=null;async function o(){let l=e(),c=uu(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=cu(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===uu(e())}}}var AC,Kw=E(()=>{"use strict";du();AC={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var fu=E(()=>{"use strict";yi();bi();bi()});function RC(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function OC(t){return t.reply_to!==void 0&&t.response!==void 0}function LC(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Yw(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var Di,ts,zw=E(()=>{"use strict";fu();Di=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},ts=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new Di("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=jt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(Yw(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Yw(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new Di;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=RC(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(OC(n)){let l=this.pending.get(n.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${n.reply_to}`);return}this.pending.delete(n.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(n.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${n.message_id}`);return}let s=r?.conversation_id??LC(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:jt(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function mu(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 Zw=E(()=>{"use strict"});function pu(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var Qw=E(()=>{"use strict"});function _u(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var hu,ey=E(()=>{"use strict";hu="daemon:events"});function ry(t){return{kind:"prompt",prompt_id:t.prompt_id??jt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function gu(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 ty,wu=E(()=>{"use strict";fu();ty="prompt:root"});function rs(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(sy(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function CC(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(sy(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function ny(t,e=60){if(typeof t!="string"||t==="")return!0;let r=CC(t);return r===null?!0:Date.now()/1e3>=r-e}function sy(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var yu=E(()=>{"use strict"});async function Pi(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":MC},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var MC,Eu=E(()=>{"use strict";MC="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as oy,mkdirSync as iy,readFileSync as ay,writeFileSync as ly}from"node:fs";import{homedir as cy}from"node:os";import{dirname as uy,join as dy}from"node:path";function ns(){return process.env.LMCTL_DEVICE_AUTH_PATH??dy(cy(),".lmctl","device-auth.json")}function fy(){return process.env.LMCTL_TOKEN_PATH??dy(cy(),".lmctl","cli-tokens.json")}function bu(t=ns()){try{let e=JSON.parse(ay(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 my(t,e=ns()){iy(uy(e),{recursive:!0,mode:448}),ly(e,JSON.stringify(t,null,2));try{oy(e,384)}catch{}}function Tu(t,e=fy()){let r={};try{r=JSON.parse(ay(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};iy(uy(e),{recursive:!0,mode:448}),ly(e,JSON.stringify(s,null,2));try{oy(e,384)}catch{}}async function py(t){let e=t.deviceAuthPath??ns(),r=bu(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Pi({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Tu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??fy()),{idToken:n.idToken,userId:r.userId}}var Su=E(()=>{"use strict";Eu()});function hy(t){if(t.length===0||!t.startsWith("---"))throw new ft("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1646
+ `);if(e[0]!=="---")throw new ft("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new ft(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!DC.has(c))throw new ft(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Fi.join(", ")}`);r[c]=u}if(n===-1)throw new ft("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Fi)if(r[i]===void 0)throw new ft(`missing required frontmatter key "${i}" \u2014 required: ${Fi.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var Fi,DC,ft,_y=E(()=>{"use strict";Fi=["title","description","members"],DC=new Set(Fi),ft=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as PC,writeFileSync as z3,renameSync as Z3,existsSync as Ey,realpathSync as ku,statSync as FC}from"node:fs";import{basename as by,resolve as Yt,dirname as vu}from"node:path";function BC(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function qC(t){return/^\s*_MEMBER_\s+\S/.test(t)}function HC(t){return/^\s*_SESSION_\s+\S/.test(t)}function JC(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function XC(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function $u(t){let e=by(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Ne(t){let e=PC(t,"utf-8"),r=vu(Yt(t)),n=Nu(e,$u(t),{baseDir:r,sourcePath:Yt(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Yt(r,s.sessiondir));return n}function GC(t,e){let r={},n=[],s=t.replace(/^\s*_CONNECT_\s*/,""),o=0;function i(a){return s.slice(a).trim().split(/\s+/u)[0]??""}for(;o<s.length;){for(;o<s.length&&/\s/u.test(s[o]);)o+=1;if(o>=s.length)break;let a=o,l=/^[A-Za-z_][A-Za-z0-9_]*/u.exec(s.slice(o));if(l===null){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}let c=l[0];if(o+=c.length,s[o]!=="="){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}o+=1;let u="";if(s[o]==='"'){o+=1;let d=o;for(;o<s.length&&s[o]!=='"';)o+=1;if(o>=s.length){n.push(`line ${e}: unterminated quoted value for "${c}" on _CONNECT_ line: ${t.trim()}`);break}if(u=s.slice(d,o),o+=1,o<s.length&&!/\s/u.test(s[o])){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}}else{let d=o;for(;o<s.length&&!/\s/u.test(s[o]);)o+=1;u=s.slice(d,o)}if(!wy.includes(c)){n.push(`line ${e}: unknown key "${c}" on _CONNECT_ line: ${t.trim()}
1647
+ allowed keys: ${wy.join(", ")}`);continue}if(Object.prototype.hasOwnProperty.call(r,c)){n.push(`line ${e}: duplicate key "${c}" on _CONNECT_ line: ${t.trim()}`);continue}r[c]=u}return{kvs:r,errors:n}}function Nu(t,e,r={}){let n=[],s=[],o=[],i=[],a=new Set,l=r.baseDir??WC,c;if(r.sourcePath!==void 0)try{c=ku(r.sourcePath)}catch{c=void 0}let u=t;if(u.startsWith("#teamfile:")){let m=u.indexOf(`
1648
+ `);u=m>=0?u.slice(m+1):""}let d=null;if(u.startsWith("---"))try{d=hy(u)}catch(m){if(m instanceof ft)i.push(`frontmatter: ${m.message}`);else throw m}let f=t.split(`
1649
+ `);for(let m=0;m<f.length;m++){let p=f[m],h=m+1;if(HC(p))throw new Error(`line ${h}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${p.trim()})`);if(JC(p)){let{kvs:S,errors:I}=GC(p,h);if(i.push(...I),I.length>0)continue;let v=S.alias,k=S.teamfile;if(v||i.push(`line ${h}: _CONNECT_ missing alias: ${p.trim()}`),k||i.push(`line ${h}: _CONNECT_ missing teamfile: ${p.trim()}`),!v||!k)continue;let R=Yt(l,k);try{let L=ku(R);if(c!==void 0&&L===c){i.push(`line ${h}: ${Ui}`);continue}let B=`${v}\0${L}`;if(a.has(B)){i.push(`line ${h}: duplicate _CONNECT_ alias "${v}" for teamfile "${k}"`);continue}a.add(B),s.push({alias:v,teamfile:L})}catch(L){i.push(`line ${h}: _CONNECT_ teamfile missing/unreadable: ${R}: ${L instanceof Error?L.message:String(L)}`)}continue}if(XC(p)){let S=p.replace(/^\s*_SKILL_\s*/,"").trim(),I=S.length===0?[]:S.split(/\s+/u);if(I.length!==1){i.push(`line ${h}: _SKILL_ requires exactly one https:// URL or local path: ${p.trim()}`);continue}let v=I[0];try{if(new URL(v).protocol!=="https:"){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${v}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(v)&&!/^[A-Za-z]:[\\/]/u.test(v)){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${v}`);continue}}o.push(v);continue}if(!qC(p))continue;let g=BC(p);for(let S of Object.keys(g))if(!gy.includes(S))throw new Error(`line ${h}: unknown key "${S}" on _MEMBER_ line: ${p.trim()}
1650
+ allowed keys: ${gy.join(", ")}`);if(!g.provider&&!g.teamfile){i.push(`line ${h}: member line missing provider (or teamfile): ${p.trim()}`);continue}let T={alias:g.alias||`member${n.length+1}`,provider:g.provider||"",extra:{}};g.sessionid&&(T.session=g.sessionid),g.sessiondir&&(T.sessiondir=g.sessiondir),g.teamfile&&(T.teamfile=g.teamfile),g.model&&(T.model=g.model),n.push(T)}return{name:e,members:n,connections:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:d}}function xu(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===Iu.toLowerCase());n.length>1&&r.push({field:Iu,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?Yt(e,o.teamfile):Yt(o.teamfile);if(!Ey(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Ne(a),c=mt(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else UC.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function mt(t){return t.members.find(e=>e.alias.toLowerCase()===Iu.toLowerCase())}function ju(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=Yt(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!Ey(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Ne(o),l=mt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return ju(l,vu(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||vu(o),alias:t.alias,resolvedFrom:o,model:l.model}}function yy(t){let e;try{e=ku(t)}catch(n){throw new Error(`connect target missing/unreadable: ${t}: ${n instanceof Error?n.message:String(n)}`)}let r=FC(e);return{path:e,key:`${r.dev}:${r.ino}`}}function VC(t){return t.map(e=>by(e)).join(" -> ")}function KC(t){let e=new Map;for(let i of t){let a=e.get(i.from.key)??[];a.push(i),e.set(i.from.key,a)}let r=new Set,n=new Set,s=[];function o(i){if(r.has(i.key)){let a=s.findIndex(c=>c.key===i.key),l=a>=0?s.slice(a).map(c=>c.path):[i.path];return l.push(i.path),l}if(n.has(i.key))return null;r.add(i.key),s.push(i);for(let a of e.get(i.key)??[]){let l=o(a.to);if(l!==null)return l}return s.pop(),r.delete(i.key),n.add(i.key),null}for(let i of t){let a=o(i.from);if(a!==null)return a}return null}function Tr(t){let e=yy(Yt(t)),r=new Map,n=new Map,s=[];function o(a,l){if(r.has(a.key))return;r.set(a.key,a);let c;try{c=Ne(a.path)}catch(d){throw new Error(`connect parse error in ${a.path}: ${d instanceof Error?d.message:String(d)}`)}if(c.parseErrors.length>0){let d=c.parseErrors.find(f=>f.includes("_CONNECT_ teamfile missing/unreadable"));throw d!==void 0?new Error(`${a.path}: ${d}`):new Error(`connect parse error in ${a.path}: ${c.parseErrors.join("; ")}`)}let u=[];n.set(a.key,{source_teamfile:a.path,connections:u});for(let d of c.connections){let f=yy(d.teamfile);if(f.key===a.key)throw new Error(Ui);let m;try{m=Ne(f.path)}catch(p){throw new Error(`connect target missing/unreadable: ${d.alias} -> ${f.path}: ${p instanceof Error?p.message:String(p)}`)}if(m.parseErrors.length>0)throw new Error(`connect target invalid: ${d.alias} -> ${f.path}: ${m.parseErrors.join("; ")}`);if(ss(m,d.alias)===void 0)throw new Error(`connect target has no member alias "${d.alias}": ${f.path}`);s.push({from:a,to:f,alias:d.alias}),u.push({target_name:d.alias,target_teamfile:f.path}),!l.has(f.key)&&o(f,new Set([...l,f.key]))}}o(e,new Set([e.key]));let i=KC(s);if(i!==null)throw new Error(`connect cycle: ${VC(i)}`);return{root_teamfile:e.path,snapshots:[...n.values()],edges:s}}function ss(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Iu,Ui,UC,WC,gy,wy,At=E(()=>{"use strict";_y();Iu="Lead",Ui="_CONNECT_ cannot target its own team (self-edge); intra-team members are connected implicitly via _MEMBER_",UC=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]),WC=process.cwd();gy=["alias","provider","sessionid","sessiondir","teamfile","model"],wy=["alias","teamfile"]});import{existsSync as YC,realpathSync as zC}from"node:fs";import{dirname as ZC}from"node:path";function Au(t){QC(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function QC(t){let e=t.payload.root_teamfile;try{e=zC(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await ln(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await ln(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=eM(e);if("error"in r)return await ln(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-nM(t.env??process.env)).toISOString()});if(!s.acquired){let o=rM(r.alias,s.current);return await ln(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??ur)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await ln(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await ln(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function eM(t){if(!YC(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Ne(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=mt(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??ZC(t)}}async function ln(t,e){let r=ky(e.message),n=e.response===null?null:ky(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function ky(t){return t.length<=Ty?{text:t,truncated:!1}:{text:t.slice(0,Ty),truncated:!0}}function tM(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function rM(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:tM(t,e)}function nM(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Sy;let r=Number(e);return!Number.isFinite(r)||r<=0?Sy:r}var Ty,Sy,vy=E(()=>{"use strict";St();At();Ty=256*1024,Sy=30*60*1e3});import{chmodSync as Ay,existsSync as sM,mkdirSync as Ry,readFileSync as Hi,writeFileSync as Oy}from"node:fs";import{dirname as Ru,resolve as Wi,join as Ly}from"node:path";import{fileURLToPath as oM}from"node:url";import{homedir as Cy}from"node:os";import{CognitoIdentityClient as iM,GetIdCommand as aM}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Iy}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as lM,ListObjectsV2Command as cM,PutObjectCommand as uM,S3Client as $y}from"@aws-sdk/client-s3";function is(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:hM(t.selfUrl),n={},s;for(let v of r)if(sM(v)){n=pM(v),s=v;break}let o=(...v)=>{for(let k of v)if(typeof k=="string"&&k!=="")return k},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??dM,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??fM,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??mM,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ji,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=qi(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=qi(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=qi(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=qi(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),S=o(e.LMCTL_MAILBOX_KEY),I=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...S!==void 0?{mailboxKey:S}:{},...I!==void 0?{tokenPath:I}:{}},f}function pM(t){try{let e=Hi(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function hM(t){let e=Ru(oM(t??import.meta.url));return[Wi(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Wi(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Wi(e,"..","..","..","infra","terraform","terraform.tfstate"),Wi(e,"..","..","infra","terraform","terraform.tfstate")]}function qi(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function _M(t){let e=gM(t.intervalMs)??My,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function gM(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Dy(t){let e=t.tokenPath??Ly(Cy(),".lmctl","cli-tokens.json"),r=xy(t.tokenPath);if(ny(r.cognito?.idToken)&&bu()!==null)try{await py({region:t.region,clientId:t.cognitoClientId??Ji,cliTokensPath:e}),r=xy(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let H=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await jy({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=Iy({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new $y({region:t.region,credentials:a}),c={ListObjectsV2Command:cM,GetObjectCommand:lM,PutObjectCommand:uM},u=rs(n),d=u??o,f=t.deviceId,m=rn({identityId:o,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 H=!1,me=0;for(;!H&&me<2;){me+=1;try{let $=gi(m,"web"),N=0,O;do{let q=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:$,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of q.Contents??[]){let C=wi(F.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}O=q.IsTruncated===!0?q.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),H=!0}catch($){let N=$ instanceof Error?$.message:String($);if(i&&me===1&&EM($)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),yM(e),i=!1,o=await jy({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=Iy({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new $y({region:t.region,credentials:a}),m=rn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,S=t.promptTriggerStore,I=new Mi,v=new br({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>I.record(x),onMessage:async x=>{if(_!==void 0&&mu(x.payload)){_.onInbound(x.payload);return}if(T!==void 0&&pu(x.payload)){await T.onInbound(x.payload);return}if(!_u(x.payload)){if(S!==void 0&&gu(x.payload)){Au({store:S,payload:x.payload,log:t.log});return}g!==null&&await g.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}:{}});g=new ts({client:v,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async x=>v.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),T!==void 0&&T.setPublish(async x=>v.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let k=x=>v.putMessage({conversation_id:hu,payload:x});v.start();let R=t.chatLogTailStore===void 0?void 0:_M({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??My,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let L=t.deviceId??o,B=`${d}/usage/`,ee;return ee=t.usageStore===void 0?void 0:Vw({meter:I,store:t.usageStore,userId:d,deviceId:L,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:H,ceilingUsd:me})=>{t.log?.(`[usage] month ${x} cost $${H.toFixed(4)} >= ceiling $${me} \u2014 blocking mailbox`),v.stop().catch(()=>{}),ee?.stop()},publishOwnRollup:async(x,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${B}${L}-${x}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let H={put:0,get:0,list:0},me;do{let $=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:B,MaxKeys:1e3,...me!==void 0?{ContinuationToken:me}:{}}));for(let N of $.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${x}.json`))try{let q=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(q.Body===void 0)continue;let F=JSON.parse(await q.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}me=$.IsTruncated===!0?$.NextContinuationToken:void 0}while(me!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:v,fetchClient:g,publishDaemonEvent:k,async stop(){R?.stop(),ee!==void 0&&(await ee.flushNow().catch(()=>{}),ee.stop()),await g.stop().catch(()=>{}),await v.stop().catch(()=>{})}}}async function Py(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Ci(t.rootDir),r=rn({identityId:os,userId:os,deviceId:Ny}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new br({bucket:"local",identityId:os,userId:os,deviceId:Ny,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&mu(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&pu(c.payload)){await o.onInbound(c.payload);return}if(!_u(c.payload)){if(i!==void 0&&gu(c.payload)){Au({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Bi,readIntervalMs:t.readIntervalMs??Bi,heartbeatIdleMs:t.heartbeatIdleMs??Bi,backoffReadIntervalMs:t.backoffReadIntervalMs??Bi});n=new ts({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:hu,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:os,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function xy(t){let e=t??Ly(Cy(),".lmctl","cli-tokens.json");try{let r=Hi(e,"utf8");return JSON.parse(r)}catch{return{}}}function wM(t,e){if(e===void 0||e==="")return;let r={};try{let s=Hi(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};Ry(Ru(t),{recursive:!0,mode:448}),Oy(t,JSON.stringify(n,null,2));try{Ay(t,384)}catch{}}function yM(t){let e={};try{let n=Hi(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,Ry(Ru(t),{recursive:!0,mode:448}),Oy(t,JSON.stringify(r,null,2));try{Ay(t,384)}catch{}}async function jy(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new iM({region:t.region}).send(new aM({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{wM(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function EM(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var My,Bi,Ji,dM,fM,mM,os,Ny,Ou=E(()=>{"use strict";Ti();lu();du();Kw();zw();Zw();Qw();ey();wu();yi();yu();Su();vy();My=3e3,Bi=1e3,Ji="79u5jhkk46qofog661c9i0bdcs",dM="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",fM="us-east-1_4iUdFggDn",mM="lmctl-next-preview-mailbox-254332045686";os="local",Ny="local"});import{spawn as Du}from"node:child_process";import{createInterface as Fy}from"node:readline";var Lu,Cu,Mu,Uy,Wy=E(()=>{"use strict";Ra();Je();Lu=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=Du(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=Fy({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1651
1651
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1652
- `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},Lu=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Mu(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
1652
+ `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},Cu=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Du(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
1653
1653
  `);this.buffer=i.pop()??"";for(let a of i)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),n}async sendTurn(e){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(n+`
1654
- `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let o=r.message?.content;if(Array.isArray(o))for(let i of o)i.type==="text"&&typeof i.text=="string"&&i.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:i.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let o of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(o);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Cu=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,r){this.ctx=r;let n=e.cwd??process.cwd();if(e.provider==="opencode")try{Fs(n)}catch(a){te({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Mu(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=Dy({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let i=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof i?.sessionId=="string"?i.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:i}}),s}async sendTurn(e){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:e}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1654
+ `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let o=r.message?.content;if(Array.isArray(o))for(let i of o)i.type==="text"&&typeof i.text=="string"&&i.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:i.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let o of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(o);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Mu=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,r){this.ctx=r;let n=e.cwd??process.cwd();if(e.provider==="opencode")try{Fs(n)}catch(a){te({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Du(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=Fy({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let i=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof i?.sessionId=="string"?i.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:i}}),s}async sendTurn(e){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:e}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1655
1655
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1656
1656
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let o=r.error,i=typeof o?.message=="string"&&o.message!==""?o.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${i}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
1657
- `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},Py=t=>{switch(t){case"codex":return new Ou;case"claude":case"qwen":return new Lu;case"gemini":case"copilot":case"opencode":return new Cu;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as bM}from"node:crypto";import{existsSync as CV,mkdirSync as TM,readFileSync as SM,writeFileSync as kM}from"node:fs";import{homedir as vM}from"node:os";import{dirname as IM,join as $M}from"node:path";function Xi(){return process.env.LMCTL_DEVICE_FILE??$M(vM(),".lmctl","device.json")}function Sr(t=Xi()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(SM(t,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function Du(t=Xi()){let e=Sr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:bM(),created_at:new Date().toISOString()};return TM(IM(t),{recursive:!0}),kM(t,`${JSON.stringify(r,null,2)}
1658
- `,{encoding:"utf8",mode:384}),r}var Pu=E(()=>{"use strict"});import*as Uy from"node:child_process";function xM(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function Fu(t,e={}){let r=e.spawnSync===void 0&&process.env[jM]==="1",n=e.spawnSync??Uy.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Gi[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=xM(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function Wy(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Gi).join(", ")})`;let e=NM[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var Gi,NM,jM,By=E(()=>{"use strict";Gi={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},NM={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};jM="LMCTL_SKIP_BINARY_CHECK"});var Zy={};ie(Zy,{ProviderBinaryPreflightError:()=>Vi,__setProviderBinaryCheckForTest:()=>UM,bootstrapAgentRestMailbox:()=>Jy,publishRegisteredWorkflowsOnStart:()=>Hy,resolveLocalMailboxDir:()=>Yy,resolveLocalWebuiDir:()=>Ky,resolveServeConfig:()=>Xy,runProviderBinaryPreflight:()=>Vy,runServe:()=>MM,validateServeArgs:()=>zy});import{randomBytes as AM}from"node:crypto";import{existsSync as RM}from"node:fs";import{homedir as OM}from"node:os";import{isAbsolute as qy,resolve as Uu}from"node:path";import{serve as LM}from"@hono/node-server";async function MM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(CM),0;let r=zy(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1659
- `),2;try{Vy(e)}catch(T){return 1}let n=pe({path:de()}),s={portCli:WM(t)},o;try{o=Xy({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(T){return n.close(),e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
1660
- `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Mw(n);let i;if(r.localWebui!==void 0){let T=Ky(r.localWebui.dir,process.env);if(T===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let S=Yy(process.env),{s3:I,commands:v}=Ci(S);i={webuiDir:T,rootDir:S,s3:I,commands:v},e.stdout.write(`local webui: serving SPA from ${T}; mailbox store ${S}
1661
- `)}let a=r.noDaemon?void 0:Lw({dal:n,intervalMs:es()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:is({env:process.env});l.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${l.missing.join(", ")}; running without cloud sync`+(l.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${l.tfstateCandidatesChecked.length} candidate path${l.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${l.tfstatePathUsed} did not supply the missing fields)`)+`
1657
+ `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},Uy=t=>{switch(t){case"codex":return new Lu;case"claude":case"qwen":return new Cu;case"gemini":case"copilot":case"opencode":return new Mu;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as bM}from"node:crypto";import{existsSync as CV,mkdirSync as TM,readFileSync as SM,writeFileSync as kM}from"node:fs";import{homedir as vM}from"node:os";import{dirname as IM,join as $M}from"node:path";function Xi(){return process.env.LMCTL_DEVICE_FILE??$M(vM(),".lmctl","device.json")}function Sr(t=Xi()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(SM(t,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function Pu(t=Xi()){let e=Sr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:bM(),created_at:new Date().toISOString()};return TM(IM(t),{recursive:!0}),kM(t,`${JSON.stringify(r,null,2)}
1658
+ `,{encoding:"utf8",mode:384}),r}var Fu=E(()=>{"use strict"});import*as By from"node:child_process";function xM(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function Uu(t,e={}){let r=e.spawnSync===void 0&&process.env[jM]==="1",n=e.spawnSync??By.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Gi[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=xM(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function qy(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Gi).join(", ")})`;let e=NM[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var Gi,NM,jM,Hy=E(()=>{"use strict";Gi={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},NM={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};jM="LMCTL_SKIP_BINARY_CHECK"});var eE={};ie(eE,{ProviderBinaryPreflightError:()=>Vi,__setProviderBinaryCheckForTest:()=>UM,bootstrapAgentRestMailbox:()=>Gy,publishRegisteredWorkflowsOnStart:()=>Xy,resolveLocalMailboxDir:()=>Zy,resolveLocalWebuiDir:()=>zy,resolveServeConfig:()=>Vy,runProviderBinaryPreflight:()=>Yy,runServe:()=>MM,validateServeArgs:()=>Qy});import{randomBytes as AM}from"node:crypto";import{existsSync as RM}from"node:fs";import{homedir as OM}from"node:os";import{isAbsolute as Jy,resolve as Wu}from"node:path";import{serve as LM}from"@hono/node-server";async function MM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(CM),0;let r=Qy(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1659
+ `),2;try{Yy(e)}catch(T){return 1}let n=pe({path:de()}),s={portCli:WM(t)},o;try{o=Vy({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(T){return n.close(),e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
1660
+ `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Pw(n);let i;if(r.localWebui!==void 0){let T=zy(r.localWebui.dir,process.env);if(T===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let S=Zy(process.env),{s3:I,commands:v}=Ci(S);i={webuiDir:T,rootDir:S,s3:I,commands:v},e.stdout.write(`local webui: serving SPA from ${T}; mailbox store ${S}
1661
+ `)}let a=r.noDaemon?void 0:Mw({dal:n,intervalMs:es()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:is({env:process.env});l.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${l.missing.join(", ")}; running without cloud sync`+(l.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${l.tfstateCandidatesChecked.length} candidate path${l.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${l.tfstatePathUsed} did not supply the missing fields)`)+`
1662
1662
  `);let c=await FM({log:T=>e.stderr.write(`${T}
1663
- `)}),u=new $i({adapterFactory:Py,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:T=>e.stderr.write(`${T}
1664
- `)}),d=Sr()?.device_id,f=vw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:DM(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await Jy({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await Hy({dal:n,mailbox:g.mailbox,io:e});let _=LM({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1665
- `),await new Promise(T=>{let S=()=>{(async()=>(a!==void 0&&await a.stop(),_.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),T()))()};process.once("SIGTERM",S),process.once("SIGINT",S)}),0}function DM(t,e){return{identityPoolId:t.identityPoolId,cognitoUserPoolId:t.cognitoUserPoolId,cognitoRegion:t.region,mailboxBucket:t.mailboxBucket,workspaceFetchMode:"mailbox",...e!==void 0?{deviceId:e}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},mailboxPolling:{...t.readIntervalMs!==void 0?{readIntervalSeconds:t.readIntervalMs/1e3}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:t.heartbeatIdleMs/1e3}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:t.backoffReadIntervalMs/1e3}:{}}}}async function Hy(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
1666
- `)}}async function Jy(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await My({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
1667
- `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await Cy({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
1668
- `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(mh({app:t.app,log:r=>t.io?.stderr.write(`${r}
1663
+ `)}),u=new $i({adapterFactory:Uy,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:T=>e.stderr.write(`${T}
1664
+ `)}),d=Sr()?.device_id,f=$w({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:DM(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await Gy({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await Xy({dal:n,mailbox:g.mailbox,io:e});let _=LM({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1665
+ `),await new Promise(T=>{let S=()=>{(async()=>(a!==void 0&&await a.stop(),_.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),T()))()};process.once("SIGTERM",S),process.once("SIGINT",S)}),0}function DM(t,e){return{identityPoolId:t.identityPoolId,cognitoUserPoolId:t.cognitoUserPoolId,cognitoRegion:t.region,mailboxBucket:t.mailboxBucket,workspaceFetchMode:"mailbox",...e!==void 0?{deviceId:e}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},mailboxPolling:{...t.readIntervalMs!==void 0?{readIntervalSeconds:t.readIntervalMs/1e3}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:t.heartbeatIdleMs/1e3}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:t.backoffReadIntervalMs/1e3}:{}}}}async function Xy(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
1666
+ `)}}async function Gy(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await Py({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
1667
+ `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await Dy({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
1668
+ `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(hh({app:t.app,log:r=>t.io?.stderr.write(`${r}
1669
1669
  `)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
1670
1670
  `)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
1671
- `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function Xy(t){let{dal:e,cli:r,env:n,parsed:s,io:o}=t,i=[],a,l=e.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,i.push("api.port")}else a=s.port;let c,u=e.getConfig("api.token");u!==null?c=u:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,i.push("api.token")):(c=AM(32).toString("hex"),e.setConfig("api.token",c),o.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let d,f=e.getConfig("api.url");f!==null?d=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(d=n.LMCTL_API_URL,i.push("api.url")):(d=`http://127.0.0.1:${a}`,e.setConfig("api.url",d));for(let m of i)o.stderr.write(`note: ${PM(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
1672
- `);return{port:a,apiUrl:d,apiToken:c}}function PM(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 FM(t){let e;try{e=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new Ii({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 UM(t){Gy=t??Fu}function Vy(t){let e=Object.keys(Gi),r=Gy(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${Wy(o)}
1671
+ `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function Vy(t){let{dal:e,cli:r,env:n,parsed:s,io:o}=t,i=[],a,l=e.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,i.push("api.port")}else a=s.port;let c,u=e.getConfig("api.token");u!==null?c=u:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,i.push("api.token")):(c=AM(32).toString("hex"),e.setConfig("api.token",c),o.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let d,f=e.getConfig("api.url");f!==null?d=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(d=n.LMCTL_API_URL,i.push("api.url")):(d=`http://127.0.0.1:${a}`,e.setConfig("api.url",d));for(let m of i)o.stderr.write(`note: ${PM(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
1672
+ `);return{port:a,apiUrl:d,apiToken:c}}function PM(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 FM(t){let e;try{e=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new Ii({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 UM(t){Ky=t??Uu}function Yy(t){let e=Object.keys(Gi),r=Ky(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${qy(o)}
1673
1673
  `);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
1674
1674
  `),new Vi(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
1675
- `)}function Ky(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=qy(r)?r:Uu(process.cwd(),r);return RM(`${n}/index.html`)?n:null}function Yy(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?qy(e)?e:Uu(process.cwd(),e):Uu(OM(),".lmctl","local-mailbox")}function WM(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function zy(t,e=process.env){let r=BM(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function BM(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var CM,Vi,Gy,Qy=E(()=>{"use strict";Ce();Nw();nu();Dw();lc();Ru();au();Gc();Vc();Fy();Pu();By();qe();CM=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1675
+ `)}function zy(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=Jy(r)?r:Wu(process.cwd(),r);return RM(`${n}/index.html`)?n:null}function Zy(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?Jy(e)?e:Wu(process.cwd(),e):Wu(OM(),".lmctl","local-mailbox")}function WM(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function Qy(t,e=process.env){let r=BM(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function BM(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var CM,Vi,Ky,tE=E(()=>{"use strict";Ce();jw();su();Fw();cc();Ou();lu();Vc();Kc();Wy();Fu();Hy();qe();CM=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1676
1676
 
1677
1677
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
1678
1678
  services. Help exits before any port binding or daemon startup.
@@ -1682,20 +1682,20 @@ services. Help exits before any port binding or daemon startup.
1682
1682
  against the local filesystem (no S3, no Cognito) with a fixed
1683
1683
  local identity. Mailbox store defaults to
1684
1684
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
1685
- `;Vi=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},Gy=Fu});var eE={};ie(eE,{runIntake:()=>HM});async function HM(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(qM),0):r==="scan"?JM(n,e):r==="config"?XM(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1686
- `),1)}async function JM(t,e){let r=P(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=j(r,"--project");return J(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await ic({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await Yr(s)),0})}async function XM(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=P(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=j(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=j(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=j(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return J(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return W(e,d),0})}var qM,tE=E(()=>{"use strict";Ko();Se();qM=`usage: lmctl intake <scan|config> ...
1685
+ `;Vi=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},Ky=Uu});var rE={};ie(rE,{runIntake:()=>HM});async function HM(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(qM),0):r==="scan"?JM(n,e):r==="config"?XM(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1686
+ `),1)}async function JM(t,e){let r=P(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=j(r,"--project");return J(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await ac({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await Yr(s)),0})}async function XM(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=P(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=j(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=j(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=j(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return J(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return W(e,d),0})}var qM,nE=E(()=>{"use strict";Ko();Se();qM=`usage: lmctl intake <scan|config> ...
1687
1687
 
1688
1688
  Scan configured project GitHub issues into lmctl, or update per-project
1689
1689
  intake settings such as enabled state, labels, and issue state filters.
1690
- `});import{createHash as GM}from"node:crypto";import{existsSync as as,mkdirSync as VM,readFileSync as nE,realpathSync as KM,writeFileSync as YM}from"node:fs";import{dirname as sE,resolve as oE}from"node:path";function kr(t){let e=oE(t);return as(e)?KM(e):e}function rE(t,e){let r=sE(e),n=$u(t,Iu(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=oE(r,s.sessiondir));return n}function ls(t,e){let r=kr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!as(r)&&"upsertRootTeam"in e&&(VM(sE(r),{recursive:!0}),YM(r,n.raw_text,"utf8")),rE(n.raw_text,r);if(as(r)){let s=nE(r,"utf8"),o=rE(s,r);return"upsertRootTeam"in e&&ZM(o)&&QM(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!as(r))throw new Error(`teamfile not found: ${t}`);return Ne(r)}function iE(t,e,r){let n=kr(t),s=e.getRootTeam(n);s===null||!as(n)||nE(n,"utf8")===s.raw_text||r(`warning: ${n} differs from the last seeded DB snapshot; runtime is using the seeded snapshot. Run: lmctl seed ${n}`)}function ZM(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=zM)}function QM(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:GM("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o);try{let i=Tr(e);for(let a of i.snapshots){let l=a.connections.map(c=>({target_name:c.target_name,target_teamfile:c.target_teamfile,created_at:s}));t.replaceTeamConnections(a.source_teamfile,l)}}catch{}}var zM,Ki=E(()=>{"use strict";At();zM=5});import{existsSync as eD}from"node:fs";import{dirname as aE}from"node:path";function nD(t){return tD.test(t)||rD.test(t)}function lE(t){return Yi.test(t)}function Wu(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Yi.test(n)?null:{teamfile:r,alias:n}}function Rt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!lE(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Yi.source}).`);let n=kr(t);if(r===void 0&&!eD(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=ls(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=ss(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1691
- Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=xu(o,aE(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,...i.model??o.model?{model:i.model??o.model}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
1692
- Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??aE(n),...o.model!==void 0?{model:o.model}:{}}}function zt(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=Wu(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?lE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Yi.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1690
+ `});import{createHash as GM}from"node:crypto";import{existsSync as as,mkdirSync as VM,readFileSync as oE,realpathSync as KM,writeFileSync as YM}from"node:fs";import{dirname as iE,resolve as aE}from"node:path";function kr(t){let e=aE(t);return as(e)?KM(e):e}function sE(t,e){let r=iE(e),n=Nu(t,$u(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=aE(r,s.sessiondir));return n}function ls(t,e){let r=kr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!as(r)&&"upsertRootTeam"in e&&(VM(iE(r),{recursive:!0}),YM(r,n.raw_text,"utf8")),sE(n.raw_text,r);if(as(r)){let s=oE(r,"utf8"),o=sE(s,r);return"upsertRootTeam"in e&&ZM(o)&&QM(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!as(r))throw new Error(`teamfile not found: ${t}`);return Ne(r)}function lE(t,e,r){let n=kr(t),s=e.getRootTeam(n);s===null||!as(n)||oE(n,"utf8")===s.raw_text||r(`warning: ${n} differs from the last seeded DB snapshot; runtime is using the seeded snapshot. Run: lmctl seed ${n}`)}function ZM(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=zM)}function QM(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:GM("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o);try{let i=Tr(e);for(let a of i.snapshots){let l=a.connections.map(c=>({target_name:c.target_name,target_teamfile:c.target_teamfile,created_at:s}));t.replaceTeamConnections(a.source_teamfile,l)}}catch{}}var zM,Ki=E(()=>{"use strict";At();zM=5});import{existsSync as eD}from"node:fs";import{dirname as cE}from"node:path";function nD(t){return tD.test(t)||rD.test(t)}function uE(t){return Yi.test(t)}function Bu(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Yi.test(n)?null:{teamfile:r,alias:n}}function Rt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!uE(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Yi.source}).`);let n=kr(t);if(r===void 0&&!eD(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=ls(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=ss(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1691
+ Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=ju(o,cE(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,...i.model??o.model?{model:i.model??o.model}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
1692
+ Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??cE(n),...o.model!==void 0?{model:o.model}:{}}}function zt(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=Bu(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?uE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Yi.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1693
1693
  Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(nD(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: "${r}" is a bare sessionid, but ${t.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:r};return s.provider!==void 0&&(a.provider=s.provider),a}return n!==void 0?{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
1694
1694
  Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${t.name}: can't infer target type from "${r}".
1695
1695
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
1696
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,tD,rD,Yi,cs=E(()=>{"use strict";At();Ki();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},tD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,rD=/^ses_[A-Za-z0-9_-]+$/,Yi=/^[A-Za-z][A-Za-z0-9_-]*$/});function dE(t){let e=cE(t.registry,t.fromTeamfile);if(e===void 0)return vr(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!uE(e,t.fromAlias))return vr(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=cE(t.registry,t.toTeamfile);if(r===void 0)return vr(`target team is not registered in policy graph: ${t.toTeamfile}`);if(!uE(r,t.toAlias))return vr(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`);if(t.toTeamfile===t.fromTeamfile)return{allowed:!0,outOfPolicy:!1,reason:"same team"};if(e.leadAlias===null)return vr(`sender team has no Lead: ${t.fromTeamfile}`);if(t.fromAlias!==e.leadAlias)return vr(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`);let n=t.registry.connections.find(s=>s.sourceTeamfile===t.fromTeamfile&&s.targetTeamfile===t.toTeamfile&&s.targetName===t.toAlias);return n===void 0?vr(`target alias is not connected from sender team: ${t.fromTeamfile} -> ${t.toTeamfile}:${t.toAlias}`):{allowed:!0,outOfPolicy:!1,reason:`connected target alias ${n.targetName}`}}function cE(t,e){return t.teams.find(r=>r.teamfile===e)}function uE(t,e){return t.aliases.some(r=>r===e)}function vr(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var fE=E(()=>{"use strict"});var yE={};ie(yE,{agentInflightTtlMsFromEnv:()=>gE,parseIdleTimeoutMs:()=>wE,runChat:()=>oD});async function oD(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${hE}
1696
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,tD,rD,Yi,cs=E(()=>{"use strict";At();Ki();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},tD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,rD=/^ses_[A-Za-z0-9_-]+$/,Yi=/^[A-Za-z][A-Za-z0-9_-]*$/});function mE(t){let e=dE(t.registry,t.fromTeamfile);if(e===void 0)return vr(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!fE(e,t.fromAlias))return vr(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=dE(t.registry,t.toTeamfile);if(r===void 0)return vr(`target team is not registered in policy graph: ${t.toTeamfile}`);if(!fE(r,t.toAlias))return vr(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`);if(t.toTeamfile===t.fromTeamfile)return{allowed:!0,outOfPolicy:!1,reason:"same team"};if(e.leadAlias===null)return vr(`sender team has no Lead: ${t.fromTeamfile}`);if(t.fromAlias!==e.leadAlias)return vr(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`);let n=t.registry.connections.find(s=>s.sourceTeamfile===t.fromTeamfile&&s.targetTeamfile===t.toTeamfile&&s.targetName===t.toAlias);return n===void 0?vr(`target alias is not connected from sender team: ${t.fromTeamfile} -> ${t.toTeamfile}:${t.toAlias}`):{allowed:!0,outOfPolicy:!1,reason:`connected target alias ${n.targetName}`}}function dE(t,e){return t.teams.find(r=>r.teamfile===e)}function fE(t,e){return t.aliases.some(r=>r===e)}function vr(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var pE=E(()=>{"use strict"});var bE={};ie(bE,{agentInflightTtlMsFromEnv:()=>yE,parseIdleTimeoutMs:()=>EE,runChat:()=>oD});async function oD(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${gE}
1697
1697
  `),t.length===0?2:0;let r=iD(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1698
- ${hE}
1698
+ ${gE}
1699
1699
  `),2;if(r.runFlag!==void 0){let l=Number.parseInt(r.runFlag,10);return!Number.isFinite(l)||l<=0||String(l)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
1700
1700
  `),2):await J(e,async c=>{let u=c.getRun(l);if(u===null)return e.stderr.write(`error: run ${l}: not found
1701
1701
  `),1;if(u.terminal_state!==null&&u.terminal_state.length>0)return w(e,`run ${l}: already terminal (${u.terminal_state}); chat --run cannot resume a terminated run`);let d=Ni(c,l);if(d===null)return e.stderr.write(`error: run ${l}: no pending operator-answerable attention (chat --run only resumes paused runs)
@@ -1710,21 +1710,21 @@ ${hE}
1710
1710
  `),2;if(n.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
1711
1711
  `),2;let s,o=null,i=null;if(n.mode==="ai-team"){if(n.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
1712
1712
  `),2;let l=n.alias;try{let c=await J(e,h=>Rt(n.teamfile,l,h)),u=c.teamfile,d=await J(e,h=>aD(r.fromFlag,u,h)),f=await lD(e,{explicitRoot:r.rootFlag,sender:d,receiverTeamfile:u,operatorOrigin:r.fromFlag===void 0}),m=r.fromFlag===void 0?null:await fD(e,{rootTeamfile:f,sender:d,receiverTeamfile:u,receiverAlias:c.alias});m!==null&&!m.allowed&&e.stderr.write(`warning: out-of-policy chat send: ${m.reason}
1713
- `),s={provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,alias:c.alias,...c.model!==void 0?{model:c.model}:{}},o={root_teamfile:f,sender_teamfile:d.teamfile,sender_alias:d.alias,receiver_teamfile:u,receiver_alias:c.alias,policy:m};let p=await hD(e,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:d.teamfile,sender_alias:d.alias,force:r.force===!0});if(!p.acquired){let h=gD(c.alias,p.current);return await Bu(e,{...o,message:r.prompt,response:null,status:"error",error_detail:h}),e.stderr.write(`error: ${h}
1713
+ `),s={provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,alias:c.alias,...c.model!==void 0?{model:c.model}:{}},o={root_teamfile:f,sender_teamfile:d.teamfile,sender_alias:d.alias,receiver_teamfile:u,receiver_alias:c.alias,policy:m};let p=await hD(e,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:d.teamfile,sender_alias:d.alias,force:r.force===!0});if(!p.acquired){let h=gD(c.alias,p.current);return await qu(e,{...o,message:r.prompt,response:null,status:"error",error_detail:h}),e.stderr.write(`error: ${h}
1714
1714
  `),1}i=p.lease}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: ${u}
1715
1715
  `),c instanceof ge,1}}else{if(r.force===!0)return e.stderr.write(`error: --force is only valid for AI-team chat
1716
1716
  `),2;if(n.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
1717
- `),2;s={provider:n.provider,sessionId:n.sessionid,cwd:process.cwd()}}let a=!1;try{let l={provider:s.provider,sessionId:s.sessionId,cwd:s.cwd,prompt:r.prompt,permissionMode:r.permissionMode,env:process.env,onDelta:d=>{a=!0,e.stdout.write(d)},onProgress:d=>wD(e,s.alias??"(raw)",d)};s.model!==void 0&&(l.model=s.model),s.alias!==void 0&&(l.alias=s.alias),r.idleTimeoutMs!==void 0&&(l.timeoutMs=r.idleTimeoutMs);let c=await ur(l),u=c.status==="stalled";return o!==null&&await Bu(e,{...o,message:r.prompt,response:u?null:c.text,status:o.policy?.outOfPolicy===!0?"out_of_policy":u?"error":"ok",error_detail:o.policy?.outOfPolicy===!0?o.policy.reason:u?`provider stalled${c.stalledAfterMs!==void 0?` after ${c.stalledAfterMs}ms`:""}`:null}),a?c.text.endsWith(`
1717
+ `),2;s={provider:n.provider,sessionId:n.sessionid,cwd:process.cwd()}}let a=!1;try{let l={provider:s.provider,sessionId:s.sessionId,cwd:s.cwd,prompt:r.prompt,permissionMode:r.permissionMode,env:process.env,onDelta:d=>{a=!0,e.stdout.write(d)},onProgress:d=>wD(e,s.alias??"(raw)",d)};s.model!==void 0&&(l.model=s.model),s.alias!==void 0&&(l.alias=s.alias),r.idleTimeoutMs!==void 0&&(l.timeoutMs=r.idleTimeoutMs);let c=await ur(l),u=c.status==="stalled";return o!==null&&await qu(e,{...o,message:r.prompt,response:u?null:c.text,status:o.policy?.outOfPolicy===!0?"out_of_policy":u?"error":"ok",error_detail:o.policy?.outOfPolicy===!0?o.policy.reason:u?`provider stalled${c.stalledAfterMs!==void 0?` after ${c.stalledAfterMs}ms`:""}`:null}),a?c.text.endsWith(`
1718
1718
  `)||e.stdout.write(`
1719
1719
  `):e.stdout.write(`${c.text}${c.text.endsWith(`
1720
1720
  `)?"":`
1721
- `}`),c.status==="stalled"?1:0}catch(l){let c=l instanceof Error?l.message:String(l);return o!==null&&await Bu(e,{...o,message:r.prompt,response:null,status:o.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:o.policy?.outOfPolicy===!0?`${o.policy.reason}; provider error: ${c}`:c}),e.stderr.write(`error: ${c}
1722
- `),1}finally{i!==null&&await _D(e,i)}}function iD(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=wE(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function aD(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=Wu(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=kr(n.teamfile),o=ls(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=ss(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function lD(t,e){return e.explicitRoot!==void 0?kr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await J(t,r=>cD(r,e.sender.teamfile)??e.receiverTeamfile)}function cD(t,e){let r=t.listRootTeams().slice().sort(uD);for(let n of r)if(dD(t,n.teamfile_path,e))return n.teamfile_path;return null}function uD(t,e){let r=t.last_seeded_at??t.registered_at,s=(e.last_seeded_at??e.registered_at).localeCompare(r);if(s!==0)return s;let o=e.registered_at.localeCompare(t.registered_at);return o!==0?o:t.teamfile_path.localeCompare(e.teamfile_path)}function dD(t,e,r){let n=[e],s=new Set;for(;n.length>0;){let o=n.shift();if(!s.has(o)){if(s.add(o),o===r)return!0;for(let i of t.listTeamConnections(o))n.push(i.target_teamfile)}}return!1}async function fD(t,e){return await J(t,r=>dE({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:mD(r,e.sender.teamfile,e.receiverTeamfile)}))}function mD(t,e,r){let n=new Set([e,r]),s=t.listTeamConnections(e);for(let o of s)n.add(o.target_teamfile);return{teams:[...n].map(o=>pD(o,t)),connections:s.map(o=>({sourceTeamfile:o.source_teamfile,targetTeamfile:o.target_teamfile,targetName:o.target_name}))}}function pD(t,e){let r=ls(t,e),n=mt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function hD(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-gE()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await J(t,o=>{let i=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});return i.acquired?{acquired:!0,lease:i.current??s}:{acquired:!1,current:i.current}})}async function _D(t,e){try{await J(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1723
- `)}}function gD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function gE(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return pE;let r=Number(e);return!Number.isFinite(r)||r<=0?pE:r}async function Bu(t,e){let r=_E(e.message),n=e.response===null?null:_E(e.response);try{await J(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1724
- `)}}function _E(t){return t.length<=mE?{text:t,truncated:!1}:{text:t.slice(0,mE),truncated:!0}}function wE(t){if(t==="0")return 0;let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d) or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function wD(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1721
+ `}`),c.status==="stalled"?1:0}catch(l){let c=l instanceof Error?l.message:String(l);return o!==null&&await qu(e,{...o,message:r.prompt,response:null,status:o.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:o.policy?.outOfPolicy===!0?`${o.policy.reason}; provider error: ${c}`:c}),e.stderr.write(`error: ${c}
1722
+ `),1}finally{i!==null&&await _D(e,i)}}function iD(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=EE(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function aD(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=Bu(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=kr(n.teamfile),o=ls(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=ss(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function lD(t,e){return e.explicitRoot!==void 0?kr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await J(t,r=>cD(r,e.sender.teamfile)??e.receiverTeamfile)}function cD(t,e){let r=t.listRootTeams().slice().sort(uD);for(let n of r)if(dD(t,n.teamfile_path,e))return n.teamfile_path;return null}function uD(t,e){let r=t.last_seeded_at??t.registered_at,s=(e.last_seeded_at??e.registered_at).localeCompare(r);if(s!==0)return s;let o=e.registered_at.localeCompare(t.registered_at);return o!==0?o:t.teamfile_path.localeCompare(e.teamfile_path)}function dD(t,e,r){let n=[e],s=new Set;for(;n.length>0;){let o=n.shift();if(!s.has(o)){if(s.add(o),o===r)return!0;for(let i of t.listTeamConnections(o))n.push(i.target_teamfile)}}return!1}async function fD(t,e){return await J(t,r=>mE({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:mD(r,e.sender.teamfile,e.receiverTeamfile)}))}function mD(t,e,r){let n=new Set([e,r]),s=t.listTeamConnections(e);for(let o of s)n.add(o.target_teamfile);return{teams:[...n].map(o=>pD(o,t)),connections:s.map(o=>({sourceTeamfile:o.source_teamfile,targetTeamfile:o.target_teamfile,targetName:o.target_name}))}}function pD(t,e){let r=ls(t,e),n=mt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function hD(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-yE()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await J(t,o=>{let i=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});return i.acquired?{acquired:!0,lease:i.current??s}:{acquired:!1,current:i.current}})}async function _D(t,e){try{await J(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1723
+ `)}}function gD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function yE(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return _E;let r=Number(e);return!Number.isFinite(r)||r<=0?_E:r}async function qu(t,e){let r=wE(e.message),n=e.response===null?null:wE(e.response);try{await J(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1724
+ `)}}function wE(t){return t.length<=hE?{text:t,truncated:!1}:{text:t.slice(0,hE),truncated:!0}}function EE(t){if(t==="0")return 0;let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d) or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function wD(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1725
1725
  `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
1726
1726
  `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
1727
- `)}var sD,mE,pE,hE,EE=E(()=>{"use strict";St();Se();cs();At();fE();Ki();xi();kt();sD={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},mE=256*1024,pE=30*60*1e3,hE=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1727
+ `)}var sD,hE,_E,gE,TE=E(()=>{"use strict";St();Se();cs();At();pE();Ki();xi();kt();sD={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},hE=256*1024,_E=30*60*1e3,gE=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1728
1728
  lmctl chat <teamfile> <alias> "<prompt>"
1729
1729
  lmctl chat <sessionid> "<prompt>" --provider <name>
1730
1730
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -1732,16 +1732,16 @@ ${hE}
1732
1732
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
1733
1733
  [--from <teamfile>:<alias>] [--root <teamfile>] [--force]
1734
1734
 
1735
- Send a prompt to a team member or raw provider session, or answer a paused run.`});var us,vK,qu=E(()=>{"use strict";us=[{name:"lmctl_chat",description:"Send one prompt to an AI-managed .lmctl team member by explicit teamfile path and alias. This is the only MCP tool exposed by lmctl; managed workflows use the lmctl CLI surface.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},provider:{type:"string",description:"(deprecated: use team+alias)"},sessionid:{type:"string",description:"(deprecated: use team+alias)"},sessiondir:{type:"string",description:"(deprecated: use team+alias)"},prompt:{type:"string",description:"Prompt text to send"},idle_timeout:{type:"string",description:"Idle timeout, e.g. 8h, 30m, 0"},heartbeat:{type:"string",description:"Accepted for lmctl0 compatibility; ignored by lmctl"}},required:["prompt"],additionalProperties:!1},local:!0}],vK=us.length});import{spawn as yD}from"node:child_process";async function bE(t,e,r){let n=bD.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return TD(n.name,s)}function TD(t,e){return t==="lmctl_chat"?SD(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function SD(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:void 0,n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=typeof t.provider=="string"?t.provider:void 0,i=typeof t.sessionid=="string"?t.sessionid:void 0,a=typeof t.sessiondir=="string"&&t.sessiondir.length>0?t.sessiondir:process.cwd(),l=typeof t.idle_timeout=="string"?t.idle_timeout:void 0,c,u=process.cwd();if(r!==void 0&&r.length>0)c=["chat",r,n,e],s!==void 0&&c.push("--from",s);else if(o!==void 0&&i!==void 0)c=["chat",i,e,"--provider",o],u=a;else return Promise.resolve({status:"error",code:400,message:"provide either 'team' or all of 'provider'+'sessionid'"});return l!==void 0&&c.push("--idle-timeout",l),kD(c,u)}function kD(t,e){return new Promise(r=>{let n=!1,s=l=>{n||(n=!0,r(l))},o=yD("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),i="",a="";o.stdout?.on("data",l=>{i+=l.toString("utf8")}),o.stderr?.on("data",l=>{a+=l.toString("utf8")}),o.on("error",l=>{s({status:"error",code:1,message:`failed to spawn lmctl chat: ${l.message}`})}),o.on("exit",l=>{if(l===0){s({status:"ok",data:{text:i.trim()||"(empty response)"}});return}s({status:"error",code:l??1,message:a.trim()||`lmctl chat exited with code ${l}`})})})}function TE(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:ED),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var ED,bD,Hu=E(()=>{"use strict";qu();ED="http://127.0.0.1:8787",bD=new Map(us.map(t=>[t.name,t]))});async function ND(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Ju({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:vD,capabilities:{tools:{listChanged:!1}},serverInfo:{name:ID,version:$D}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:us.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await bE(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function Ju(t){return`${JSON.stringify(t)}
1736
- `}async function SE(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Ju({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await ND(l,t);c.kind==="response"?t.io.write(Ju(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1735
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});var us,vK,Hu=E(()=>{"use strict";us=[{name:"lmctl_chat",description:"Send one prompt to an AI-managed .lmctl team member by explicit teamfile path and alias. This is the only MCP tool exposed by lmctl; managed workflows use the lmctl CLI surface.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},provider:{type:"string",description:"(deprecated: use team+alias)"},sessionid:{type:"string",description:"(deprecated: use team+alias)"},sessiondir:{type:"string",description:"(deprecated: use team+alias)"},prompt:{type:"string",description:"Prompt text to send"},idle_timeout:{type:"string",description:"Idle timeout, e.g. 8h, 30m, 0"},heartbeat:{type:"string",description:"Accepted for lmctl0 compatibility; ignored by lmctl"}},required:["prompt"],additionalProperties:!1},local:!0}],vK=us.length});import{spawn as yD}from"node:child_process";async function SE(t,e,r){let n=bD.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return TD(n.name,s)}function TD(t,e){return t==="lmctl_chat"?SD(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function SD(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:void 0,n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=typeof t.provider=="string"?t.provider:void 0,i=typeof t.sessionid=="string"?t.sessionid:void 0,a=typeof t.sessiondir=="string"&&t.sessiondir.length>0?t.sessiondir:process.cwd(),l=typeof t.idle_timeout=="string"?t.idle_timeout:void 0,c,u=process.cwd();if(r!==void 0&&r.length>0)c=["chat",r,n,e],s!==void 0&&c.push("--from",s);else if(o!==void 0&&i!==void 0)c=["chat",i,e,"--provider",o],u=a;else return Promise.resolve({status:"error",code:400,message:"provide either 'team' or all of 'provider'+'sessionid'"});return l!==void 0&&c.push("--idle-timeout",l),kD(c,u)}function kD(t,e){return new Promise(r=>{let n=!1,s=l=>{n||(n=!0,r(l))},o=yD("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),i="",a="";o.stdout?.on("data",l=>{i+=l.toString("utf8")}),o.stderr?.on("data",l=>{a+=l.toString("utf8")}),o.on("error",l=>{s({status:"error",code:1,message:`failed to spawn lmctl chat: ${l.message}`})}),o.on("exit",l=>{if(l===0){s({status:"ok",data:{text:i.trim()||"(empty response)"}});return}s({status:"error",code:l??1,message:a.trim()||`lmctl chat exited with code ${l}`})})})}function kE(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:ED),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var ED,bD,Ju=E(()=>{"use strict";Hu();ED="http://127.0.0.1:8787",bD=new Map(us.map(t=>[t.name,t]))});async function ND(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Xu({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:vD,capabilities:{tools:{listChanged:!1}},serverInfo:{name:ID,version:$D}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:us.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await SE(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function Xu(t){return`${JSON.stringify(t)}
1736
+ `}async function vE(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Xu({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await ND(l,t);c.kind==="response"?t.io.write(Xu(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1737
1737
  `);for(;d!==-1;){let f=n.slice(0,d);n=n.slice(d+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),d=n.indexOf(`
1738
1738
  `)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
1739
- `),a.finally(()=>c(1))})})}var vD,ID,$D,kE=E(()=>{"use strict";qu();Hu();vD="2025-06-18",ID="lmctl",$D="0.0.1"});var vE={};ie(vE,{runMcp:()=>jD});async function jD(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(xD),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1740
- `),2;let n=e.dal===void 0,s=e.dal??pe({path:de()});try{let o=TE(s,process.env);return await SE({io:{write:a=>e.stdout.write(a),log:a=>e.stderr.write(a)},dispatch:{config:o,dal:s}},r)}finally{n&&s.close()}}var xD,IE=E(()=>{"use strict";Ce();Hu();kE();qe();xD=`usage: lmctl mcp
1739
+ `),a.finally(()=>c(1))})})}var vD,ID,$D,IE=E(()=>{"use strict";Hu();Ju();vD="2025-06-18",ID="lmctl",$D="0.0.1"});var $E={};ie($E,{runMcp:()=>jD});async function jD(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(xD),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1740
+ `),2;let n=e.dal===void 0,s=e.dal??pe({path:de()});try{let o=kE(s,process.env);return await vE({io:{write:a=>e.stdout.write(a),log:a=>e.stderr.write(a)},dispatch:{config:o,dal:s}},r)}finally{n&&s.close()}}var xD,NE=E(()=>{"use strict";Ce();Ju();IE();qe();xD=`usage: lmctl mcp
1741
1741
 
1742
1742
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
1743
1743
  local config, then uses stdin/stdout for JSON-RPC frames.
1744
- `});function ds(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var $E=E(()=>{"use strict"});function AD(t){return{stale_run_minutes:ms(t,"monitor.stale_run_minutes",fs.stale_run_minutes),old_attention_days:ms(t,"monitor.old_attention_days",fs.old_attention_days),old_issue_days:ms(t,"monitor.old_issue_days",fs.old_issue_days),stuck_job_minutes:ms(t,"monitor.stuck_job_minutes",fs.stuck_job_minutes),dedupe_window_hours:ms(t,"monitor.dedupe_window_hours",fs.dedupe_window_hours)}}function ms(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function NE(t,e={}){let r=e.now??new Date,n=AD(t),s=[];for(let o of RD(t,n,r))s.push(o);for(let o of OD(t,n,r))s.push(o);for(let o of LD(t,n,r))s.push(o);for(let o of CD(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function RD(t,e,r){let n=xE(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
1744
+ `});function ds(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var xE=E(()=>{"use strict"});function AD(t){return{stale_run_minutes:ms(t,"monitor.stale_run_minutes",fs.stale_run_minutes),old_attention_days:ms(t,"monitor.old_attention_days",fs.old_attention_days),old_issue_days:ms(t,"monitor.old_issue_days",fs.old_issue_days),stuck_job_minutes:ms(t,"monitor.stuck_job_minutes",fs.stuck_job_minutes),dedupe_window_hours:ms(t,"monitor.dedupe_window_hours",fs.dedupe_window_hours)}}function ms(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function jE(t,e={}){let r=e.now??new Date,n=AD(t),s=[];for(let o of RD(t,n,r))s.push(o);for(let o of OD(t,n,r))s.push(o);for(let o of LD(t,n,r))s.push(o);for(let o of CD(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function RD(t,e,r){let n=AE(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
1745
1745
  SELECT r.id AS id,
1746
1746
  r.job_id AS job_id,
1747
1747
  w.name AS workflow_name,
@@ -1752,12 +1752,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1752
1752
  WHERE r.terminal_state IS NULL
1753
1753
  AND r.paused_at IS NULL
1754
1754
  AND r.started_at <= ?
1755
- `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=ds(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(zi(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function OD(t,e,r){let n=xE(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
1755
+ `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=ds(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(zi(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function OD(t,e,r){let n=AE(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
1756
1756
  SELECT id, project_id, source, source_ref, status, enqueued_at
1757
1757
  FROM job
1758
1758
  WHERE status NOT IN ('done', 'failed')
1759
1759
  AND enqueued_at <= ?
1760
- `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=ds(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(zi(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function LD(t,e,r){let n=jE(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
1760
+ `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=ds(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(zi(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function LD(t,e,r){let n=RE(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
1761
1761
  SELECT project_id,
1762
1762
  COUNT(*) AS count,
1763
1763
  (SELECT kind FROM attention a2
@@ -1772,7 +1772,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1772
1772
  AND kind NOT IN ('attentions_overdue', 'issues_overdue')
1773
1773
  AND created_at <= ?
1774
1774
  GROUP BY project_id
1775
- `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=ds(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(zi(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function CD(t,e,r){let n=jE(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
1775
+ `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=ds(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(zi(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function CD(t,e,r){let n=RE(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
1776
1776
  SELECT project_id,
1777
1777
  COUNT(*) AS count,
1778
1778
  (SELECT title FROM project_issue i2
@@ -1792,27 +1792,27 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1792
1792
  AND payload LIKE ?
1793
1793
  ORDER BY id DESC
1794
1794
  LIMIT 1
1795
- `).get(s,o)??null}function xE(t,e){return new Date(t.getTime()-e*60*1e3)}function DD(t,e){return new Date(t.getTime()-e*60*60*1e3)}function jE(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function PD(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var fs,AE=E(()=>{"use strict";$E();fs={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var OE={};ie(OE,{renderSummary:()=>RE,runMonitor:()=>UD});async function UD(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(FD),0;let r=P(t,[],["--json","--quiet"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--json"),s=M(r,"--quiet");try{return await J(e,o=>{let i=NE(o);return n?W(e,i):s||e.stdout.write(`${RE(i.findings)}
1796
- `),0})}catch(o){return fe(e,o)}}function RE(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${WD(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function WD(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var FD,LE=E(()=>{"use strict";Se();AE();FD=`usage: lmctl monitor [--json] [--quiet]
1795
+ `).get(s,o)??null}function AE(t,e){return new Date(t.getTime()-e*60*1e3)}function DD(t,e){return new Date(t.getTime()-e*60*60*1e3)}function RE(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function PD(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var fs,OE=E(()=>{"use strict";xE();fs={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var CE={};ie(CE,{renderSummary:()=>LE,runMonitor:()=>UD});async function UD(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(FD),0;let r=P(t,[],["--json","--quiet"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--json"),s=M(r,"--quiet");try{return await J(e,o=>{let i=jE(o);return n?W(e,i):s||e.stdout.write(`${LE(i.findings)}
1796
+ `),0})}catch(o){return fe(e,o)}}function LE(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${WD(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function WD(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var FD,ME=E(()=>{"use strict";Se();OE();FD=`usage: lmctl monitor [--json] [--quiet]
1797
1797
 
1798
1798
  Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
1799
1799
  issues; emit findings as attentions for the operator/master to handle.
1800
- `});var CE={};ie(CE,{runDevice:()=>ZD});import{readFileSync as BD}from"node:fs";import{homedir as qD}from"node:os";import{join as HD}from"node:path";import{CognitoIdentityClient as JD,GetIdCommand as XD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as GD}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as VD,ListObjectsV2Command as KD,PutObjectCommand as YD,S3Client as zD}from"@aws-sdk/client-s3";async function ZD(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write(Xu),0;if(r==="init"){let n=Du();return e.stdout.write(`${n.device_id}
1800
+ `});var DE={};ie(DE,{runDevice:()=>ZD});import{readFileSync as BD}from"node:fs";import{homedir as qD}from"node:os";import{join as HD}from"node:path";import{CognitoIdentityClient as JD,GetIdCommand as XD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as GD}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as VD,ListObjectsV2Command as KD,PutObjectCommand as YD,S3Client as zD}from"@aws-sdk/client-s3";async function ZD(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write(Gu),0;if(r==="init"){let n=Pu();return e.stdout.write(`${n.device_id}
1801
1801
  `),0}if(r==="id"){let n=Sr();return n===null?(e.stderr.write(`error: no device id initialized at ${Xi()}; run 'lmctl device init'
1802
1802
  `),1):(e.stdout.write(`${n.device_id}
1803
1803
  `),0)}return r==="login"?await QD(t.slice(1),e):r==="prompt"?await tP(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
1804
1804
  `),1)}async function QD(t,e){let r=eP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1805
- ${Xu}`),2;let n=is();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1806
- `),1;dy({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await Pi({region:n.config.region,clientId:n.config.cognitoClientId??Ji,refreshToken:r.accessKey});s=c.idToken,o=c.accessToken,i=c.expiresAt}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${u}
1805
+ ${Gu}`),2;let n=is();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1806
+ `),1;my({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await Pi({region:n.config.region,clientId:n.config.cognitoClientId??Ji,refreshToken:r.accessKey});s=c.idToken,o=c.accessToken,i=c.expiresAt}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${u}
1807
1807
  `),1}let a=rs(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
1808
- `),1;bu({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Sr()??Du();return e.stdout.write(`logged in as ${r.userId}
1808
+ `),1;Tu({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Sr()??Pu();return e.stdout.write(`logged in as ${r.userId}
1809
1809
  device id: ${l.device_id}
1810
1810
  mailbox prefix: ${r.userId}/${l.device_id}/
1811
1811
  access key stored at ${ns()}
1812
1812
  `),0}function eP(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --user-id";e=o;continue}if(s==="--access-key"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --access-key";r=o;continue}return`unknown argument: ${s}`}return e===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:e,accessKey:r}}async function tP(t,e){let r=rP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1813
- ${Xu}`),2;let n=is();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1814
- `),1;let s=sP();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await nP({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=GD({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Sr()?.device_id,u=rs(o)??void 0,d=new br({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new zD({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:KD,GetObjectCommand:VD,PutObjectCommand:YD},selfRole:"browser",onMessage:async()=>{}}),f=ey({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:Qw,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
1815
- `),0}function rP(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function nP(t){let r=await new JD({region:t.region}).send(new XD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function sP(t=process.env.LMCTL_TOKEN_PATH??HD(qD(),".lmctl","cli-tokens.json")){try{return JSON.parse(BD(t,"utf8"))}catch{return null}}var Xu,ME=E(()=>{"use strict";Pu();Ru();Ti();gu();wu();Tu();yu();Xu=`usage: lmctl device <id|init>
1813
+ ${Gu}`),2;let n=is();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1814
+ `),1;let s=sP();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await nP({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=GD({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Sr()?.device_id,u=rs(o)??void 0,d=new br({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new zD({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:KD,GetObjectCommand:VD,PutObjectCommand:YD},selfRole:"browser",onMessage:async()=>{}}),f=ry({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:ty,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
1815
+ `),0}function rP(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function nP(t){let r=await new JD({region:t.region}).send(new XD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function sP(t=process.env.LMCTL_TOKEN_PATH??HD(qD(),".lmctl","cli-tokens.json")){try{return JSON.parse(BD(t,"utf8"))}catch{return null}}var Gu,PE=E(()=>{"use strict";Fu();Ou();Ti();wu();yu();Su();Eu();Gu=`usage: lmctl device <id|init>
1816
1816
  lmctl device login --user-id <sub> --access-key <refreshToken>
1817
1817
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
1818
1818
 
@@ -1822,7 +1822,7 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
1822
1822
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
1823
1823
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
1824
1824
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
1825
- `});var PE={};ie(PE,{runTeam:()=>aP});import{join as oP}from"node:path";async function aP(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(iP),0;try{return await J(e,async s=>{switch(r){case"create":return cP(n,e,s);case"list":return uP(n,e,s);case"show":return dP(n,e,s);case"add-member":return fP(n,e,s);case"seed":return DE(n,e,s,!1);case"refresh":return DE(n,e,s,!0);case"companion":return pP(n,e,s);case"list-roots":return lP(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return fe(e,s)}}function lP(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);if(n.positionals.length>0)return w(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?W(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
1825
+ `});var UE={};ie(UE,{runTeam:()=>aP});import{join as oP}from"node:path";async function aP(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(iP),0;try{return await J(e,async s=>{switch(r){case"create":return cP(n,e,s);case"list":return uP(n,e,s);case"show":return dP(n,e,s);case"add-member":return fP(n,e,s);case"seed":return FE(n,e,s,!1);case"refresh":return FE(n,e,s,!0);case"companion":return pP(n,e,s);case"list-roots":return lP(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return fe(e,s)}}function lP(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);if(n.positionals.length>0)return w(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?W(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
1826
1826
  `)+(s.length>0?`
1827
1827
  `:"")),0}function cP(t,e,r){let[n]=t;if(n===void 0)return w(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
1828
1828
  `),0}function uP(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
@@ -1830,39 +1830,39 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
1830
1830
  `:""}`),0}function dP(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(M(n,"--json"))W(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
1831
1831
  `);for(let a of i)e.stdout.write(`- ${a.alias} ${ke(a)} ${a.sessionid??"(unseeded)"}
1832
1832
  `)}return 0}function fP(t,e,r){let n=P(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=j(n,"--alias"),a=j(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:j(n,"--model")??null,role:j(n,"--role")??"agent",sessiondir:j(n,"--sessiondir")??oP(tr(),"sessions",o.name,i)});return M(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1833
- `),0}async function DE(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=j(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=mP(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return w(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=eg(f.workflow_name,m.definition);if(p.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))bo(f,r),So(f);let u=[],d=!1;for(let f of l){let m=await Mr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1833
+ `),0}async function FE(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=j(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=mP(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return w(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=rg(f.workflow_name,m.definition);if(p.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))bo(f,r),So(f);let u=[],d=!1;for(let f of l){let m=await Mr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1834
1834
 
1835
1835
  ${Ur}`:Ur;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=Wr(ke(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
1836
1836
  ${_}
1837
1837
  `);try{await Lo({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
1838
1838
  `)}}}return M(s,"--json")?W(e,u):e.stdout.write(`seeded ${u.length} member(s)
1839
1839
  `),d?1:0}function mP(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function pP(t,e,r){let n=P(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=j(n,"--interpreter"),a=j(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
1840
- `),0}var iP,FE=E(()=>{"use strict";qe();ro();On();Nl();Ce();Br();Wl();fi();Se();xl();iP=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1840
+ `),0}var iP,WE=E(()=>{"use strict";qe();ro();On();xl();Ce();Br();Bl();fi();Se();jl();iP=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1841
1841
 
1842
1842
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
1843
1843
  refresh to create/update native provider sessions for team members.
1844
1844
 
1845
1845
  Root team registry:
1846
1846
  list-roots [--json] List .lmctl root teams registered by lmctl seed.
1847
- `});var HE={};ie(HE,{renderMessage:()=>BE,runTail:()=>yP});async function yP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${wP}
1848
- `),0;let r=P(t,["--lines","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--lines"),s=n===void 0?_P:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=M(r,"--watch"),i=j(r,"--watch-interval"),a=i===void 0?gP:Number.parseInt(i.replace(/s$/,""),10);if(!Number.isFinite(a)||a<1)return w(e,`invalid --watch-interval "${i}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let l=j(r,"--run");if(l!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(l,10);if(!Number.isFinite(f)||f<=0||String(f)!==l)return w(e,`invalid --run "${l}" (expected a positive integer run id)`);try{return await J(e,async m=>EP(e,m,f,s,o,a))}catch(m){return fe(e,m)}}let c=zt(hP,{target:r.positionals[0],alias:r.positionals[1],flags:{session:j(r,"--session"),provider:j(r,"--provider")}});if(c.mode==="error")return w(e,c.message);if(c.mode==="managed")return w(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let f;try{f=Ne(c.teamfile)}catch(p){return w(e,`tail: ${p instanceof Error?p.message:String(p)}`)}let m=mt(f);if(m===void 0)return w(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let p=Rt(c.teamfile,m.alias);u={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ge?w(e,p.message):fe(e,p)}}else try{let f=Rt(c.teamfile,c.alias);u={provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir}}catch(f){return f instanceof ge?w(e,f.message):fe(e,f)}else{let f=c.sessionid,m=c.provider;if(m===void 0){let p=await vo(f);if(p.length===0)return w(e,`tail: session "${f}" not found in any provider store`);if(p.length>1)return w(e,`tail: session "${f}" matches multiple providers (${p.join(", ")}); pass --provider`);m=p[0]}u={provider:m,sessionId:f}}let d=await UE(e,u.provider,u.sessionId,s,-1);return d<0?1:o?await new Promise(f=>{let m=async()=>{try{let g=await UE(e,u.provider,u.sessionId,s,d);g>=0&&(d=g)}catch(g){e.stderr.write(`tail: ${g instanceof Error?g.message:String(g)}
1849
- `)}},p=setInterval(()=>{m()},a*1e3),h=()=>{clearInterval(p),f(0)};process.once("SIGINT",h),process.once("SIGTERM",h)}):0}async function UE(t,e,r,n,s){let o;try{o=await hr(r,e)}catch(l){return t.stderr.write(`tail: failed to load session: ${l instanceof Error?l.message:String(l)}
1847
+ `});var XE={};ie(XE,{renderMessage:()=>HE,runTail:()=>yP});async function yP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${wP}
1848
+ `),0;let r=P(t,["--lines","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--lines"),s=n===void 0?_P:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=M(r,"--watch"),i=j(r,"--watch-interval"),a=i===void 0?gP:Number.parseInt(i.replace(/s$/,""),10);if(!Number.isFinite(a)||a<1)return w(e,`invalid --watch-interval "${i}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let l=j(r,"--run");if(l!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(l,10);if(!Number.isFinite(f)||f<=0||String(f)!==l)return w(e,`invalid --run "${l}" (expected a positive integer run id)`);try{return await J(e,async m=>EP(e,m,f,s,o,a))}catch(m){return fe(e,m)}}let c=zt(hP,{target:r.positionals[0],alias:r.positionals[1],flags:{session:j(r,"--session"),provider:j(r,"--provider")}});if(c.mode==="error")return w(e,c.message);if(c.mode==="managed")return w(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let f;try{f=Ne(c.teamfile)}catch(p){return w(e,`tail: ${p instanceof Error?p.message:String(p)}`)}let m=mt(f);if(m===void 0)return w(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let p=Rt(c.teamfile,m.alias);u={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ge?w(e,p.message):fe(e,p)}}else try{let f=Rt(c.teamfile,c.alias);u={provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir}}catch(f){return f instanceof ge?w(e,f.message):fe(e,f)}else{let f=c.sessionid,m=c.provider;if(m===void 0){let p=await vo(f);if(p.length===0)return w(e,`tail: session "${f}" not found in any provider store`);if(p.length>1)return w(e,`tail: session "${f}" matches multiple providers (${p.join(", ")}); pass --provider`);m=p[0]}u={provider:m,sessionId:f}}let d=await BE(e,u.provider,u.sessionId,s,-1);return d<0?1:o?await new Promise(f=>{let m=async()=>{try{let g=await BE(e,u.provider,u.sessionId,s,d);g>=0&&(d=g)}catch(g){e.stderr.write(`tail: ${g instanceof Error?g.message:String(g)}
1849
+ `)}},p=setInterval(()=>{m()},a*1e3),h=()=>{clearInterval(p),f(0)};process.once("SIGINT",h),process.once("SIGTERM",h)}):0}async function BE(t,e,r,n,s){let o;try{o=await hr(r,e)}catch(l){return t.stderr.write(`tail: failed to load session: ${l instanceof Error?l.message:String(l)}
1850
1850
  `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
1851
- `),-1;let i=o.messages??[],a=s<0?Math.max(0,i.length-n):s+1;if(a>=i.length)return i.length-1;for(let l=a;l<i.length;l+=1)t.stdout.write(`${BE(i[l])}
1852
- `);return i.length-1}function BE(t){let e=qE(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
1851
+ `),-1;let i=o.messages??[],a=s<0?Math.max(0,i.length-n):s+1;if(a>=i.length)return i.length-1;for(let l=a;l<i.length;l+=1)t.stdout.write(`${HE(i[l])}
1852
+ `);return i.length-1}function HE(t){let e=JE(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
1853
1853
  `).replace(/\r/g,`
1854
1854
  `).split(`
1855
1855
  `),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
1856
1856
  ${i.map(a=>` ${a}`).join(`
1857
- `)}`}async function EP(t,e,r,n,s,o){if(e.getRun(r)===null)return w(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),l=a.slice(Math.max(0,a.length-n));for(let u of l)t.stdout.write(`${WE(u)}
1858
- `);let c=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let f=setInterval(()=>{try{let p=e.listSessionEvents(r,c);for(let h of p)t.stdout.write(`${WE(h)}
1857
+ `)}`}async function EP(t,e,r,n,s,o){if(e.getRun(r)===null)return w(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),l=a.slice(Math.max(0,a.length-n));for(let u of l)t.stdout.write(`${qE(u)}
1858
+ `);let c=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let f=setInterval(()=>{try{let p=e.listSessionEvents(r,c);for(let h of p)t.stdout.write(`${qE(h)}
1859
1859
  `),c=h.id}catch(p){t.stderr.write(`tail: ${p instanceof Error?p.message:String(p)}
1860
- `)}},o*1e3),m=()=>{clearInterval(f),u(0)};process.once("SIGINT",m),process.once("SIGTERM",m)}):0}function WE(t){let e=qE(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function qE(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var hP,_P,gP,wP,JE=E(()=>{"use strict";Br();Se();cs();At();hP={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},_P=20,gP=2,wP=`usage: lmctl tail [target] [alias]
1860
+ `)}},o*1e3),m=()=>{clearInterval(f),u(0)};process.once("SIGINT",m),process.once("SIGTERM",m)}):0}function qE(t){let e=JE(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function JE(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var hP,_P,gP,wP,GE=E(()=>{"use strict";Br();Se();cs();At();hP={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},_P=20,gP=2,wP=`usage: lmctl tail [target] [alias]
1861
1861
  lmctl tail --session <id> [--provider <name>]
1862
1862
  lmctl tail --run <id> [--watch] [--watch-interval Ns]
1863
1863
  [--lines N] [--watch] [--watch-interval Ns] [--provider <name>]
1864
1864
 
1865
- Print or watch provider session messages, or follow a managed run timeline.`});var XE={};ie(XE,{runInfo:()=>kP});function SP(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function kP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${TP}
1865
+ Print or watch provider session messages, or follow a managed run timeline.`});var VE={};ie(VE,{runInfo:()=>kP});function SP(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function kP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${TP}
1866
1866
  `),0;let r=P(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=j(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await J(e,async u=>IP(e,u,c,n))}catch(u){return fe(e,u)}}let o=zt(bP,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:j(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"info managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return $P(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Rt(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):fe(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await vo(a);if(c.length===0)return w(e,`info: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`info: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return vP(e,i,a,l,n)}async function vP(t,e,r,n,s){let o;try{o=await hr(r,e)}catch(a){return w(t,`info: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`info: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??0,totalOutputTokens:o.totalOutputTokens??0,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(W(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
1867
1867
  `),t.stdout.write(` Provider: ${o.provider}
1868
1868
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
@@ -1887,83 +1887,83 @@ Print or watch provider session messages, or follow a managed run timeline.`});v
1887
1887
  `),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
1888
1888
  `);for(let u of s){let d=u.lastContext!==void 0?SP(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${String(u.messageCount).padStart(6)} ${d.padStart(12)}
1889
1889
  `)}return t.stdout.write(` ${"TOTAL".padEnd(i)} ${"".padEnd(a)}${"".padEnd(l)}${"".padEnd(c)}${String(o).padStart(6)}
1890
- `),0}var bP,TP,GE=E(()=>{"use strict";Br();Se();cs();At();kt();bP={name:"info",allowsBareTeamfile:!0,supportsRaw:!0},TP=`usage: lmctl info [target] [alias]
1890
+ `),0}var bP,TP,KE=E(()=>{"use strict";Br();Se();cs();At();kt();bP={name:"info",allowsBareTeamfile:!0,supportsRaw:!0},TP=`usage: lmctl info [target] [alias]
1891
1891
  lmctl info <teamfile> # team rollup
1892
1892
  lmctl info <sessionid> [--provider <name>]
1893
1893
  [--json]
1894
1894
 
1895
- Show provider session details, team rollups, or managed run state/token totals.`});var KE={};ie(KE,{runLs:()=>AP});import{resolve as Gu}from"node:path";function jP(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function AP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${NP}
1896
- `),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=j(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(j(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=j(r,"--limit"),h=xP;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>VE)return w(e,`--limit ${_} exceeds maximum (${VE})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await J(e,async _=>RP(e,_,h,g))}catch(_){return fe(e,_)}}let i=OP(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=j(r,"--provider"),c=j(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await ll(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?Gu(c):Gu(process.cwd());f=f.filter(h=>{let g=Gu(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=jP(f),a==="json")return W(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1895
+ Show provider session details, team rollups, or managed run state/token totals.`});var zE={};ie(zE,{runLs:()=>AP});import{resolve as Vu}from"node:path";function jP(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function AP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${NP}
1896
+ `),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=j(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(j(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=j(r,"--limit"),h=xP;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>YE)return w(e,`--limit ${_} exceeds maximum (${YE})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await J(e,async _=>RP(e,_,h,g))}catch(_){return fe(e,_)}}let i=OP(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=j(r,"--provider"),c=j(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await cl(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?Vu(c):Vu(process.cwd());f=f.filter(h=>{let g=Vu(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=jP(f),a==="json")return W(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1897
1897
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
1898
1898
  `);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
1899
1899
  `);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()}
1900
1900
  `)}return 0}async function RP(t,e,r,n){let s=Dr(e,{limit:r});if(n==="json")return W(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
1901
1901
  `),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
1902
1902
  `);for(let o of s){let i=(o.current_state??"").padEnd(20),a=(o.terminal_state??"").padEnd(20);t.stdout.write(`${String(o.id).padEnd(8)} ${String(o.workflow_id).padEnd(8)} ${String(o.team_id).padEnd(8)} ${i} ${a} ${o.started_at}
1903
- `)}return 0}function OP(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 NP,xP,VE,YE=E(()=>{"use strict";St();Se();kt();NP=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
1903
+ `)}return 0}function OP(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 NP,xP,YE,ZE=E(()=>{"use strict";St();Se();kt();NP=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
1904
1904
  [--recursive] [--all] [--format table|teamfile|json] [--json]
1905
1905
  lmctl ls --runs [--limit N] [--format table|json] [--json]
1906
1906
 
1907
- List native provider sessions in scope, or list recent managed runs with --runs.`,xP=50,VE=500});import{existsSync as ZE,readFileSync as QE}from"node:fs";import{homedir as LP}from"node:os";import{dirname as CP,resolve as eb}from"node:path";import{fileURLToPath as MP}from"node:url";function tb(t,e={}){let r=[],n=FP(e.modelSelectionDocPath);for(let s of t){if(!s.model)continue;let o=s.provider.trim().toLowerCase();if(o==="copilot"){r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){let a=qP(e.opencodeConfigPath);a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${zE(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Qi??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${zE(i)}`)}return r}function FP(t){if(!t&&ps)return ps;let e=new Map,r,n=t??UP();if(!ZE(n))return r=`${n} not found`,t||Vu(e),t||(ps=e),t||(Qi=r),e;let s;try{s=QE(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Vu(e),t||(ps=e),t||(Qi=r),e}for(let[o,i]of Object.entries(DP)){let a=WP(s,i),l=BP(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Vu(e),t||(ps=e),t||(Qi=r),e}function UP(){let t=CP(MP(import.meta.url));return eb(t,"..","..","..","durable-memory","model_selection.md")}function Vu(t){for(let[e,r]of Object.entries(PP))t.set(e,r)}function WP(t,e){let n=new RegExp(`^## ${JP(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function BP(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function qP(t){let e=t??eb(LP(),".config","opencode","opencode.json"),r=Pf();if(!ZE(e))return{available:!0,models:r};let n;try{n=JSON.parse(QE(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...HP(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function HP(t){if(!Ku(t))return[];let e=Zi(t.provider)??Zi(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Ku(s))continue;let o=Zi(s.models)??Zi(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Zi(t){return Ku(t)?t:null}function Ku(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zE(t){return t.length>0?t.join(", "):"(none)"}function JP(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var DP,PP,ps,Qi,rb=E(()=>{"use strict";ja();DP={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},PP={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},ps=null});function pt(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Zt(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function hs(t,e){return!Zt(t)||pt(t)?null:`${e} must use https://: ${t}`}async function _s(t,e){let r=hs(t,e.description);if(r!==null||!pt(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n),i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){let c=a instanceof Error&&a.name==="AbortError"?`timed out after ${n}ms`:a instanceof Error?a.message:String(a);throw new Error(`failed to fetch ${e.description} ${t}: ${c}`)}finally{clearTimeout(o)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);return Buffer.from(await i.arrayBuffer())}var Yu=E(()=>{"use strict"});var sd={};ie(sd,{GEMINI_PROVIDER_NOTICE:()=>ab,_setSkillFileOpsForTests:()=>n1,_setTeamfileSeedForTests:()=>r1,buildRootTeamRegistrationRow:()=>ub,persistTeamConnections:()=>fb,registerRootTeam:()=>db,runLint:()=>s1,runSeed:()=>o1,sha256Text:()=>cb,skillNameFromSource:()=>nd,skillNameFromUrl:()=>g1});import{createHash as XP,randomUUID as GP}from"node:crypto";import{existsSync as VP,mkdirSync as KP,readFileSync as ed,realpathSync as zu,renameSync as YP,unlinkSync as zP,writeFileSync as ys}from"node:fs";import{basename as ZP,dirname as td,isAbsolute as nb,join as ta,resolve as rd}from"node:path";function r1(t){lb=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(St(),ul)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function n1(t){ws=t===null?Zu:{...Zu,...t}}async function s1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(e1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1908
- `),2;let r=t[0],n;try{n=Ne(r)}catch(i){return un(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=Nu(n,td(rd(r))),o=tb(n.members);for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1907
+ List native provider sessions in scope, or list recent managed runs with --runs.`,xP=50,YE=500});import{existsSync as eb,readFileSync as tb}from"node:fs";import{homedir as LP}from"node:os";import{dirname as CP,resolve as rb}from"node:path";import{fileURLToPath as MP}from"node:url";function nb(t,e={}){let r=[],n=FP(e.modelSelectionDocPath);for(let s of t){if(!s.model)continue;let o=s.provider.trim().toLowerCase();if(o==="copilot"){r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){let a=qP(e.opencodeConfigPath);a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${QE(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Qi??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${QE(i)}`)}return r}function FP(t){if(!t&&ps)return ps;let e=new Map,r,n=t??UP();if(!eb(n))return r=`${n} not found`,t||Ku(e),t||(ps=e),t||(Qi=r),e;let s;try{s=tb(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Ku(e),t||(ps=e),t||(Qi=r),e}for(let[o,i]of Object.entries(DP)){let a=WP(s,i),l=BP(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Ku(e),t||(ps=e),t||(Qi=r),e}function UP(){let t=CP(MP(import.meta.url));return rb(t,"..","..","..","durable-memory","model_selection.md")}function Ku(t){for(let[e,r]of Object.entries(PP))t.set(e,r)}function WP(t,e){let n=new RegExp(`^## ${JP(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function BP(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function qP(t){let e=t??rb(LP(),".config","opencode","opencode.json"),r=Uf();if(!eb(e))return{available:!0,models:r};let n;try{n=JSON.parse(tb(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...HP(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function HP(t){if(!Yu(t))return[];let e=Zi(t.provider)??Zi(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Yu(s))continue;let o=Zi(s.models)??Zi(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Zi(t){return Yu(t)?t:null}function Yu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function QE(t){return t.length>0?t.join(", "):"(none)"}function JP(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var DP,PP,ps,Qi,sb=E(()=>{"use strict";Aa();DP={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},PP={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},ps=null});function pt(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Zt(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function hs(t,e){return!Zt(t)||pt(t)?null:`${e} must use https://: ${t}`}async function _s(t,e){let r=hs(t,e.description);if(r!==null||!pt(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n),i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){let c=a instanceof Error&&a.name==="AbortError"?`timed out after ${n}ms`:a instanceof Error?a.message:String(a);throw new Error(`failed to fetch ${e.description} ${t}: ${c}`)}finally{clearTimeout(o)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);return Buffer.from(await i.arrayBuffer())}var zu=E(()=>{"use strict"});var od={};ie(od,{GEMINI_PROVIDER_NOTICE:()=>cb,_setSkillFileOpsForTests:()=>n1,_setTeamfileSeedForTests:()=>r1,buildRootTeamRegistrationRow:()=>fb,persistTeamConnections:()=>pb,registerRootTeam:()=>mb,runLint:()=>s1,runSeed:()=>o1,sha256Text:()=>db,skillNameFromSource:()=>sd,skillNameFromUrl:()=>g1});import{createHash as XP,randomUUID as GP}from"node:crypto";import{existsSync as VP,mkdirSync as KP,readFileSync as td,realpathSync as Zu,renameSync as YP,unlinkSync as zP,writeFileSync as ys}from"node:fs";import{basename as ZP,dirname as rd,isAbsolute as ob,join as ta,resolve as nd}from"node:path";function r1(t){ub=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(St(),dl)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function n1(t){ws=t===null?Qu:{...Qu,...t}}async function s1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(e1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1908
+ `),2;let r=t[0],n;try{n=Ne(r)}catch(i){return un(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=xu(n,rd(nd(r))),o=nb(n.members);for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1909
1909
  `);if(s.length===0)try{Tr(r)}catch(i){return e.stderr.write(`error: connect: ${i instanceof Error?i.message:String(i)}
1910
- `),1}for(let i of n.members)Qu([i],e),i.session!==void 0&&i.session.length<gs&&o.push(`${i.alias}: sessionid is shorter than ${gs} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1911
- `);return await J(e,i=>{iE(r,i,a=>e.stderr.write(`${a}
1910
+ `),1}for(let i of n.members)ed([i],e),i.session!==void 0&&i.session.length<gs&&o.push(`${i.alias}: sessionid is shorter than ${gs} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1911
+ `);return await J(e,i=>{lE(r,i,a=>e.stderr.write(`${a}
1912
1912
  `))}),s.length>0?1:(e.stdout.write(`ok
1913
1913
  `),0)}async function o1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(t1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
1914
- `),2;let r=t[0],n=rd(r),s;try{s=zu(n)}catch(S){return un(e,`${r}: ${S instanceof Error?S.message:String(S)}`)}let o=td(n),i;try{i=Ne(n)}catch(S){return un(e,`${r}: ${S instanceof Error?S.message:String(S)}`)}let a=Nu(i,o);if(a.length>0){Qu(i.members,e);for(let S of a)e.stderr.write(`error: ${S.field}: ${S.message}
1915
- `);return 1}let l;try{l=Tr(n)}catch(S){return un(e,`connect: ${S instanceof Error?S.message:String(S)}`)}Qu(i.members,e);let c=await m1(i.skillUrls,o,e);if(c!==0)return c;let u=ed(n,"utf8"),d=u.split(`
1914
+ `),2;let r=t[0],n=nd(r),s;try{s=Zu(n)}catch(S){return un(e,`${r}: ${S instanceof Error?S.message:String(S)}`)}let o=rd(n),i;try{i=Ne(n)}catch(S){return un(e,`${r}: ${S instanceof Error?S.message:String(S)}`)}let a=xu(i,o);if(a.length>0){ed(i.members,e);for(let S of a)e.stderr.write(`error: ${S.field}: ${S.message}
1915
+ `);return 1}let l;try{l=Tr(n)}catch(S){return un(e,`connect: ${S instanceof Error?S.message:String(S)}`)}ed(i.members,e);let c=await m1(i.skillUrls,o,e);if(c!==0)return c;let u=td(n,"utf8"),d=u.split(`
1916
1916
  `),f=a1(d),m=0,p=i.members.filter(S=>S.teamfile!==void 0?!1:S.session===void 0||S.session.length<gs);for(let S of p)if(!w1(S.provider))return e.stderr.write(`error: ${S.alias}: invalid provider "${S.provider}"
1917
1917
  `),1;let h=i.members.find(S=>S.alias.toLowerCase()==="lead");if(h!==void 0){Ar("lmctl","lmctl_chat",{warn:I=>e.stderr.write(`${I}
1918
1918
  `)});let S=h.sessiondir??o;try{f1(S)&&e.stdout.write(`.mcp.json installed in ${S}
1919
1919
  `)}catch(I){e.stderr.write(`warning: .mcp.json install failed: ${I instanceof Error?I.message:String(I)}
1920
1920
  `)}}for(let S of i.members){if(S.teamfile!==void 0)continue;if(S.session!==void 0&&S.session.length>=gs){e.stderr.write(`warning: ${S.alias}: existing sessionid preserved; skipping
1921
- `);continue}let I=S.sessiondir??o,v=await lb({provider:S.provider,cwd:I,...S.model!==void 0?{model:S.model}:{},...S.alias.toLowerCase()==="lead"?{prompt:i1(n,u,i.members)}:{}});if(v.error!==void 0||v.sessionId===void 0||v.sessionId.length<gs)return e.stderr.write(`error: ${S.alias}: seed failed${v.error!==void 0?`: ${v.error}`:"; provider did not report a sessionid"}
1921
+ `);continue}let I=S.sessiondir??o,v=await ub({provider:S.provider,cwd:I,...S.model!==void 0?{model:S.model}:{},...S.alias.toLowerCase()==="lead"?{prompt:i1(n,u,i.members)}:{}});if(v.error!==void 0||v.sessionId===void 0||v.sessionId.length<gs)return e.stderr.write(`error: ${S.alias}: seed failed${v.error!==void 0?`: ${v.error}`:"; provider did not report a sessionid"}
1922
1922
  `),1;let k=f.get(S.alias.toLowerCase());if(k===void 0)return e.stderr.write(`error: ${S.alias}: could not find matching _MEMBER_ line to update
1923
- `),1;let R=sb(d[k],"sessionid",v.sessionId);S.sessiondir===void 0&&(R=sb(R,"sessiondir",o)),d[k]=R,m+=1,ys(n,d.join(`
1923
+ `),1;let R=ib(d[k],"sessionid",v.sessionId);S.sessiondir===void 0&&(R=ib(R,"sessiondir",o)),d[k]=R,m+=1,ys(n,d.join(`
1924
1924
  `),"utf8"),e.stdout.write(`${S.alias}: seeded ${v.sessionId}
1925
1925
  `)}let g=d.join(`
1926
- `),_=u1(g,zu(n));_!==g&&ys(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
1927
- `);let T=new Date().toISOString();return await J(e,S=>{db(S,{teamfilePath:s,name:i.name,rawText:_,now:T}),fb(S,l,T)}),0}function cb(t){return XP("sha256").update(t).digest("hex")}function ub(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:cb(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function db(t,e){let r=ub(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function fb(t,e,r){for(let n of e.snapshots)t.replaceTeamConnections(n.source_teamfile,n.connections.map(s=>({target_name:s.target_name,target_teamfile:s.target_teamfile,created_at:r})))}function i1(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
1926
+ `),_=u1(g,Zu(n));_!==g&&ys(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
1927
+ `);let T=new Date().toISOString();return await J(e,S=>{mb(S,{teamfilePath:s,name:i.name,rawText:_,now:T}),pb(S,l,T)}),0}function db(t){return XP("sha256").update(t).digest("hex")}function fb(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:db(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function mb(t,e){let r=fb(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function pb(t,e,r){for(let n of e.snapshots)t.replaceTeamConnections(n.source_teamfile,n.connections.map(s=>({target_name:s.target_name,target_teamfile:s.target_teamfile,created_at:r})))}function i1(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
1928
1928
  `):"- (no non-Lead members)";return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Use only the lmctl_chat MCP tool for member pings and delegation.","","Team members:",s,"","Example MCP calls:",...r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>`lmctl_chat(team="${t}", alias="${o.alias}", prompt="your task here")`),"","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(`
1929
- `)}function a1(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=l1(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function l1(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function sb(t,e,r){let n=`${e}=${c1(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function c1(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function u1(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
1929
+ `)}function a1(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=l1(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function l1(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function ib(t,e,r){let n=`${e}=${c1(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function c1(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function u1(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
1930
1930
  `),s=n>=0?t.slice(0,n):t,o=n>=0?t.slice(n+1):"";return s===r?t:s.startsWith("#teamfile:")?o.length>0?`${r}
1931
1931
  ${o}`:`${r}
1932
1932
  `:t.length>0?`${r}
1933
1933
  ${t}`:`${r}
1934
1934
  `}function d1(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function f1(t){let e=ta(t,".mcp.json"),r=d1();if(!VP(e))return ys(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
1935
- `,"utf8"),!0;let n;try{n=JSON.parse(ed(e,"utf8"))}catch{return!1}if(n===null||typeof n!="object"||Array.isArray(n))return!1;let s=ib(n.mcpServers)?{...n.mcpServers}:{},o=ib(s.lmctl)?s.lmctl:void 0;return o!==void 0&&o.type===r.type&&o.command===r.command&&JSON.stringify(o.args)===JSON.stringify(r.args)?!1:(s.lmctl=r,n.mcpServers=s,ys(e,JSON.stringify(n,null,2)+`
1936
- `,"utf8"),!0)}async function m1(t,e,r){if(t.length===0)return 0;let n=ta(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await mb(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return un(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
1935
+ `,"utf8"),!0;let n;try{n=JSON.parse(td(e,"utf8"))}catch{return!1}if(n===null||typeof n!="object"||Array.isArray(n))return!1;let s=lb(n.mcpServers)?{...n.mcpServers}:{},o=lb(s.lmctl)?s.lmctl:void 0;return o!==void 0&&o.type===r.type&&o.command===r.command&&JSON.stringify(o.args)===JSON.stringify(r.args)?!1:(s.lmctl=r,n.mcpServers=s,ys(e,JSON.stringify(n,null,2)+`
1936
+ `,"utf8"),!0)}async function m1(t,e,r){if(t.length===0)return 0;let n=ta(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await hb(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return un(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
1937
1937
  `);for(let i of o){let a=`<!-- lmctl _SKILL_ source: ${i.source} -->
1938
1938
  ${i.body}${i.body.endsWith(`
1939
1939
  `)?"":`
1940
1940
  `}`;try{ws.mkdirSync(n,{recursive:!0}),_1(n,i.name,a)}catch(l){return un(r,`skill ${i.source}: ${l instanceof Error?l.message:String(l)}`)}r.stdout.write(`skill ${i.name}: wrote durable-memory/skills/${i.name}.md
1941
- `)}return 0}async function mb(t,e,r,n,s){if(s>ea)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${ea}`);let o=await p1(t,e),i=h1(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:nd(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=ea)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${ea}`);for(let a of i)await mb(a,o.base,r,n,s+1)}async function p1(t,e){if(e.kind==="https"){if(Zt(t)||!nb(t)){let o=ob(t,e),i;try{i=await _s(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:cn(o),source:cn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(Zt(t)){let o=ob(t,e),i;try{i=await _s(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:cn(o),source:cn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=nb(t)?t:rd(e.kind==="file"?e.baseDir:".",t),n,s;try{n=zu(r),s=ed(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:td(n)},text:s}}function ob(t,e){if(Zt(t)){if(!pt(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return cn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!pt(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return cn(r)}function h1(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(Zt(l)&&!pt(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function cn(t){return new URL(t).href}function _1(t,e,r){let n=ta(t,`${e}.md`),s=ta(t,`${e}.${process.pid}.${GP().slice(0,8)}.tmp`);try{ws.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),ws.renameSync(s,n)}catch(o){try{ws.unlinkSync(s)}catch{}throw o}}function g1(t){return nd(t)}function nd(t){let e=pt(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(ZP(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,QP).replace(/-+$/gu,"")||"skill"}function ib(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function w1(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function un(t,e){return t.stderr.write(`error: ${e}
1942
- `),1}function Qu(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; migrate to team-level _CONNECT_ (alias=${r.alias} teamfile=${r.teamfile})
1943
- `),r.provider==="gemini"&&e.stderr.write(`${ab.replace("%s",r.alias)}
1944
- `)}var gs,QP,ea,e1,t1,ab,Zu,lb,ws,od=E(()=>{"use strict";At();rb();Ps();Se();Ki();Yu();gs=5,QP=80,ea=16,e1=`usage: lmctl lint <teamfile.lmctl>
1941
+ `)}return 0}async function hb(t,e,r,n,s){if(s>ea)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${ea}`);let o=await p1(t,e),i=h1(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:sd(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=ea)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${ea}`);for(let a of i)await hb(a,o.base,r,n,s+1)}async function p1(t,e){if(e.kind==="https"){if(Zt(t)||!ob(t)){let o=ab(t,e),i;try{i=await _s(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:cn(o),source:cn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(Zt(t)){let o=ab(t,e),i;try{i=await _s(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:cn(o),source:cn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=ob(t)?t:nd(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Zu(r),s=td(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:rd(n)},text:s}}function ab(t,e){if(Zt(t)){if(!pt(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return cn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!pt(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return cn(r)}function h1(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(Zt(l)&&!pt(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function cn(t){return new URL(t).href}function _1(t,e,r){let n=ta(t,`${e}.md`),s=ta(t,`${e}.${process.pid}.${GP().slice(0,8)}.tmp`);try{ws.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),ws.renameSync(s,n)}catch(o){try{ws.unlinkSync(s)}catch{}throw o}}function g1(t){return sd(t)}function sd(t){let e=pt(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(ZP(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,QP).replace(/-+$/gu,"")||"skill"}function lb(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function w1(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function un(t,e){return t.stderr.write(`error: ${e}
1942
+ `),1}function ed(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; migrate to team-level _CONNECT_ (alias=${r.alias} teamfile=${r.teamfile})
1943
+ `),r.provider==="gemini"&&e.stderr.write(`${cb.replace("%s",r.alias)}
1944
+ `)}var gs,QP,ea,e1,t1,cb,Qu,ub,ws,id=E(()=>{"use strict";At();sb();Ps();Se();Ki();zu();gs=5,QP=80,ea=16,e1=`usage: lmctl lint <teamfile.lmctl>
1945
1945
 
1946
1946
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
1947
1947
  `,t1=`usage: lmctl seed <teamfile.lmctl>
1948
1948
 
1949
1949
  Seed missing or placeholder session ids in an lmctl teamfile by calling each
1950
1950
  member's configured native provider.
1951
- `,ab='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Zu={mkdirSync:KP,writeFileSync:ys,renameSync:YP,unlinkSync:zP},lb=async t=>{let{seed:e}=await Promise.resolve().then(()=>(St(),ul)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},ws=Zu});var yb={};ie(yb,{runConnect:()=>T1});import{existsSync as pb,readFileSync as y1,realpathSync as id,writeFileSync as hb}from"node:fs";import{dirname as gb,relative as E1,resolve as ad}from"node:path";async function T1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(b1),0;if(t.length!==3)return e.stderr.write(`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1952
- `),2;let[r,n,s]=t;if(!_b.test(s))return e.stderr.write(`error: invalid connection name "${s}" (must match ${_b.source})
1953
- `),2;let o=ad(r),i=ad(n);if(!o.endsWith(".lmctl")||!i.endsWith(".lmctl"))return e.stderr.write(`error: from_lmctl and to_lmctl must both end with .lmctl
1954
- `),2;if(!pb(o))return e.stderr.write(`error: source teamfile not found: ${o}
1955
- `),1;if(!pb(i))return e.stderr.write(`error: target teamfile not found: ${i}
1956
- `),1;let a=id(o),l=id(i);if(a===l)return e.stderr.write(`error: ${Ui}
1951
+ `,cb='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Qu={mkdirSync:KP,writeFileSync:ys,renameSync:YP,unlinkSync:zP},ub=async t=>{let{seed:e}=await Promise.resolve().then(()=>(St(),dl)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},ws=Qu});var bb={};ie(bb,{runConnect:()=>T1});import{existsSync as _b,readFileSync as y1,realpathSync as ad,writeFileSync as gb}from"node:fs";import{dirname as yb,relative as E1,resolve as ld}from"node:path";async function T1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(b1),0;if(t.length!==3)return e.stderr.write(`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1952
+ `),2;let[r,n,s]=t;if(!wb.test(s))return e.stderr.write(`error: invalid connection name "${s}" (must match ${wb.source})
1953
+ `),2;let o=ld(r),i=ld(n);if(!o.endsWith(".lmctl")||!i.endsWith(".lmctl"))return e.stderr.write(`error: from_lmctl and to_lmctl must both end with .lmctl
1954
+ `),2;if(!_b(o))return e.stderr.write(`error: source teamfile not found: ${o}
1955
+ `),1;if(!_b(i))return e.stderr.write(`error: target teamfile not found: ${i}
1956
+ `),1;let a=ad(o),l=ad(i);if(a===l)return e.stderr.write(`error: ${Ui}
1957
1957
  `),1;try{S1(o,"source")}catch(m){return e.stderr.write(`error: ${m instanceof Error?m.message:String(m)}
1958
- `),1}let c=y1(o,"utf8"),u=k1(o,i),d=`_CONNECT_ alias=${s} teamfile=${j1(u)}`;if($1(c,gb(o),s,l))return e.stderr.write(`error: _CONNECT_ alias "${s}" to ${l} already exists in ${o}
1959
- `),1;let f=v1(c,d);hb(o,f,"utf8");try{Tr(o)}catch(m){return hb(o,c,"utf8"),e.stderr.write(`error: connect validation failed; source restored: ${m instanceof Error?m.message:String(m)}
1958
+ `),1}let c=y1(o,"utf8"),u=k1(o,i),d=`_CONNECT_ alias=${s} teamfile=${j1(u)}`;if($1(c,yb(o),s,l))return e.stderr.write(`error: _CONNECT_ alias "${s}" to ${l} already exists in ${o}
1959
+ `),1;let f=v1(c,d);gb(o,f,"utf8");try{Tr(o)}catch(m){return gb(o,c,"utf8"),e.stderr.write(`error: connect validation failed; source restored: ${m instanceof Error?m.message:String(m)}
1960
1960
  `),1}return e.stdout.write(`Connected ${o} -> ${s} (${l})
1961
1961
  `),e.stdout.write(`Run: lmctl lint ${o}
1962
1962
  `),e.stdout.write(`Then run: lmctl seed ${o}
1963
- `),0}function S1(t,e){let r=Ne(t);if(r.parseErrors.length>0)throw new Error(`${e} teamfile parse error: ${r.parseErrors.join("; ")}`);if(mt(r)===void 0)throw new Error(`${e} teamfile has no Lead: ${t}`)}function k1(t,e){let r=E1(gb(t),e).replace(/\\/g,"/");return r.startsWith(".")?r:`./${r}`}function v1(t,e){let r=t.split(`
1963
+ `),0}function S1(t,e){let r=Ne(t);if(r.parseErrors.length>0)throw new Error(`${e} teamfile parse error: ${r.parseErrors.join("; ")}`);if(mt(r)===void 0)throw new Error(`${e} teamfile has no Lead: ${t}`)}function k1(t,e){let r=E1(yb(t),e).replace(/\\/g,"/");return r.startsWith(".")?r:`./${r}`}function v1(t,e){let r=t.split(`
1964
1964
  `),n=I1(r),s=n>=0?n+1:x1(r);return r.splice(s,0,e),r.join(`
1965
1965
  `)}function I1(t){for(let e=t.length-1;e>=0;e-=1)if(/^\s*(?:_MEMBER_|_CONNECT_)(?:\s|$)/.test(t[e]))return e;return-1}function $1(t,e,r,n){return t.split(`
1966
- `).some(s=>/^\s*_CONNECT_(?:\s|$)/.test(s)&&wb(s,"alias")===r&&N1(e,s)===n)}function N1(t,e){let r=wb(e,"teamfile");if(r===void 0||r.length===0)return null;try{return id(ad(t,r))}catch{return null}}function x1(t){let e=t.length;for(;e>0&&t[e-1]==="";)e-=1;return e}function wb(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function j1(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}var b1,_b,Eb=E(()=>{"use strict";At();b1=`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1966
+ `).some(s=>/^\s*_CONNECT_(?:\s|$)/.test(s)&&Eb(s,"alias")===r&&N1(e,s)===n)}function N1(t,e){let r=Eb(e,"teamfile");if(r===void 0||r.length===0)return null;try{return ad(ld(t,r))}catch{return null}}function x1(t){let e=t.length;for(;e>0&&t[e-1]==="";)e-=1;return e}function Eb(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function j1(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}var b1,wb,Tb=E(()=>{"use strict";At();b1=`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1967
1967
 
1968
1968
  Append a team-level _CONNECT_ edge to member <name> in the target teamfile.
1969
1969
  The sender is always the source team's Lead.
@@ -1971,32 +1971,32 @@ The sender is always the source team's Lead.
1971
1971
  After editing, run:
1972
1972
  lmctl lint <from.lmctl>
1973
1973
  lmctl seed <from.lmctl>
1974
- `,_b=/^[A-Za-z][A-Za-z0-9_-]*$/});var kb={};ie(kb,{runClone:()=>D1});import{existsSync as cd,mkdirSync as A1,readFileSync as R1,readdirSync as O1,statSync as Tb,writeFileSync as L1}from"node:fs";import{basename as bb,dirname as ld,extname as C1,join as Sb,resolve as ra}from"node:path";async function D1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(M1),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
1975
- `),2;let[r,n]=t,s,o=null,i=r;try{if(/^https?:\/\//i.test(r)){let u=await fetch(r);if(!u.ok)throw new Error(`HTTP ${u.status}`);s=await u.text()}else{let u=ra(r);if(!cd(u))throw new Error(`source not found: ${r}`);let f=Tb(u).isDirectory()?P1(u):u;s=R1(f,"utf8"),o=ld(f),i=f}}catch(u){return e.stderr.write(`error: ${u instanceof Error?u.message:String(u)}
1976
- `),1}let a=ra(n),l=F1(a,i,n);if(cd(l))return e.stderr.write(`error: ${l} already exists.
1977
- `),1;let c=U1(s);return o!==null&&(c=W1(c,o,ld(l))),A1(ld(l),{recursive:!0}),L1(l,c,"utf8"),e.stdout.write(`Cloned ${r} -> ${l}
1974
+ `,wb=/^[A-Za-z][A-Za-z0-9_-]*$/});var Ib={};ie(Ib,{runClone:()=>D1});import{existsSync as ud,mkdirSync as A1,readFileSync as R1,readdirSync as O1,statSync as kb,writeFileSync as L1}from"node:fs";import{basename as Sb,dirname as cd,extname as C1,join as vb,resolve as ra}from"node:path";async function D1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(M1),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
1975
+ `),2;let[r,n]=t,s,o=null,i=r;try{if(/^https?:\/\//i.test(r)){let u=await fetch(r);if(!u.ok)throw new Error(`HTTP ${u.status}`);s=await u.text()}else{let u=ra(r);if(!ud(u))throw new Error(`source not found: ${r}`);let f=kb(u).isDirectory()?P1(u):u;s=R1(f,"utf8"),o=cd(f),i=f}}catch(u){return e.stderr.write(`error: ${u instanceof Error?u.message:String(u)}
1976
+ `),1}let a=ra(n),l=F1(a,i,n);if(ud(l))return e.stderr.write(`error: ${l} already exists.
1977
+ `),1;let c=U1(s);return o!==null&&(c=W1(c,o,cd(l))),A1(cd(l),{recursive:!0}),L1(l,c,"utf8"),e.stdout.write(`Cloned ${r} -> ${l}
1978
1978
  `),e.stdout.write(`Edit ${l}; only _MEMBER_ lines are parsed, everything else is free-form.
1979
1979
  `),e.stdout.write(`After editing, run: lmctl lint ${l}
1980
1980
  `),e.stdout.write(`Then run: lmctl seed ${l}
1981
- `),0}function P1(t){let e=O1(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return Sb(t,e[0])}function F1(t,e,r){if(r.endsWith("/")||cd(t)&&Tb(t).isDirectory()){let n=bb(e).endsWith(".lmctl")?bb(e):"team.lmctl";return Sb(t,n)}return C1(t)?t:`${t}.lmctl`}function U1(t){return t.split(`
1981
+ `),0}function P1(t){let e=O1(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return vb(t,e[0])}function F1(t,e,r){if(r.endsWith("/")||ud(t)&&kb(t).isDirectory()){let n=Sb(e).endsWith(".lmctl")?Sb(e):"team.lmctl";return vb(t,n)}return C1(t)?t:`${t}.lmctl`}function U1(t){return t.split(`
1982
1982
  `).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
1983
1983
  `)}function W1(t,e,r){let n=ra(e),s=ra(r);return n===s?t:t.split(`
1984
1984
  `).map(o=>/^\s*_MEMBER_\s+\S/.test(o)?o.replace(/sessiondir=(?:"([^"]*)"|(\S+))/g,(i,a,l)=>{let c=a??l??"",u=a!==void 0;if(!c.startsWith("/")||c!==n&&!c.startsWith(`${n}/`))return i;let d=`${s}${c.slice(n.length)}`;return u||d.includes(" ")?`sessiondir="${d}"`:`sessiondir=${d}`}):o).join(`
1985
- `)}var M1,vb=E(()=>{"use strict";M1=`usage: lmctl clone <source> <dest>
1985
+ `)}var M1,$b=E(()=>{"use strict";M1=`usage: lmctl clone <source> <dest>
1986
1986
 
1987
1987
  Copy a teamfile and strip its session ids, producing a static editable template.
1988
1988
 
1989
1989
  Examples:
1990
1990
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
1991
- `});var Nb={};ie(Nb,{runPlan:()=>V1});import{existsSync as B1,mkdirSync as q1,writeFileSync as H1}from"node:fs";import{basename as Ib,extname as $b,join as J1,resolve as X1}from"node:path";async function V1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(G1),0;let r=P(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
1991
+ `});var jb={};ie(jb,{runPlan:()=>V1});import{existsSync as B1,mkdirSync as q1,writeFileSync as H1}from"node:fs";import{basename as Nb,extname as xb,join as J1,resolve as X1}from"node:path";async function V1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(G1),0;let r=P(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
1992
1992
  `),e.stderr.write(`usage: lmctl plan [options] <directory>
1993
1993
  `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
1994
- `),2;let n=X1(r.positionals[0]);q1(n,{recursive:!0});let s=j(r,"--team")??Ib(n),o=j(r,"--provider")??"claude",i=J1(n,K1(s));return B1(i)?(e.stderr.write(`error: ${i} already exists.
1994
+ `),2;let n=X1(r.positionals[0]);q1(n,{recursive:!0});let s=j(r,"--team")??Nb(n),o=j(r,"--provider")??"claude",i=J1(n,K1(s));return B1(i)?(e.stderr.write(`error: ${i} already exists.
1995
1995
  `),1):(H1(i,z1({teamName:Y1(s),workdir:n,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
1996
1996
  `),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
1997
1997
  `),e.stdout.write(`After editing, run: lmctl lint ${i}
1998
1998
  `),e.stdout.write(`Then run: lmctl seed ${i}
1999
- `),0)}function K1(t){return $b(t)?t:`${t}.lmctl`}function Y1(t){let e=$b(t);return e?Ib(t,e):t}function z1(t){let{teamName:e,workdir:r,leadProvider:n}=t;return`# ${e}
1999
+ `),0)}function K1(t){return xb(t)?t:`${t}.lmctl`}function Y1(t){let e=xb(t);return e?Nb(t,e):t}function z1(t){let{teamName:e,workdir:r,leadProvider:n}=t;return`# ${e}
2000
2000
 
2001
2001
  # Lead, you take tasks from the operator. Clarify only when needed,
2002
2002
  # delegate implementation to Coder, and send completed work to
@@ -2025,7 +2025,7 @@ _MEMBER_ alias=Reviewer3 provider=agy sessiondir=${r}
2025
2025
  When a task is done, create or update docs in durable-memory/ to
2026
2026
  capture durable project knowledge. Keep durable-memory/index.md current
2027
2027
  so new agents can quickly discover and understand the project.
2028
- `}var G1,xb=E(()=>{"use strict";Se();G1=`usage: lmctl plan [options] <directory>
2028
+ `}var G1,Ab=E(()=>{"use strict";Se();G1=`usage: lmctl plan [options] <directory>
2029
2029
 
2030
2030
  Generate a starter lmctl team document template for a directory.
2031
2031
 
@@ -2040,8 +2040,8 @@ Examples:
2040
2040
 
2041
2041
  # Same shape, codex for the Lead and Reviewer2
2042
2042
  lmctl plan ./backend --provider codex
2043
- `});var Rb={};ie(Rb,{SIZE_WARN_EST_TOKENS:()=>Es,estimateTokens:()=>Ab,runTerminal:()=>tF});import{spawn as Z1}from"node:child_process";import{statSync as Q1}from"node:fs";async function tF(t,e){if(t.includes("--help")||t.includes("-h"))return iF(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):j(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await J(e,async i=>{let a=j(r,"--alias"),l=ew(i,s,a);return"err"in l?w(e,l.err):ud(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return fe(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):j(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=zt(eF,{target:o,alias:i,flags:{}});return a.mode==="error"?w(e,a.message):a.mode!=="ai-team"?w(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?w(e,"terminal: alias required for the teamfile target"):await J(e,l=>rF(e,a.teamfile,a.alias,l))}try{return await J(e,async s=>{let o=nF(e,s,r);if(typeof o=="number")return o;let i=j(r,"--alias");return M(r,"--size")?oF(e,s,o,i,M(r,"--json")):sF(e,s,o,i)})}catch(s){return fe(e,s)}}async function rF(t,e,r,n){let s;try{s=Rt(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):fe(t,o)}return ud(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir})}async function ud(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!ko(r))return w(t,`no resume incantation for provider "${r}"`);if(!yp.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Rl(r,n);if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=Z1(i,a,{stdio:"inherit",cwd:s});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function nF(t,e,r){let n=j(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=Co(t,e,j(r,"--project"));return typeof s=="number"?s:Mo(t,e,s,void 0)}async function sF(t,e,r,n){let s=Do(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?w(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):ud(t,{provider:ke(s),sessionid:o,sessiondir:s.sessiondir})}function Ab(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=Q1(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function oF(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return w(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=ke(a),u=null;ko(c)&&(u=await hr(l,c));let d=Ab(u),f=d.est>Es;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?Wr(c,l):null})}if(s)return W(t,{estimate:!0,legend:jb,guide_tokens:Es,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2044
- `),t.stdout.write(`${jb}
2043
+ `});var Lb={};ie(Lb,{SIZE_WARN_EST_TOKENS:()=>Es,estimateTokens:()=>Ob,runTerminal:()=>tF});import{spawn as Z1}from"node:child_process";import{statSync as Q1}from"node:fs";async function tF(t,e){if(t.includes("--help")||t.includes("-h"))return iF(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):j(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await J(e,async i=>{let a=j(r,"--alias"),l=rw(i,s,a);return"err"in l?w(e,l.err):dd(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return fe(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):j(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=zt(eF,{target:o,alias:i,flags:{}});return a.mode==="error"?w(e,a.message):a.mode!=="ai-team"?w(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?w(e,"terminal: alias required for the teamfile target"):await J(e,l=>rF(e,a.teamfile,a.alias,l))}try{return await J(e,async s=>{let o=nF(e,s,r);if(typeof o=="number")return o;let i=j(r,"--alias");return M(r,"--size")?oF(e,s,o,i,M(r,"--json")):sF(e,s,o,i)})}catch(s){return fe(e,s)}}async function rF(t,e,r,n){let s;try{s=Rt(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):fe(t,o)}return dd(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir})}async function dd(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!ko(r))return w(t,`no resume incantation for provider "${r}"`);if(!bp.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Ol(r,n);if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=Z1(i,a,{stdio:"inherit",cwd:s});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function nF(t,e,r){let n=j(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=Co(t,e,j(r,"--project"));return typeof s=="number"?s:Mo(t,e,s,void 0)}async function sF(t,e,r,n){let s=Do(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?w(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):dd(t,{provider:ke(s),sessionid:o,sessiondir:s.sessiondir})}function Ob(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=Q1(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function oF(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return w(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=ke(a),u=null;ko(c)&&(u=await hr(l,c));let d=Ob(u),f=d.est>Es;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?Wr(c,l):null})}if(s)return W(t,{estimate:!0,legend:Rb,guide_tokens:Es,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2044
+ `),t.stdout.write(`${Rb}
2045
2045
  `);for(let a of i){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
2046
2046
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
2047
2047
  Nothing was changed automatically. If you choose to compact, open the
@@ -2078,13 +2078,14 @@ Examples:
2078
2078
  tokens it surfaces the resume incantation so YOU can
2079
2079
  open & self-compact. Nothing is ever changed
2080
2080
  automatically; ${Es} is a guide, not a gate.
2081
- `),0}var eF,Es,jb,Ob=E(()=>{"use strict";Ce();Br();Se();Hl();cs();xi();eF={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Es=2e5,jb="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import aF from"better-sqlite3";import{resolve as dd,dirname as Db}from"node:path";function fd(t,e){let r=dd(t);for(;;){let n=lF(e,r);if(n!==null)return n;let s=Db(r);if(s===r)return null;r=s}}function lF(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function na(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function sa(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function md(t){if(t.io.dal!==void 0){let o=Lb(t.io.dal,t.cwd,t.projectName);if(o===null)throw new Ye(Cb(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(na()||sa()){let o=de(),i=pe({path:o}),a=Lb(i,t.cwd,t.projectName);if(a===null)throw i.close(),new Ye(Cb(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:sa()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:na()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?Fb(t.cwd):cF(t.projectName),r=Ub(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new Ye(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function Pb(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(na()||sa()){let n=de();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:sa()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:na()?"explicit-db":"explicit-workspace"}}let e;try{e=Fb(t.cwd)}catch{throw new Ye("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=Ub(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function Lb(t,e,r){return r!==void 0?t.findProjectByName(r):fd(e,t)}function Cb(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function cF(t){let e=[];for(let r of da())for(let n of Wb(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new Ye(`project not found in any workspace DB: ${t}`);return e}function Fb(t){let e=uF(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of da())for(let o of Wb(s)){let i=dd(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new Ye("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function Ub(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new Ye(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2082
- ${Mb(n)}`):new Ye(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2083
- ${Mb(n)}`)}function Mb(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2084
- `)}function uF(t){let e=[],r=dd(t);for(;;){e.push(r);let n=Db(r);if(n===r)return e;r=n}}function Wb(t){let e=null;try{e=new aF(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>ga)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var Ye,pd=E(()=>{"use strict";ya();Ce();qe();Ye=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Kb={};ie(Kb,{assertNoCrossWorkflowSubflowCycle:()=>Vb,firstUnregisteredArchetype:()=>bd,runWorkflow:()=>SF});import{createHash as yd,randomUUID as dF}from"node:crypto";import{existsSync as fF,readFileSync as oa,readdirSync as mF,writeFileSync as pF}from"node:fs";import{basename as hF,join as _F,resolve as gF}from"node:path";import{pathToFileURL as wF}from"node:url";function Ed(t,e){return{source_uri:wF(gF(t)).href,source_sha256:yd("sha256").update(e).digest("hex")}}function qb(t){return yd("sha256").update(t).digest("hex")}async function Hb(t){let e=await _s(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:qb(e),remote:!0}}async function _d(t){let e=hs(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(pt(t))return Hb(t);if(_r(t)){let n=await Ln(t),s=oa(n,"utf8");return{definition:s,source_uri:t,source_sha256:qb(s),remote:!1}}let r=oa(t,"utf8");return{definition:r,...Ed(t,r),remote:!1}}function Jb(t){return Re(t.definition)}function Xb(t){if(t.definition_schema_version!==3)return null;let e=bd(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function TF(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function SF(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(bF),0;try{return r==="run"?await kF(n,e):await J(e,s=>{switch(r){case"load":return xF(n,e,s);case"author":return jF(n,e,s);case"list":return AF(n,e,s);case"sync":return RF(n,e,s);case"export":return OF(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof Ye?w(e,s.message):fe(e,s)}}async function kF(t,e){let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return Qt(e,r.error);if(r.positionals.length>1)return Qt(e,hd);let n=M(r,"--json"),s=j(r,"--workflow"),o=j(r,"--project"),i=j(r,"--job"),a=j(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return Qt(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Zt(c))return Qt(e,hd);let m=hs(c,"remote workflow URLs");return m!==null?w(e,m):vF(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return Qt(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return Qt(e,hd);if(i!==void 0&&(o!==void 0||a!==void 0))return Qt(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=IF(i);if(m===null)return Qt(e,`invalid --job: ${i}`);let p=Pb({cwd:process.cwd(),io:e});try{let h=await zn({dal:p.dal,job_id:m,worker_id:gd()});return wd(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=Gb(a,e);if(d===ia)return 2;let f=md({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await zn({dal:f.dal,job_id:p.id,worker_id:gd()});return wd(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function vF(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=Gb(o,r);if(l===ia)return 2;let c,u;try{c=await Hb(t),u=Jb(c)}catch(p){return w(r,p instanceof Error?p.message:String(p))}let d=Xb(u);if(d!==null)return w(r,d);if(!await $F(r,c,u,a))return 1;let m=md({cwd:process.cwd(),io:r,projectName:s});try{let p=m.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),h=m.dal.enqueueJob({project_id:m.project.id,workflow_id_override:p.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),g=await zn({dal:m.dal,job_id:h.id,worker_id:gd()});return wd(r,g,{json:n,workflowName:p.name,projectName:m.project.name,workspaceName:m.workspaceName,dbPath:m.dbPath,verbose:i})}finally{m.ownsDal&&m.dal.close()}}function Qt(t,e){return t.stderr.write(`error: ${e}
2085
- `),2}function Gb(t,e){if(t===void 0)return{};let r;try{r=JSON.parse(t)}catch(n){return e.stderr.write(`error: invalid --inputs JSON: ${n instanceof Error?n.message:String(n)}
2086
- `),ia}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2087
- `),ia):r}function IF(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function gd(){return`cli-${process.pid}-${dF().slice(0,8)}`}function wd(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?W(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2081
+ `),0}var eF,Es,Rb,Cb=E(()=>{"use strict";Ce();Br();Se();Jl();cs();xi();eF={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Es=2e5,Rb="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import aF from"better-sqlite3";import{resolve as fd,dirname as Fb}from"node:path";function md(t,e){let r=fd(t);for(;;){let n=lF(e,r);if(n!==null)return n;let s=Fb(r);if(s===r)return null;r=s}}function lF(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function na(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function sa(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function pd(t){if(t.io.dal!==void 0){let o=Mb(t.io.dal,t.cwd,t.projectName);if(o===null)throw new Ye(Db(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(na()||sa()){let o=de(),i=pe({path:o}),a=Mb(i,t.cwd,t.projectName);if(a===null)throw i.close(),new Ye(Db(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:sa()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:na()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?Wb(t.cwd):cF(t.projectName),r=Bb(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new Ye(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function Ub(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(na()||sa()){let n=de();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:sa()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:na()?"explicit-db":"explicit-workspace"}}let e;try{e=Wb(t.cwd)}catch{throw new Ye("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=Bb(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function Mb(t,e,r){return r!==void 0?t.findProjectByName(r):md(e,t)}function Db(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function cF(t){let e=[];for(let r of fa())for(let n of qb(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new Ye(`project not found in any workspace DB: ${t}`);return e}function Wb(t){let e=uF(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of fa())for(let o of qb(s)){let i=fd(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new Ye("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function Bb(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new Ye(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2082
+ ${Pb(n)}`):new Ye(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2083
+ ${Pb(n)}`)}function Pb(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2084
+ `)}function uF(t){let e=[],r=fd(t);for(;;){e.push(r);let n=Fb(r);if(n===r)return e;r=n}}function qb(t){let e=null;try{e=new aF(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>wa)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var Ye,hd=E(()=>{"use strict";Ea();Ce();qe();Ye=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Td={};ie(Td,{assertNoCrossWorkflowSubflowCycle:()=>Yb,firstUnregisteredArchetype:()=>bd,runWorkflow:()=>SF});import{createHash as yd,randomUUID as dF}from"node:crypto";import{existsSync as fF,readFileSync as ia,readdirSync as mF,writeFileSync as pF}from"node:fs";import{basename as hF,join as _F,resolve as gF}from"node:path";import{pathToFileURL as wF}from"node:url";function Ed(t,e){return{source_uri:wF(gF(t)).href,source_sha256:yd("sha256").update(e).digest("hex")}}function Jb(t){return yd("sha256").update(t).digest("hex")}async function Xb(t){let e=await _s(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:Jb(e),remote:!0}}async function _d(t){let e=hs(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(pt(t))return Xb(t);if(_r(t)){let n=await Ln(t),s=ia(n,"utf8");return{definition:s,source_uri:t,source_sha256:Jb(s),remote:!1}}let r=ia(t,"utf8");return{definition:r,...Ed(t,r),remote:!1}}function Gb(t){return Re(t.definition)}function Vb(t){if(t.definition_schema_version!==3)return null;let e=bd(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function TF(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function SF(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(bF),0;try{return r==="run"?await kF(n,e):await J(e,s=>{switch(r){case"load":return xF(n,e,s);case"author":return jF(n,e,s);case"list":return AF(n,e,s);case"sync":return RF(n,e,s);case"export":return OF(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof Ye?w(e,s.message):fe(e,s)}}async function kF(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${oa}
2085
+ `),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return Qt(e,r.error);if(r.positionals.length>1)return Qt(e,oa);let n=M(r,"--json"),s=j(r,"--workflow"),o=j(r,"--project"),i=j(r,"--job"),a=j(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return Qt(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Zt(c))return Qt(e,oa);let m=hs(c,"remote workflow URLs");return m!==null?w(e,m):vF(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return Qt(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return Qt(e,oa);if(i!==void 0&&(o!==void 0||a!==void 0))return Qt(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=IF(i);if(m===null)return Qt(e,`invalid --job: ${i}`);let p=Ub({cwd:process.cwd(),io:e});try{let h=await zn({dal:p.dal,job_id:m,worker_id:gd()});return wd(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=Kb(a,e);if(d===aa)return 2;let f=pd({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await zn({dal:f.dal,job_id:p.id,worker_id:gd()});return wd(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function vF(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=Kb(o,r);if(l===aa)return 2;let c,u;try{c=await Xb(t),u=Gb(c)}catch(p){return w(r,p instanceof Error?p.message:String(p))}let d=Vb(u);if(d!==null)return w(r,d);if(!await $F(r,c,u,a))return 1;let m=pd({cwd:process.cwd(),io:r,projectName:s});try{let p=m.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),h=m.dal.enqueueJob({project_id:m.project.id,workflow_id_override:p.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),g=await zn({dal:m.dal,job_id:h.id,worker_id:gd()});return wd(r,g,{json:n,workflowName:p.name,projectName:m.project.name,workspaceName:m.workspaceName,dbPath:m.dbPath,verbose:i})}finally{m.ownsDal&&m.dal.close()}}function Qt(t,e){return t.stderr.write(`error: ${e}
2086
+ `),2}function Kb(t,e){if(t===void 0)return{};let r;try{r=JSON.parse(t)}catch(n){return e.stderr.write(`error: invalid --inputs JSON: ${n instanceof Error?n.message:String(n)}
2087
+ `),aa}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2088
+ `),aa):r}function IF(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function gd(){return`cli-${process.pid}-${dF().slice(0,8)}`}function wd(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?W(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2088
2089
  `),1}let n={ok:e.status!=="failed",job_id:e.job_id,run_id:e.run_id,status:e.status,terminal_state:e.terminal_state,workflow:r.workflowName,project:r.projectName,workspace:r.workspaceName,ms:e.ms,...r.verbose?{db_path:r.dbPath}:{}};return r.json?W(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
2089
2090
  `):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
2090
2091
  `):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
@@ -2092,61 +2093,61 @@ ${Mb(n)}`)}function Mb(t){return t.map(e=>` workspace ${e.candidate.workspace_n
2092
2093
  `)),e.status==="failed"?1:0}async function $F(t,e,r,n){let s=TF(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
2093
2094
  `)+`
2094
2095
  `),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await NF(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
2095
- `),a}function NF(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function xF(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(_r(s))try{o=await _d(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(pt(s))try{o=await _d(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=hs(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await _d(s)}let i;try{i=Jb(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?Xb(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2096
+ `),a}function NF(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function xF(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(_r(s))try{o=await _d(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(pt(s))try{o=await _d(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=hs(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await _d(s)}let i;try{i=Gb(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?Vb(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2096
2097
  `),o.remote&&e.stdout.write(`source: ${o.source_uri}
2097
2098
  sha256: ${o.source_sha256}
2098
- `),0}function bd(t){let e=ci();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function Bb(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function Vb(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function jF(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return w(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return w(e,"usage: lmctl workflow author <file.dsl> [name]");let i=oa(s,"utf8"),a;try{a=Re(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return fe(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=bd(l);if(c!==null)return w(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{Vb(u,Bb(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return Bb(JSON.parse(p.definition))}catch{return null}})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...Ed(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:yd("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2099
+ `),0}function bd(t){let e=ci();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function Hb(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function Yb(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function jF(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return w(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return w(e,"usage: lmctl workflow author <file.dsl> [name]");let i=ia(s,"utf8"),a;try{a=Re(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return fe(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=bd(l);if(c!==null)return w(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{Yb(u,Hb(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return Hb(JSON.parse(p.definition))}catch{return null}})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...Ed(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:yd("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2099
2100
  `),0}function AF(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2100
2101
  `)}${s.length>0?`
2101
- `:""}`),0}function RF(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);jo({swallow:!0});let s=vp(),o=[];try{o=fF(s)?mF(s).filter(c=>yF.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=_F(s,c),d=oa(u,"utf8"),f;try{f=Re(d)}catch(v){return w(e,`compile failed for ${c}: ${v instanceof Error?v.message:String(v)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:hF(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=Ed(u,d),S=r.getWorkflowByName(p);if(S!==null&&S.source_sha256===T.source_sha256){l+=1;continue}let I=S===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),I?i+=1:a+=1}return M(n,"--json")?W(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2102
+ `:""}`),0}function RF(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);jo({swallow:!0});let s=$p(),o=[];try{o=fF(s)?mF(s).filter(c=>yF.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=_F(s,c),d=ia(u,"utf8"),f;try{f=Re(d)}catch(v){return w(e,`compile failed for ${c}: ${v instanceof Error?v.message:String(v)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:hF(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=Ed(u,d),S=r.getWorkflowByName(p);if(S!==null&&S.source_sha256===T.source_sha256){l+=1;continue}let I=S===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),I?i+=1:a+=1}return M(n,"--json")?W(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2102
2103
  `),0}function OF(t,e,r){let n=P(t,["--out"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return w(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:EF,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
2103
2104
  `,c=j(n,"--out");return c!==void 0?(pF(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2104
- `)):e.stdout.write(l),0}var yF,EF,bF,hd,ia,Yb=E(()=>{"use strict";xc();Kr();Ro();Ml();Se();pd();Yu();Zn();yF=[".compound.json",".lmctl"],EF="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",bF=`usage: lmctl workflow <load|author|list|sync|export|run>
2105
+ `)):e.stdout.write(l),0}var yF,EF,bF,oa,aa,Sd=E(()=>{"use strict";jc();Kr();Ro();Dl();Se();hd();zu();Zn();yF=[".compound.json",".lmctl"],EF="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",bF=`usage: lmctl workflow <load|author|list|sync|export|run>
2105
2106
 
2106
2107
  Load, author, list, synchronize, inspect, or run workflow definitions. The
2107
2108
  load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
2108
2109
  URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
2109
2110
  remote https:// workflow after a trust prompt.
2110
- `,hd="usage: workflow run (<https-url> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";ia=Symbol("inputs-error")});var Zb={};ie(Zb,{CANDIDATE_PROVIDERS:()=>aa,parseInitArgs:()=>zb,probeProvider:()=>bs,probeProviderWithAuth:()=>kd,runInit:()=>MF});import{spawnSync as LF}from"node:child_process";import{existsSync as CF}from"node:fs";import{homedir as Td}from"node:os";import{join as Sd}from"node:path";async function MF(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${HF()}
2111
+ `,oa="usage: workflow run (<https-url> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";aa=Symbol("inputs-error")});var Zb={};ie(Zb,{CANDIDATE_PROVIDERS:()=>la,parseInitArgs:()=>zb,probeProvider:()=>bs,probeProviderWithAuth:()=>Id,runInit:()=>MF});import{spawnSync as LF}from"node:child_process";import{existsSync as CF}from"node:fs";import{homedir as kd}from"node:os";import{join as vd}from"node:path";async function MF(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${HF()}
2111
2112
  `),0;let n=zb(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
2112
2113
  `),2;let s=r.spawn??WF,o=r.env??BF,i=r.fileExists??CF,a=r.isTty??(!!process.stdin.isTTY&&!n.yes),l=r.promptYesNo??qF;try{return await J(e,async c=>{e.stdout.write(`Detecting providers...
2113
- `);let u=await Promise.all(aa.map(f=>kd(f,{spawn:s,env:o,fileExists:i})));if(a)for(let f=0;f<u.length;f+=1){let m=u[f],p=vd[m.provider];m.status==="ok"||m.status==="skipped"||p.optional&&m.status==="missing"||p.optional&&m.status==="unauthed"||(e.stderr.write(`
2114
+ `);let u=await Promise.all(la.map(f=>Id(f,{spawn:s,env:o,fileExists:i})));if(a)for(let f=0;f<u.length;f+=1){let m=u[f],p=$d[m.provider];m.status==="ok"||m.status==="skipped"||p.optional&&m.status==="missing"||p.optional&&m.status==="unauthed"||(e.stderr.write(`
2114
2115
  ${m.provider}: ${UF(m)}
2115
2116
  `),m.status==="missing"?(e.stderr.write(` install: ${p.install_hint}
2116
2117
  `),e.stderr.write(` fix: ${p.install_remediation}
2117
2118
  `)):m.status==="unauthed"?e.stderr.write(` fix: ${p.auth_remediation}
2118
2119
  `):(e.stderr.write(` install: ${p.install_hint}
2119
2120
  `),e.stderr.write(` after install, run \`${m.provider} login\` (or provider equivalent) to authenticate.
2120
- `)),!await l(" proceed when ready? [Y/n] "))||(u[f]=await kd(m.provider,{spawn:s,env:o,fileExists:i}))}PF(e,u);let d=u.filter(f=>f.status==="ok"||f.status==="unverified").map(f=>f.provider);return d.length===0?(e.stderr.write(`
2121
+ `)),!await l(" proceed when ready? [Y/n] "))||(u[f]=await Id(m.provider,{spawn:s,env:o,fileExists:i}))}PF(e,u);let d=u.filter(f=>f.status==="ok"||f.status==="unverified").map(f=>f.provider);return d.length===0?(e.stderr.write(`
2121
2122
  No usable providers detected. See install/auth hints above.
2122
2123
  `),1):(c.setConfig("providers.active",JSON.stringify(d)),e.stdout.write(`
2123
2124
  Setup complete. ${d.length} provider${d.length===1?"":"s"} active: ${d.join(", ")}.
2124
2125
  `),e.stdout.write(`Persisted to lmctl_config[providers.active].
2125
2126
  `),n.json&&e.stdout.write(`${JSON.stringify({active:d,results:u},null,2)}
2126
2127
  `),0)})}catch(c){return e.stderr.write(`init failed: ${c instanceof Error?c.message:String(c)}
2127
- `),1}}function bs(t,e){let r=vd[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}async function kd(t,e){let r=bs(t,e.spawn);if(r.status==="missing"||r.status==="skipped"||r.status==="unverified")return r;let n=vd[t],s=DF[t];if(s.kind==="spawn"){let a=e.spawn(s.cmd,s.args),l=(a.stdout??"").toString(),c=(a.stderr??"").toString(),u=`${l}
2128
- ${c}`;return a.status===0&&(s.successPattern?s.successPattern.test(u):!0)?{provider:t,status:"ok",detail:"installed + authed"}:a.status===null||/unknown (option|command)|usage:|command not found/i.test(c)?{provider:t,status:"unverified",detail:`installed, auth status unverifiable via \`${s.cmd} ${s.args.join(" ")}\``}:{provider:t,status:"unauthed",detail:`installed, but \`${s.cmd} ${s.args.join(" ")}\` says not authenticated`,remediation:n.auth_remediation}}let o=s.envVars.find(a=>{let l=e.env(a);return typeof l=="string"&&l.trim()!==""});if(o!==void 0)return{provider:t,status:"ok",detail:`installed + authed (via env ${o})`};let i=s.filePaths.find(a=>e.fileExists(a));return i!==void 0?{provider:t,status:"ok",detail:`installed + authed (via ${i})`}:{provider:t,status:"unauthed",detail:`installed, but no credential found (checked env: ${s.envVars.join(", ")}; files: ${s.filePaths.join(", ")})`,remediation:n.auth_remediation}}function PF(t,e){let r=Math.max(...aa.map(n=>n.length));for(let n of e){let s=FF(n.status),o=n.provider.padEnd(r," ");t.stdout.write(` ${o} ${s} ${n.detail}
2129
- `)}}function FF(t){switch(t){case"ok":return"\u2713";case"unauthed":return"\u26A0";case"unverified":return"?";case"missing":return"\u2717";case"skipped":return"-"}}function UF(t){return t.detail}function WF(t,e){return LF(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function BF(t){return process.env[t]}async function qF(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim().toLowerCase();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s===""||s==="y"||s==="yes")};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function zb(t){let e={json:!1,yes:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--json"){e.json=!0;continue}if(n==="--yes"||n==="-y"||n==="--no-prompt"){e.yes=!0;continue}if(!(n==="--help"||n==="-h"))return`unknown argument: ${n}`}return e}function HF(){return["usage: lmctl init [options]","","One-time provider lifecycle setup. Detects which provider CLIs",`(${aa.join(", ")}) are installed + authenticated`,"on this machine and persists the active list to","lmctl_config[providers.active].","","Re-runnable: each invocation refreshes the active list to current state.","","options:"," --yes, -y non-interactive (skip prompts; default in non-TTY)"," --no-prompt alias for --yes (used by sanity-check.sh)"," --json emit JSON summary of probe results to stdout"].join(`
2130
- `)}var aa,vd,DF,Id=E(()=>{"use strict";Se();aa=["claude","codex","gemini","opencode","qwen","copilot","agy"],vd={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,auth_remediation:"claude auth login",install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,auth_remediation:"codex login",install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,auth_remediation:"gemini (run interactively to complete OAuth flow) or set GEMINI_API_KEY",install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,auth_remediation:"opencode providers login",install_remediation:"see https://opencode.ai"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,auth_remediation:"qwen auth qwen-oauth (or `qwen auth api-key`)",install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,auth_remediation:"copilot login (or set COPILOT_GITHUB_TOKEN / GH_TOKEN)",install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,auth_remediation:"agy (run interactively to complete OAuth flow) or set GEMINI_API_KEY",install_remediation:"see https://antigravity.google"}};DF={claude:{kind:"spawn",cmd:"claude",args:["auth","status"],successPattern:/"loggedIn"\s*:\s*true/},codex:{kind:"spawn",cmd:"codex",args:["login","status"],successPattern:/Logged in/i},qwen:{kind:"spawn",cmd:"qwen",args:["auth","status"],successPattern:/Authentication Method/},opencode:{kind:"spawn",cmd:"opencode",args:["providers","list"],successPattern:/credential/i},gemini:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[Sd(Td(),".gemini","oauth_creds.json")]},copilot:{kind:"env-or-file",envVars:["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"],filePaths:[Sd(Td(),".copilot","credentials.json")]},agy:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[Sd(Td(),".gemini","oauth_creds.json")]}}});var oT={};ie(oT,{initWorkspace:()=>nT,runWorkspace:()=>zF,setWorkspaceProvider:()=>sT});import{copyFileSync as JF,cpSync as XF,existsSync as Le,mkdirSync as er,readdirSync as Nd,renameSync as GF,rmSync as la,statSync as ca,writeFileSync as VF}from"node:fs";import{spawnSync as KF}from"node:child_process";import{homedir as Qb}from"node:os";import{dirname as xd,join as Ts}from"node:path";async function zF(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(YF),0;switch(r){case"list":return ZF(n,e);case"create":return QF(n,e);case"use":return eU(n,e);case"show":return tU(n,e);case"delete":return rU(n,e);case"migrate":return nU(n,e);case"init":return nT(n,e);case"set-provider":return sT(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function tT(){let t=ks(),e=[],r=new Set,n=nr.default,s=Le(mn()),o=Le(gt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Ot(n):mn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Le(rr())){let i;try{i=Nd(rr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Pe(a))continue;let l=!1;try{l=ca(gt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Ot(a),active:t===a,legacy:!1}),r.add(a))}}return e}function ZF(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==0)return w(e,"usage: lmctl workspace list");let n=tT();if(M(r,"--json"))return W(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2131
- `)}return 0}function QF(t,e){let r=P(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Pe(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=gt(n);if(Le(s))return w(e,`workspace already exists: ${n} (${s})`);let o=j(r,"--docroot")??fa(n);er(s,{recursive:!0}),er(o,{recursive:!0});let i=Ot(n);er(xd(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2132
- `),0}function eU(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!Pe(n))return w(e,`invalid workspace name: ${n}`);if(n!==nr.default&&!Le(gt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Ss();return er(xd(s),{recursive:!0}),VF(s,`${n}
2128
+ `),1}}function bs(t,e){let r=$d[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}async function Id(t,e){let r=bs(t,e.spawn);if(r.status==="missing"||r.status==="skipped"||r.status==="unverified")return r;let n=$d[t],s=DF[t];if(s.kind==="spawn"){let a=e.spawn(s.cmd,s.args),l=(a.stdout??"").toString(),c=(a.stderr??"").toString(),u=`${l}
2129
+ ${c}`;return a.status===0&&(s.successPattern?s.successPattern.test(u):!0)?{provider:t,status:"ok",detail:"installed + authed"}:a.status===null||/unknown (option|command)|usage:|command not found/i.test(c)?{provider:t,status:"unverified",detail:`installed, auth status unverifiable via \`${s.cmd} ${s.args.join(" ")}\``}:{provider:t,status:"unauthed",detail:`installed, but \`${s.cmd} ${s.args.join(" ")}\` says not authenticated`,remediation:n.auth_remediation}}let o=s.envVars.find(a=>{let l=e.env(a);return typeof l=="string"&&l.trim()!==""});if(o!==void 0)return{provider:t,status:"ok",detail:`installed + authed (via env ${o})`};let i=s.filePaths.find(a=>e.fileExists(a));return i!==void 0?{provider:t,status:"ok",detail:`installed + authed (via ${i})`}:{provider:t,status:"unauthed",detail:`installed, but no credential found (checked env: ${s.envVars.join(", ")}; files: ${s.filePaths.join(", ")})`,remediation:n.auth_remediation}}function PF(t,e){let r=Math.max(...la.map(n=>n.length));for(let n of e){let s=FF(n.status),o=n.provider.padEnd(r," ");t.stdout.write(` ${o} ${s} ${n.detail}
2130
+ `)}}function FF(t){switch(t){case"ok":return"\u2713";case"unauthed":return"\u26A0";case"unverified":return"?";case"missing":return"\u2717";case"skipped":return"-"}}function UF(t){return t.detail}function WF(t,e){return LF(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function BF(t){return process.env[t]}async function qF(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim().toLowerCase();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s===""||s==="y"||s==="yes")};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function zb(t){let e={json:!1,yes:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--json"){e.json=!0;continue}if(n==="--yes"||n==="-y"||n==="--no-prompt"){e.yes=!0;continue}if(!(n==="--help"||n==="-h"))return`unknown argument: ${n}`}return e}function HF(){return["usage: lmctl init [options]","","One-time provider lifecycle setup. Detects which provider CLIs",`(${la.join(", ")}) are installed + authenticated`,"on this machine and persists the active list to","lmctl_config[providers.active].","","Re-runnable: each invocation refreshes the active list to current state.","","options:"," --yes, -y non-interactive (skip prompts; default in non-TTY)"," --no-prompt alias for --yes (used by sanity-check.sh)"," --json emit JSON summary of probe results to stdout"].join(`
2131
+ `)}var la,$d,DF,Nd=E(()=>{"use strict";Se();la=["claude","codex","gemini","opencode","qwen","copilot","agy"],$d={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,auth_remediation:"claude auth login",install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,auth_remediation:"codex login",install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,auth_remediation:"gemini (run interactively to complete OAuth flow) or set GEMINI_API_KEY",install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,auth_remediation:"opencode providers login",install_remediation:"see https://opencode.ai"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,auth_remediation:"qwen auth qwen-oauth (or `qwen auth api-key`)",install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,auth_remediation:"copilot login (or set COPILOT_GITHUB_TOKEN / GH_TOKEN)",install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,auth_remediation:"agy (run interactively to complete OAuth flow) or set GEMINI_API_KEY",install_remediation:"see https://antigravity.google"}};DF={claude:{kind:"spawn",cmd:"claude",args:["auth","status"],successPattern:/"loggedIn"\s*:\s*true/},codex:{kind:"spawn",cmd:"codex",args:["login","status"],successPattern:/Logged in/i},qwen:{kind:"spawn",cmd:"qwen",args:["auth","status"],successPattern:/Authentication Method/},opencode:{kind:"spawn",cmd:"opencode",args:["providers","list"],successPattern:/credential/i},gemini:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[vd(kd(),".gemini","oauth_creds.json")]},copilot:{kind:"env-or-file",envVars:["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"],filePaths:[vd(kd(),".copilot","credentials.json")]},agy:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[vd(kd(),".gemini","oauth_creds.json")]}}});var oT={};ie(oT,{initWorkspace:()=>nT,runWorkspace:()=>zF,setWorkspaceProvider:()=>sT});import{copyFileSync as JF,cpSync as XF,existsSync as Le,mkdirSync as er,readdirSync as jd,renameSync as GF,rmSync as ca,statSync as ua,writeFileSync as VF}from"node:fs";import{spawnSync as KF}from"node:child_process";import{homedir as Qb}from"node:os";import{dirname as Ad,join as Ts}from"node:path";async function zF(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(YF),0;switch(r){case"list":return ZF(n,e);case"create":return QF(n,e);case"use":return eU(n,e);case"show":return tU(n,e);case"delete":return rU(n,e);case"migrate":return nU(n,e);case"init":return nT(n,e);case"set-provider":return sT(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function tT(){let t=ks(),e=[],r=new Set,n=nr.default,s=Le(mn()),o=Le(gt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Ot(n):mn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Le(rr())){let i;try{i=jd(rr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Pe(a))continue;let l=!1;try{l=ua(gt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Ot(a),active:t===a,legacy:!1}),r.add(a))}}return e}function ZF(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==0)return w(e,"usage: lmctl workspace list");let n=tT();if(M(r,"--json"))return W(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2132
+ `)}return 0}function QF(t,e){let r=P(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Pe(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=gt(n);if(Le(s))return w(e,`workspace already exists: ${n} (${s})`);let o=j(r,"--docroot")??ma(n);er(s,{recursive:!0}),er(o,{recursive:!0});let i=Ot(n);er(Ad(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2133
+ `),0}function eU(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!Pe(n))return w(e,`invalid workspace name: ${n}`);if(n!==nr.default&&!Le(gt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Ss();return er(Ad(s),{recursive:!0}),VF(s,`${n}
2133
2134
  `),M(r,"--json")?W(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2134
- `),0}function tU(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace show <name>");if(!Pe(n))return w(e,`invalid workspace name: ${n}`);let s=tT().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=Le(s.db_path)?ca(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Le(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return M(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2135
- `),0}function rU(t,e){let r=P(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Pe(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===nr.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(ks()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=gt(n);return Le(o)?(la(o,{recursive:!0,force:!0}),M(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2136
- `),0):w(e,`workspace not found: ${n}`)}function $d(t,e,r){try{GF(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
2137
- `),ca(t).isDirectory()?XF(t,e,{recursive:!0}):JF(t,e),!Le(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);la(t,{recursive:!0,force:!0})}function nU(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=ma(),o=rr(),i=[],a=(f,m)=>{if(n)W(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2135
+ `),0}function tU(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace show <name>");if(!Pe(n))return w(e,`invalid workspace name: ${n}`);let s=tT().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=Le(s.db_path)?ua(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Le(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return M(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2136
+ `),0}function rU(t,e){let r=P(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Pe(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===nr.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(ks()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=gt(n);return Le(o)?(ca(o,{recursive:!0,force:!0}),M(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2137
+ `),0):w(e,`workspace not found: ${n}`)}function xd(t,e,r){try{GF(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
2138
+ `),ua(t).isDirectory()?XF(t,e,{recursive:!0}):JF(t,e),!Le(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);ca(t,{recursive:!0,force:!0})}function nU(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=pa(),o=rr(),i=[],a=(f,m)=>{if(n)W(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2138
2139
  `);e.stdout.write(f?`migration complete
2139
2140
  `:`${m??"nothing to migrate"}
2140
- `)}return 0};if(!Le(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Nd(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return ca(Ts(s,f)).isDirectory()}catch{return!1}});if(c.length===0)la(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Le(o))$d(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Le(Ts(o,m)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);er(o,{recursive:!0});for(let m of c)$d(Ts(s,m),Ts(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{Nd(s).length===0&&(la(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Jd(),d=Ss();return Le(u)&&(Le(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):($d(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function rT(t,e){return KF(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function iU(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function eT(t){return t==="~"?Qb():t.startsWith("~/")?Ts(Qb(),t.slice(2)):t}async function nT(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${dn.join(", ")}.`].join(`
2141
+ `)}return 0};if(!Le(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=jd(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return ua(Ts(s,f)).isDirectory()}catch{return!1}});if(c.length===0)ca(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Le(o))xd(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Le(Ts(o,m)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);er(o,{recursive:!0});for(let m of c)xd(Ts(s,m),Ts(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{jd(s).length===0&&(ca(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Gd(),d=Ss();return Le(u)&&(Le(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(xd(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function rT(t,e){return KF(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function iU(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function eT(t){return t==="~"?Qb():t.startsWith("~/")?Ts(Qb(),t.slice(2)):t}async function nT(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${dn.join(", ")}.`].join(`
2141
2142
  `)+`
2142
2143
  `),0;let s=P(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return w(e,s.error);if(s.positionals.length!==0)return w(e,n);let o=r.spawn??rT,a=dn.map(k=>bs(k,o)).filter(k=>k.status==="ok"||k.status==="unverified").map(k=>k.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${dn.join("|")} first (see \`lmctl init\`)
2143
2144
  `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??iU,u=r.promptLine!==void 0||l,d=k=>(e.stderr.write(`error: ${k} is required in non-interactive mode (no TTY); pass it explicitly
2144
2145
  `),2),f,m=j(s,"--name");if(m!==void 0){if(!Pe(m))return e.stderr.write(`error: invalid workspace name: ${m}
2145
2146
  `),2;f=m}else{if(!u)return d("--name");for(;;){let k=(await c("Workspace name [default]: ")).trim(),R=k.length===0?"default":k;if(Pe(R)){f=R;break}e.stderr.write(`invalid workspace name: ${R} (letters/digits/.-_, start alnum, \u226464)
2146
2147
  `)}}let p=gt(f);if(Le(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2147
- `),2;let h,g=j(s,"--basedir"),_=fa(f);if(g!==void 0)h=eT(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:eT(k)}let T={};for(let k of["provider1","provider2","provider3"]){let R=j(s,`--${k}`),L=sU[k],B=a.includes(L)?L:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${k} ${R} is not an available provider (available: ${a.join(", ")})
2148
+ `),2;let h,g=j(s,"--basedir"),_=ma(f);if(g!==void 0)h=eT(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:eT(k)}let T={};for(let k of["provider1","provider2","provider3"]){let R=j(s,`--${k}`),L=sU[k],B=a.includes(L)?L:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${k} ${R} is not an available provider (available: ${a.join(", ")})
2148
2149
  `),2;T[k]=R;continue}if(!u)return d(`--${k}`);for(;;){let ee=(await c(`${k} (${oU[k]}) [${B}]: `)).trim(),x=ee.length===0?B:ee;if(a.includes(x)){T[k]=x;break}e.stderr.write(`not an available provider: ${x} (available: ${a.join(", ")})
2149
- `)}}er(p,{recursive:!0}),er(h,{recursive:!0});let S=Ot(f);er(xd(S),{recursive:!0});let I=pe({path:S});try{I.setConfig("project.docroot",h),I.setConfig("workspace.provider1",T.provider1),I.setConfig("workspace.provider2",T.provider2),I.setConfig("workspace.provider3",T.provider3)}finally{I.close()}let v={name:f,dir:p,db_path:S,basedir:h,providers:{...T}};return M(s,"--json")?W(e,v):(e.stdout.write(`created workspace ${f} at ${p}
2150
+ `)}}er(p,{recursive:!0}),er(h,{recursive:!0});let S=Ot(f);er(Ad(S),{recursive:!0});let I=pe({path:S});try{I.setConfig("project.docroot",h),I.setConfig("workspace.provider1",T.provider1),I.setConfig("workspace.provider2",T.provider2),I.setConfig("workspace.provider3",T.provider3)}finally{I.close()}let v={name:f,dir:p,db_path:S,basedir:h,providers:{...T}};return M(s,"--json")?W(e,v):(e.stdout.write(`created workspace ${f} at ${p}
2150
2151
  `),e.stdout.write(` basedir: ${h}
2151
2152
  `),e.stdout.write(` provider1=${T.provider1} provider2=${T.provider2} provider3=${T.provider3}
2152
2153
  `),e.stdout.write(`activate it with: lmctl workspace use ${f}
@@ -2156,17 +2157,17 @@ ${c}`;return a.status===0&&(s.successPattern?s.successPattern.test(u):!0)?{provi
2156
2157
  `),2;let c=r.spawn??rT,u=dn.map(p=>bs(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${dn.join("|")} first (see \`lmctl init\`)
2157
2158
  `),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
2158
2159
  `),2;let d=e.dal===void 0,f=e.dal??pe({path:de()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=pn()??nr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2159
- `),0}var YF,dn,sU,oU,iT=E(()=>{"use strict";Ce();Id();Se();qe();YF=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2160
+ `),0}var YF,dn,sU,oU,iT=E(()=>{"use strict";Ce();Nd();Se();qe();YF=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2160
2161
 
2161
2162
  Manage isolated workspace state directories, active workspace selection,
2162
2163
  legacy profile migration, and configured provider slots.
2163
2164
  `;dn=["claude","codex","gemini","qwen"],sU={provider1:"claude",provider2:"codex",provider3:"gemini"},oU={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var cT={};ie(cT,{runProject:()=>uU});import{existsSync as aU,statSync as lU}from"node:fs";import{join as lT}from"node:path";async function uU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(cU),0;try{return await J(e,s=>{switch(r){case"create":return yU(n,e,s);case"list":return EU(n,e,s);case"show":return gU(n,e,s);case"status":return wU(n,e,s);case"workflow":return dU(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return fe(e,s)}}function dU(t,e,r){let[n,...s]=t;switch(n){case"add":return fU(s,e,r);case"list":return mU(s,e,r);case"show":return pU(s,e,r);case"remove":return hU(s,e,r);case"enable":return aT(s,e,r,!0);case"disable":return aT(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function fU(t,e,r){let n=P(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=j(n,"--condition")??null;if(l!==null)try{Ht(l)}catch{return w(e,"invalid --condition JEXL")}let c=_U(j(n,"--params"));if(typeof c=="string")return w(e,c);let u=j(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
2164
2165
  `),0}function mU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?W(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2165
2166
  `)}${i.length>0?`
2166
- `:""}`),0}function pU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=jd(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(M(n,"--json")?W(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2167
- `),0)}function hU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=jd(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?w(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2168
- `),0):w(e,`project workflow not found: ${s}`)}function aT(t,e,r,n){let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let o=jd(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return w(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?w(e,`project workflow not found: ${o}`):(M(s,"--json")?W(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2169
- `),0)}function _U(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function jd(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function gU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return M(n,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2167
+ `:""}`),0}function pU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Rd(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(M(n,"--json")?W(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2168
+ `),0)}function hU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Rd(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?w(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2169
+ `),0):w(e,`project workflow not found: ${s}`)}function aT(t,e,r,n){let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let o=Rd(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return w(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?w(e,`project workflow not found: ${o}`):(M(s,"--json")?W(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2170
+ `),0)}function _U(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function Rd(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function gU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return M(n,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2170
2171
  `),0}function wU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return M(n,"--json")?W(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2171
2172
  `),0}function yU(t,e,r){let n=P(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=j(n,"--owner"),i=j(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=j(n,"--local-path")??(l!==null?lT(l,u):void 0),f=j(n,"--workflow"),m=j(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=j(n,"--test-argv"),g=null;if(h!==void 0)try{let I=JSON.parse(h);if(!Array.isArray(I)||!I.every(v=>typeof v=="string")||I.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(I)}catch{return w(e,"--test-argv must be valid JSON")}let _=j(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let T=_!==void 0?_:bU(d)||Rn(d)?"folder":"db",S=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:j(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return M(n,"--json")?W(e,S):e.stdout.write(`created project ${S.name}
2172
2173
  `),0}function EU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
@@ -2175,7 +2176,7 @@ legacy profile migration, and configured provider slots.
2175
2176
 
2176
2177
  Create, list, inspect, and check projects. The workflow subcommand manages
2177
2178
  per-project workflow bindings and routing conditions.
2178
- `});import{createHash as TU,randomBytes as SU}from"node:crypto";import{readFile as kU}from"node:fs/promises";function dT(t=new Date,e=SU(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function vU(t){return TU("sha256").update(t).digest("hex")}async function fT(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await kU(n);return{path:r,sha256:vU(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function mT(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 Ad=E(()=>{"use strict"});import{spawnSync as pT}from"node:child_process";import{mkdir as Rd,writeFile as hT,readFile as IU,rm as _T}from"node:fs/promises";import{tmpdir as $U}from"node:os";import{dirname as gT,join as Od}from"node:path";async function wT(t){let e=t.stagingDir??Od($U(),`lmctl-diag-${t.ticketId}`),r=Od(e,`diagnostic-${t.ticketId}`);await Rd(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Od(r,d);if(await Rd(gT(m),{recursive:!0}),typeof f=="string")await hT(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await hT(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2179
+ `});import{createHash as TU,randomBytes as SU}from"node:crypto";import{readFile as kU}from"node:fs/promises";function dT(t=new Date,e=SU(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function vU(t){return TU("sha256").update(t).digest("hex")}async function fT(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await kU(n);return{path:r,sha256:vU(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function mT(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 Od=E(()=>{"use strict"});import{spawnSync as pT}from"node:child_process";import{mkdir as Ld,writeFile as hT,readFile as IU,rm as _T}from"node:fs/promises";import{tmpdir as $U}from"node:os";import{dirname as gT,join as Cd}from"node:path";async function wT(t){let e=t.stagingDir??Cd($U(),`lmctl-diag-${t.ticketId}`),r=Cd(e,`diagnostic-${t.ticketId}`);await Ld(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Cd(r,d);if(await Ld(gT(m),{recursive:!0}),typeof f=="string")await hT(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await hT(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2179
2180
  `;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
2180
2181
  `:`${d.pid}
2181
2182
  # source=${d.pid_source} alive=${String(d.pid_alive)}
@@ -2193,29 +2194,29 @@ per-project workflow bindings and routing conditions.
2193
2194
  `:`# source=${f}
2194
2195
  # tail_lines=${d.tail_lines}
2195
2196
  `;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
2196
- `:""}`)}if(await s("README.md",NU(t)),t.sanitized)for(let d of n){let f=await IU(d.absPath);try{Yd(d.bundlePath,f.toString("utf8"))}catch(m){throw await _T(e,{recursive:!0,force:!0}),m instanceof sr,m}}let i=await fT(n),a=mT({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await Rd(gT(t.outputPath),{recursive:!0});let l=pT("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=pT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await _T(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function NU(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2197
- `)}var yT=E(()=>{"use strict";Ad();vs()});import{spawnSync as xU}from"node:child_process";import{stat as jU}from"node:fs/promises";async function ET(t){try{if(!(await jU(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return AU(t);case"hq":return RU(t)}}function AU(t){let r=xU("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function RU(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var bT=E(()=>{"use strict"});var ST={};ie(ST,{parseDiagnoseArgs:()=>TT,runDiagnose:()=>CU});import{tmpdir as OU}from"node:os";import{join as LU}from"node:path";async function CU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${PU()}
2197
+ `:""}`)}if(await s("README.md",NU(t)),t.sanitized)for(let d of n){let f=await IU(d.absPath);try{Zd(d.bundlePath,f.toString("utf8"))}catch(m){throw await _T(e,{recursive:!0,force:!0}),m instanceof sr,m}}let i=await fT(n),a=mT({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await Ld(gT(t.outputPath),{recursive:!0});let l=pT("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=pT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await _T(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function NU(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2198
+ `)}var yT=E(()=>{"use strict";Od();vs()});import{spawnSync as xU}from"node:child_process";import{stat as jU}from"node:fs/promises";async function ET(t){try{if(!(await jU(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return AU(t);case"hq":return RU(t)}}function AU(t){let r=xU("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function RU(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var bT=E(()=>{"use strict"});var ST={};ie(ST,{parseDiagnoseArgs:()=>TT,runDiagnose:()=>CU});import{tmpdir as OU}from"node:os";import{join as LU}from"node:path";async function CU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${PU()}
2198
2199
  `),0;let r=TT(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2199
2200
  `),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
2200
2201
  `),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2201
- `),2;let n=dT(),s=r.outputPath??DU(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await J(e,async i=>{let a=await Zd({dal:i,include:r.include,dbPath:de(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await wT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:or(),sanitized:!r.noSanitize})}catch(d){if(d instanceof sr)return e.stderr.write(`sanitization failed: ${d.message}
2202
+ `),2;let n=dT(),s=r.outputPath??DU(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await J(e,async i=>{let a=await ef({dal:i,include:r.include,dbPath:de(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await wT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:or(),sanitized:!r.noSanitize})}catch(d){if(d instanceof sr)return e.stderr.write(`sanitization failed: ${d.message}
2202
2203
  `),2;throw d}let c=await ET({mode:o,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),u={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(u,null,2)}
2203
2204
  `):(e.stdout.write(`ticket: ${n}
2204
2205
  `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2205
2206
  `),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2206
2207
  `)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
2207
2208
  `),1}}function TT(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!MU(o))return`unknown section: ${o} (expected one of ${Is.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function MU(t){return Is.includes(t)}function DU(t){return LU(OU(),`lmctl-diag-${t}.tar.gz`)}function PU(){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(`
2208
- `)}var kT=E(()=>{"use strict";$s();yT();Ad();vs();bT();qe();Se()});var AT={};ie(AT,{ATTENTION_STATES:()=>Cd,DAEMON_INTERVAL_FAST_MS:()=>Ld,REQUIRED_TEAM_ALIASES:()=>IT,chooseDiagnoses:()=>xT,collectEvidence:()=>NT,diagnose:()=>$T,renderReport:()=>jT,runDiagnosePrompt:()=>WU});function $T(t,e){let r=NT(t,e),n=xT(r);return jT(r,n)}function NT(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:es(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=UU(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=IT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function xT(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>Ld&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${Ld}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>Cd.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function jT(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${FU(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>Cd.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2209
+ `)}var kT=E(()=>{"use strict";$s();yT();Od();vs();bT();qe();Se()});var AT={};ie(AT,{ATTENTION_STATES:()=>Dd,DAEMON_INTERVAL_FAST_MS:()=>Md,REQUIRED_TEAM_ALIASES:()=>IT,chooseDiagnoses:()=>xT,collectEvidence:()=>NT,diagnose:()=>$T,renderReport:()=>jT,runDiagnosePrompt:()=>WU});function $T(t,e){let r=NT(t,e),n=xT(r);return jT(r,n)}function NT(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:es(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=UU(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=IT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function xT(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>Md&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${Md}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>Dd.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function jT(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${FU(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>Dd.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2209
2210
  `)+`
2210
2211
  `}function FU(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 UU(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function WU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${vT()}
2211
2212
  `),0;let r=t.filter(s=>!s.startsWith("--"));if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2212
2213
  `),e.stderr.write(`${vT()}
2213
2214
  `),2;let n=r[0];try{return await J(e,s=>(e.stdout.write($T(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2214
2215
  `),1}}function vT(){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(`
2215
- `)}var IT,Ld,Cd,RT=E(()=>{"use strict";nu();Se();IT=["Coder","Reviewer1","Polisher"],Ld=3e4,Cd=new Set(["attention_needed","paused","escalation"])});var MT={};ie(MT,{appendIntent:()=>CT,resolveIntentLogPath:()=>LT,runStatus:()=>YU});import{appendFileSync as BU,mkdirSync as qU}from"node:fs";import{homedir as HU}from"node:os";import{dirname as JU,join as XU}from"node:path";function LT(){return process.env.LMCTL_INTENT_LOG??XU(HU(),".lmctl","recent-intents.log")}function CT(t){try{let e=LT();qU(JU(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});BU(e,`${r}
2216
+ `)}var IT,Md,Dd,RT=E(()=>{"use strict";su();Se();IT=["Coder","Reviewer1","Polisher"],Md=3e4,Dd=new Set(["attention_needed","paused","escalation"])});var MT={};ie(MT,{appendIntent:()=>CT,resolveIntentLogPath:()=>LT,runStatus:()=>YU});import{appendFileSync as BU,mkdirSync as qU}from"node:fs";import{homedir as HU}from"node:os";import{dirname as JU,join as XU}from"node:path";function LT(){return process.env.LMCTL_INTENT_LOG??XU(HU(),".lmctl","recent-intents.log")}function CT(t){try{let e=LT();qU(JU(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});BU(e,`${r}
2216
2217
  `)}catch{}}async function YU(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(KU),0;let r=P(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=j(r,"--project"),o=M(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):J(e,i=>{let a=zU(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2217
2218
  `),1;if(a.kind==="no-web-focus")return e.stderr.write(`no active webui focus; run lmctl status --web after navigating webui to a project, or omit --web.
2218
- `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=ZU(i,l,a.source);return o?W(e,c):e.stdout.write(sW(c)),CT({verb:"status",args:t}),0})}function zU(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=fd(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function ZU(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=QU(t,e.id,VU),a=eW(t,e.id),l=tW(t,e.id,GU),c=rW(t);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(u=>({id:u.id,kind:u.kind,severity:u.severity,payload_summary:nW(u.payload),created_at:u.created_at}))},recent_runs:l.map(u=>({id:u.id,workflow_name:u.workflow_name,current_state:u.current_state,terminal_state:u.terminal_state,started_at:u.started_at,ended_at:u.ended_at})),providers_active:c,context_source:r}}function QU(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function eW(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function tW(t,e,r){return t.db.prepare(`
2219
+ `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=ZU(i,l,a.source);return o?W(e,c):e.stdout.write(sW(c)),CT({verb:"status",args:t}),0})}function zU(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=md(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function ZU(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=QU(t,e.id,VU),a=eW(t,e.id),l=tW(t,e.id,GU),c=rW(t);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(u=>({id:u.id,kind:u.kind,severity:u.severity,payload_summary:nW(u.payload),created_at:u.created_at}))},recent_runs:l.map(u=>({id:u.id,workflow_name:u.workflow_name,current_state:u.current_state,terminal_state:u.terminal_state,started_at:u.started_at,ended_at:u.ended_at})),providers_active:c,context_source:r}}function QU(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function eW(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function tW(t,e,r){return t.db.prepare(`
2219
2220
  SELECT r.*, w.name AS workflow_name
2220
2221
  FROM run r
2221
2222
  JOIN job j ON j.id = r.job_id
@@ -2224,14 +2225,14 @@ per-project workflow bindings and routing conditions.
2224
2225
  ORDER BY r.id DESC
2225
2226
  LIMIT ?
2226
2227
  `).all(e,r)}function rW(t){let e=t.getConfig("providers.active");if(e===null||e.length===0)return null;try{let r=JSON.parse(e);if(Array.isArray(r)&&r.every(n=>typeof n=="string"))return r}catch{}return null}function nW(t){if(t===null||t.length===0)return null;try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let r=e,n=["message","detail","reason","action","state"];for(let s of n){let o=r[s];if(typeof o=="string"&&o.length>0)return OT(o,100)}}}catch{}return OT(t,100)}function OT(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function sW(t){let e=[];if(e.push(`project: ${t.project.name}`),e.push(` local_path: ${t.project.local_path}`),e.push(` workflow: ${t.project.workflow_name}`),t.project.team_name!==null&&e.push(` team: ${t.project.team_name}`),e.push(""),t.active_run===null)e.push("active run: none");else{let r=t.active_run.paused_at!==null?`paused at ${t.active_run.current_state??"?"}`:t.active_run.current_state??"unknown";e.push(`active run: #${t.active_run.id} (${r}, started ${t.active_run.started_at})`)}if(e.push(""),t.attentions.unacked_count===0)e.push("attentions: none");else{e.push(`attentions: ${t.attentions.unacked_count} unread`);for(let r of t.attentions.recent){let n=r.payload_summary===null?"":` \u2014 ${r.payload_summary}`;e.push(` - ${r.kind}: #${r.id}${n} (${r.created_at})`)}}if(e.push(""),t.recent_runs.length===0)e.push("recent runs: none");else{e.push("recent runs:");for(let r of t.recent_runs){let n=r.terminal_state??r.current_state??"pending";e.push(` #${r.id} ${r.workflow_name} ${n} (${r.started_at})`)}}return e.push(""),t.providers_active===null?e.push("providers active: (run `lmctl init` to detect)"):t.providers_active.length===0?e.push("providers active: none"):e.push(`providers active: ${t.providers_active.join(", ")}`),e.push(""),e.join(`
2227
- `)}var GU,VU,KU,DT=E(()=>{"use strict";Se();pd();GU=5,VU=10,KU=`usage: lmctl status [--project NAME|--web] [--json]
2228
+ `)}var GU,VU,KU,DT=E(()=>{"use strict";Se();hd();GU=5,VU=10,KU=`usage: lmctl status [--project NAME|--web] [--json]
2228
2229
 
2229
2230
  Show the current project context, active run, unacked attentions, recent runs,
2230
2231
  and active providers. Defaults to resolving the project from the current
2231
2232
  working directory; --project selects a project by name, and --web uses the
2232
2233
  web UI focus.
2233
- `});var WT="Failed to find Response internal state key",BT="SQLite is an experimental feature and might change at any time",Fd=Symbol.for("lmctl.suppressThirdpartyNoise.installed"),Ud=globalThis;if(Ud[Fd]!==!0){Ud[Fd]=!0;let t=console.warn.bind(console),e=process.emitWarning.bind(process);console.warn=(...r)=>{process.env.LMCTL_DEBUG!=="1"&&r.length===1&&r[0]===WT||t(...r)},process.emitWarning=(r,...n)=>{let s=r instanceof Error?r.message:r,o=typeof n[0]=="string"?n[0]:void 0;if(!(process.env.LMCTL_DEBUG!=="1"&&o==="ExperimentalWarning"&&s===BT))return e(r,...n)}}qe();$s();import{pathToFileURL as oW}from"node:url";var Pd=`usage: lmctl [--db PATH] [--workspace NAME] <command> [args]
2234
- `,Md=`${Pd}
2234
+ `});var WT="Failed to find Response internal state key",BT="SQLite is an experimental feature and might change at any time",Wd=Symbol.for("lmctl.suppressThirdpartyNoise.installed"),Bd=globalThis;if(Bd[Wd]!==!0){Bd[Wd]=!0;let t=console.warn.bind(console),e=process.emitWarning.bind(process);console.warn=(...r)=>{process.env.LMCTL_DEBUG!=="1"&&r.length===1&&r[0]===WT||t(...r)},process.emitWarning=(r,...n)=>{let s=r instanceof Error?r.message:r,o=typeof n[0]=="string"?n[0]:void 0;if(!(process.env.LMCTL_DEBUG!=="1"&&o==="ExperimentalWarning"&&s===BT))return e(r,...n)}}qe();$s();import{pathToFileURL as oW}from"node:url";var Ud=`usage: lmctl [--db PATH] [--workspace NAME] <command> [args]
2235
+ `,Pd=`${Ud}
2235
2236
  Setup & status:
2236
2237
  init Detect provider CLIs, verify auth, and persist active providers.
2237
2238
  status Show current project context, active run, attentions, recent runs, and providers.
@@ -2259,6 +2260,7 @@ Teams & sessions:
2259
2260
 
2260
2261
  Workflows & projects:
2261
2262
  workflow Load, author, list, sync, export, or run workflow definitions.
2263
+ run Run a workflow (alias for 'workflow run'); accepts an https:// URL.
2262
2264
  project Create, inspect, and manage projects and project-workflow bindings.
2263
2265
  workspace Manage isolated workspace state directories and provider slots.
2264
2266
  plan Generate a starter lmctl team document for a directory.
@@ -2269,12 +2271,12 @@ Maintenance:
2269
2271
  db Database utilities, including the documented downgrade stub.
2270
2272
 
2271
2273
  Run 'lmctl help <command>' for command-specific help.
2272
- `,iW=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","info","ls","lint","seed","connect","clone","plan","workflow","project","workspace","diagnose","diagnose-prompt","init","status","db"]);function Dd(t,e){return t.stderr.write(`error: ${e}
2273
- ${Pd}Run 'lmctl help' for usage.
2274
+ `,iW=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","info","ls","lint","seed","connect","clone","plan","workflow","run","project","workspace","diagnose","diagnose-prompt","init","status","db"]);function Fd(t,e){return t.stderr.write(`error: ${e}
2275
+ ${Ud}Run 'lmctl help' for usage.
2274
2276
  `),2}function FT(t,e){return t.stderr.write(`error: unknown command: ${e}
2275
- ${Pd}Run 'lmctl help' for usage.
2276
- `),1}async function aW(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Dd(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Dd(e,"missing value for --workspace");if(!Pe(l))return Dd(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${or()}
2277
- `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Md),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(Md),0):iW.has(i)?PT(i,[...a,"--help"],e):FT(e,i)}Hd(de(),e.stderr),Xd(e.stderr);let[s,...o]=r;return s===void 0?(e.stdout.write(Md),0):PT(s,o,e)}async function PT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Il(),mp));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Hl(),Bp));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(Qy(),Zy));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(tE(),eE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(EE(),yE));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(IE(),vE));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(LE(),OE));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(ME(),CE));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(FE(),PE));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(JE(),HE));return n(e,r)}case"info":{let{runInfo:n}=await Promise.resolve().then(()=>(GE(),XE));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(YE(),KE));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(od(),sd));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(od(),sd));return n(e,r)}case"connect":{let{runConnect:n}=await Promise.resolve().then(()=>(Eb(),yb));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(vb(),kb));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(xb(),Nb));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Ob(),Rb));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Yb(),Kb));return n(e,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(iT(),oT));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(uT(),cT));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(kT(),ST));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(RT(),AT));return n(e,r)}case"init":{let{runInit:n}=await Promise.resolve().then(()=>(Id(),Zb));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(DT(),MT));return n(e,r)}case"db":return lW(e,r);default:return FT(r,t)}}function lW(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2277
+ ${Ud}Run 'lmctl help' for usage.
2278
+ `),1}async function aW(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Fd(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Fd(e,"missing value for --workspace");if(!Pe(l))return Fd(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${or()}
2279
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Pd),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(Pd),0):iW.has(i)?PT(i,[...a,"--help"],e):FT(e,i)}Xd(de(),e.stderr),Vd(e.stderr);let[s,...o]=r;return s===void 0?(e.stdout.write(Pd),0):PT(s,o,e)}async function PT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>($l(),hp));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Jl(),Hp));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(tE(),eE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(nE(),rE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(TE(),bE));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(NE(),$E));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(ME(),CE));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(PE(),DE));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(WE(),UE));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(GE(),XE));return n(e,r)}case"info":{let{runInfo:n}=await Promise.resolve().then(()=>(KE(),VE));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(ZE(),zE));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(id(),od));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(id(),od));return n(e,r)}case"connect":{let{runConnect:n}=await Promise.resolve().then(()=>(Tb(),bb));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>($b(),Ib));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(Ab(),jb));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Cb(),Lb));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Sd(),Td));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Sd(),Td));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(iT(),oT));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(uT(),cT));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(kT(),ST));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(RT(),AT));return n(e,r)}case"init":{let{runInit:n}=await Promise.resolve().then(()=>(Nd(),Zb));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(DT(),MT));return n(e,r)}case"db":return lW(e,r);default:return FT(r,t)}}function lW(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2278
2280
 
2279
2281
  Database utilities. The downgrade command is currently a documented stub;
2280
2282
  restore from backup for rollback and use normal migrations for forward changes.