@lmctl-ai/lmctl 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -1,18 +1,18 @@
1
- var hT=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{for(var r in e)hT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Sr,readdirSync as yT,readFileSync as ET}from"node:fs";import{homedir as bT,platform as gd}from"node:os";import{join as _t}from"node:path";function Zt(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:_t(bT(),TT)}function cn(){return _t(Zt(),wd)}function Qt(){return _t(Zt(),ST)}function ht(t){return _t(Qt(),t)}function Ot(t){return _t(ht(t),wd)}function ta(){let t=[],e=new Set,r=o=>{Sr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:cn(),kind:"legacy"});let n=Qt();if(!Sr(n))return t;let s;try{s=yT(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 ra(t){return _t(ht(t),"projects")}function ms(){return _t(Zt(),kT)}function Pe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function ps(){let t=ms();if(!Sr(t))return null;try{let e=ET(t,"utf8").trim();return e.length===0||!Pe(e)?null:e}catch{return null}}function un(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Pe(t)?t:ps()}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=un();if(e!==null)return Ot(e);let r=cn();return Sr(r)||!Sr(Qt())?r:Ot(yd)}function NT(t,e=gd()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Ed(t,e=process.stderr,r=gd()){NT(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 na(){return _t(Zt(),vT)}function bd(){return _t(Zt(),IT)}function $T(){try{return Sr(na())}catch{return!1}}function Td(t=process.stderr){$T()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
- `)}var TT,wd,ST,kT,yd,vT,IT,er,qe=T(()=>{"use strict";TT=".lmctl",wd="state.db",ST="workspaces",kT="active-workspace",yd="default",vT="profiles",IT="active-profile";er={default:yd}});function RT(t){for(let e of AT)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 OT(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function MT(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 dn(t){let e=t;for(let{re:r,replacement:n}of xT)e=e.replace(r,n);return e=e.replace(CT,r=>!MT(r)||RT(r)?r:Sd),e=e.replace(LT,r=>OT(r)?r:Sd),e}function fn(t){return t.split(`
1
+ var hT=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{for(var r in e)hT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Sr,readdirSync as yT,readFileSync as ET}from"node:fs";import{homedir as bT,platform as gd}from"node:os";import{join as _t}from"node:path";function zt(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:_t(bT(),TT)}function cn(){return _t(zt(),wd)}function Zt(){return _t(zt(),ST)}function ht(t){return _t(Zt(),t)}function Rt(t){return _t(ht(t),wd)}function ta(){let t=[],e=new Set,r=o=>{Sr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:cn(),kind:"legacy"});let n=Zt();if(!Sr(n))return t;let s;try{s=yT(n)}catch{return t}for(let o of s.sort())Pe(o)&&r({workspace_name:o,db_path:Rt(o),kind:"workspace"});return t}function ra(t){return _t(ht(t),"projects")}function ps(){return _t(zt(),kT)}function Pe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function _s(){let t=ps();if(!Sr(t))return null;try{let e=ET(t,"utf8").trim();return e.length===0||!Pe(e)?null:e}catch{return null}}function un(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Pe(t)?t:_s()}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=un();if(e!==null)return Rt(e);let r=cn();return Sr(r)||!Sr(Zt())?r:Rt(yd)}function NT(t,e=gd()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Ed(t,e=process.stderr,r=gd()){NT(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 na(){return _t(zt(),vT)}function bd(){return _t(zt(),IT)}function $T(){try{return Sr(na())}catch{return!1}}function Td(t=process.stderr){$T()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
+ `)}var TT,wd,ST,kT,yd,vT,IT,Qt,qe=T(()=>{"use strict";TT=".lmctl",wd="state.db",ST="workspaces",kT="active-workspace",yd="default",vT="profiles",IT="active-profile";Qt={default:yd}});function RT(t){for(let e of AT)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 OT(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function MT(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 dn(t){let e=t;for(let{re:r,replacement:n}of xT)e=e.replace(r,n);return e=e.replace(CT,r=>!MT(r)||RT(r)?r:Sd),e=e.replace(LT,r=>OT(r)?r:Sd),e}function fn(t){return t.split(`
4
4
  `).map(e=>dn(e)).join(`
5
- `)}function vd(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:dn(e)}}function Ct(t){if(typeof t=="string")return dn(t);if(Array.isArray(t))return t.map(e=>Ct(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:Ct(n):e[r]=Ct(n)}return e}return t}function Id(t,e){for(let{name:r,re:n}of DT){let s=e.match(n);if(s!==null&&!s[0].includes(ze))throw new tr(t,r)}}var ze,jT,Sd,kd,xT,AT,CT,LT,DT,tr,_s=T(()=>{"use strict";ze="[REDACTED]",jT="[REDACTED_EMAIL]",Sd="[REDACTED_IP]",kd="[USER]",xT=[{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${kd}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${kd}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:jT}],AT=["127.","10.","192.168.","0.0.0.0"];CT=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,LT=/\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;DT=[{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"'`]+/}],tr=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 sa}from"node:child_process";import{readFileSync as PT}from"node:fs";import{readFile as ia,stat as Nd}from"node:fs/promises";import{homedir as FT}from"node:os";import{join as UT}from"node:path";import{fileURLToPath as WT}from"node:url";function rr(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(PT(WT(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function $d(t){let e=new Set(t.include??hs),r={};return e.has("serve")&&(r.serve=await qT(t)),e.has("db")&&(r.db=HT(t)),e.has("runs")&&(r.runs=JT(t)),e.has("jobs")&&(r.jobs=XT(t)),e.has("attentions")&&(r.attentions=GT(t)),e.has("env")&&(r.env=await VT(t)),e.has("intents")&&(r.intents=await YT(t)),r}async function qT(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 ia(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 ia(r,"utf8")).split(`
5
+ `)}function vd(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:dn(e)}}function Ot(t){if(typeof t=="string")return dn(t);if(Array.isArray(t))return t.map(e=>Ot(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:Ot(n):e[r]=Ot(n)}return e}return t}function Id(t,e){for(let{name:r,re:n}of DT){let s=e.match(n);if(s!==null&&!s[0].includes(ze))throw new er(t,r)}}var ze,jT,Sd,kd,xT,AT,CT,LT,DT,er,hs=T(()=>{"use strict";ze="[REDACTED]",jT="[REDACTED_EMAIL]",Sd="[REDACTED_IP]",kd="[USER]",xT=[{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${kd}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${kd}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:jT}],AT=["127.","10.","192.168.","0.0.0.0"];CT=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,LT=/\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;DT=[{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"'`]+/}],er=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 sa}from"node:child_process";import{readFileSync as PT}from"node:fs";import{readFile as ia,stat as Nd}from"node:fs/promises";import{homedir as FT}from"node:os";import{join as UT}from"node:path";import{fileURLToPath as WT}from"node:url";function tr(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(PT(WT(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function $d(t){let e=new Set(t.include??gs),r={};return e.has("serve")&&(r.serve=await qT(t)),e.has("db")&&(r.db=HT(t)),e.has("runs")&&(r.runs=JT(t)),e.has("jobs")&&(r.jobs=XT(t)),e.has("attentions")&&(r.attentions=GT(t)),e.has("env")&&(r.env=await VT(t)),e.has("intents")&&(r.intents=await YT(t)),r}async function qT(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 ia(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 ia(r,"utf8")).split(`
6
6
  `),f=d.slice(Math.max(0,d.length-n));c=f.length,a=fn(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 HT(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(i=>i.integrity_check??JSON.stringify(i)).join(`
8
8
  `)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function JT(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 ${oa} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${oa} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${oa} FROM run
9
9
  WHERE terminal_state IS NULL
10
10
  AND started_at < ?
11
- ORDER BY started_at ASC LIMIT 50`,s);return{last_50:Ct(o),stale:Ct(a),paused:Ct(i)}}function XT(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 GT(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:Ct(r)}}async function VT(t){let e=rr(),r=process.version,n=sa("uname",["-a"],{encoding:"utf8"}),s=fn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Nd(i);let u=sa("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 Nd(a);let u=sa("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":fn(o.join(`
11
+ ORDER BY started_at ASC LIMIT 50`,s);return{last_50:Ot(o),stale:Ot(a),paused:Ot(i)}}function XT(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 GT(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:Ot(r)}}async function VT(t){let e=tr(),r=process.version,n=sa("uname",["-a"],{encoding:"utf8"}),s=fn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Nd(i);let u=sa("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 Nd(a);let u=sa("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":fn(o.join(`
13
13
  `)),c=[];for(let u of BT){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(vd(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function KT(){return process.env.LMCTL_INTENT_LOG??UT(FT(),".lmctl","recent-intents.log")}async function YT(t){let e=t.intentLog??KT(),r=t.intentLogTailLines??500;try{let s=(await ia(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:fn(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 hs,BT,oa,gs=T(()=>{"use strict";_s();hs=["serve","db","runs","jobs","attentions","env","intents"];BT=["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"];oa=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import zT from"better-sqlite3";import{existsSync as ZT,mkdirSync as QT,readFileSync as eS}from"node:fs";import{homedir as tS}from"node:os";import{dirname as jd,join as rS,resolve as xd}from"node:path";import{fileURLToPath as nS,pathToFileURL as sS}from"node:url";function la(t){t.dbPath!==":memory:"&&QT(jd(t.dbPath),{recursive:!0});let e=new zT(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Rd(e);return r===0&&(e.exec(eS(oS,"utf8")),e.pragma(`user_version = ${aa}`)),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 gs,BT,oa,ws=T(()=>{"use strict";hs();gs=["serve","db","runs","jobs","attentions","env","intents"];BT=["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"];oa=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import zT from"better-sqlite3";import{existsSync as ZT,mkdirSync as QT,readFileSync as eS}from"node:fs";import{homedir as tS}from"node:os";import{dirname as jd,join as rS,resolve as xd}from"node:path";import{fileURLToPath as nS,pathToFileURL as sS}from"node:url";function la(t){t.dbPath!==":memory:"&&QT(jd(t.dbPath),{recursive:!0});let e=new zT(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Rd(e);return r===0&&(e.exec(eS(oS,"utf8")),e.pragma(`user_version = ${aa}`)),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,
@@ -437,9 +437,35 @@ var hT=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{f
437
437
  updated_at TEXT NOT NULL,
438
438
  PRIMARY KEY(user_id, device_id, period)
439
439
  );
440
- `),t.pragma("user_version = 36"),r=36),ZT(iS)}function je(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function Rd(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function lS(){return process.env.LMCTL_DB??rS(tS(),".lmctl","state.db")}var Ad,oS,iS,aa,ca=T(()=>{"use strict";Ad=jd(nS(import.meta.url)),oS=xd(Ad,"schema.sql"),iS=xd(Ad,"migrations"),aa=36;if(process.argv[1]&&import.meta.url===sS(process.argv[1]).href){let t=la({dbPath:process.argv[2]??lS()});try{process.stdout.write(`migrated user_version=${Rd(t)}
441
- `)}finally{t.close()}}});function kr(t){return typeof t=="string"&&cS.has(t)}function Ld(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: ${ws[0]}`,` STANCE: ${ws[1]}`,` STANCE: ${ws[2]}`,` STANCE: ${Od}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
442
- `)}var Od,ws,cS,mn,Cd,ua,ys,pn=T(()=>{"use strict";Od="other",ws=["not_enough_information","dont_know","other_work"],cS=new Set([Od,...ws]),mn="@abort",Cd="invalid_decision",ua="escalation_aborted",ys="workflow_escalation"});import{randomUUID as uS}from"node:crypto";function ke(t){return t.provider_resolved??t.provider}function M(){return new Date().toISOString()}function pe(t){return new da(la({dbPath:t.path}))}function Md(t,e,r){let n=Dd(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 Dd(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 Dd(t){let e=dS(t),r=e===null?null:fS(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))fa(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function dS(t){try{let e=JSON.parse(t);return fa(e)?e:null}catch{return null}}function fS(t,e){let r=t[e];return fa(r)?r:null}function fa(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function mS(t){return{insertWorkflow:t.prepare(`
440
+ `),t.pragma("user_version = 36"),r=36),r<37&&r!==0&&(t.exec(`
441
+ CREATE TABLE IF NOT EXISTS team_connection_v37 (
442
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
443
+ source_teamfile TEXT NOT NULL,
444
+ target_name TEXT NOT NULL,
445
+ target_teamfile TEXT NOT NULL,
446
+ created_at TEXT NOT NULL,
447
+ UNIQUE(source_teamfile, target_name, target_teamfile)
448
+ );
449
+ INSERT OR IGNORE INTO team_connection_v37 (
450
+ id,
451
+ source_teamfile,
452
+ target_name,
453
+ target_teamfile,
454
+ created_at
455
+ )
456
+ SELECT
457
+ id,
458
+ source_teamfile,
459
+ target_name,
460
+ target_teamfile,
461
+ created_at
462
+ FROM team_connection
463
+ ORDER BY id ASC;
464
+ DROP TABLE team_connection;
465
+ ALTER TABLE team_connection_v37 RENAME TO team_connection;
466
+ `),t.pragma("user_version = 37"),r=37),ZT(iS)}function je(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function Rd(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function lS(){return process.env.LMCTL_DB??rS(tS(),".lmctl","state.db")}var Ad,oS,iS,aa,ca=T(()=>{"use strict";Ad=jd(nS(import.meta.url)),oS=xd(Ad,"schema.sql"),iS=xd(Ad,"migrations"),aa=37;if(process.argv[1]&&import.meta.url===sS(process.argv[1]).href){let t=la({dbPath:process.argv[2]??lS()});try{process.stdout.write(`migrated user_version=${Rd(t)}
467
+ `)}finally{t.close()}}});function kr(t){return typeof t=="string"&&cS.has(t)}function Ld(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: ${ys[0]}`,` STANCE: ${ys[1]}`,` STANCE: ${ys[2]}`,` STANCE: ${Od}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
468
+ `)}var Od,ys,cS,mn,Cd,ua,Es,pn=T(()=>{"use strict";Od="other",ys=["not_enough_information","dont_know","other_work"],cS=new Set([Od,...ys]),mn="@abort",Cd="invalid_decision",ua="escalation_aborted",Es="workflow_escalation"});import{randomUUID as uS}from"node:crypto";function ke(t){return t.provider_resolved??t.provider}function M(){return new Date().toISOString()}function pe(t){return new da(la({dbPath:t.path}))}function Md(t,e,r){let n=Dd(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 Dd(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 Dd(t){let e=dS(t),r=e===null?null:fS(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))fa(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function dS(t){try{let e=JSON.parse(t);return fa(e)?e:null}catch{return null}}function fS(t,e){let r=t[e];return fa(r)?r:null}function fa(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function mS(t){return{insertWorkflow:t.prepare(`
443
469
  INSERT INTO workflow (name, version, definition_schema_version, definition, created_at)
444
470
  VALUES (?, ?, ?, ?, ?)
445
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(`
@@ -895,11 +921,11 @@ var hT=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{f
895
921
  AND sender_teamfile = ?
896
922
  AND sender_alias = ?
897
923
  AND active_count > 1
898
- `),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 da,Le=T(()=>{"use strict";ca();pn();da=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;replaceTeamConnectionsTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=mS(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!==ys)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!==mn&&!a.includes(n))return{resumed:!1,reason:Cd};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){Md(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,M()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,M());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){Md(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,M());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,M())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,M());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,M()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,M(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(M(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,M());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,M());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,M(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,M());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",M());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,M());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=M(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,M(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,M(),e)??null}closeIssue(e,r,n){let s=M(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,M(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,M(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=M();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,M(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,M(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=uS(),s=M();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=M(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,M())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??M(),e.dedupe_key??null,e.concurrency_key??null,M());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:M();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,M()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,M()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??M(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,M());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=M(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,M(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(M(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}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,M(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,M())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,M());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,M(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??M(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,M());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,M()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,M()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,M());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(M(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=M();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??M());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,M())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,M())}}});import{realpathSync as _S}from"node:fs";import{resolve as hS}from"node:path";function ma(t){let e=hS(t);try{return _S(e)}catch{return e}}var Pd=T(()=>{"use strict"});import{platform as Fd}from"node:os";function at(t){let e=new _n;for(let r of t)e.registerAdapter(r);return e}var _n,pa=T(()=>{"use strict";Pd();_n=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=ma(e.workspace);o=o.filter(a=>ma(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=Fd()==="darwin"||Fd()==="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 Ud}from"node:fs";import{createInterface as Wd}from"node:readline";import{stat as gS}from"node:fs/promises";import{homedir as wS}from"node:os";async function*Me(t){let e=Ud(t,{encoding:"utf-8"}),r=Wd({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=Ud(t,{encoding:"utf-8"}),s=Wd({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 gS(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function ce(t){return t.replace(/\\n/g,`
899
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var be,Lt=T(()=>{"use strict";be=wS()});import{readdir as Es,stat as Bd,unlink as yS}from"node:fs/promises";import{join as vr,basename as qd}from"node:path";function ES(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function bS(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 Hd(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 bs,Jd=T(()=>{"use strict";Lt();bs=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||vr(be,".claude"),this.projectsDir=vr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Es(this.projectsDir)}catch{return e}for(let n of r){let s=vr(this.projectsDir,n);if(!(await Bd(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Es(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=qd(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=vr(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(!ES(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 Hd(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:bS(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 y of _)if(y.type==="tool_result"){let k=typeof y.content=="string"?ce(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:k,toolCallId:y.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 y of _)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:ce(y.text),model:h.message.model}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolCallId:y.id,model:h.message.model}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!o)return null;let p=await Hd(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 yS(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Es(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=vr(this.projectsDir,i);if(!(await Bd(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Es(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=qd(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:vr(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 Ts(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function SS(t,e,r){if(!r)return"";let n=t.tools[e]??_a[e],s=n?.profiles?.[r]?.flags??_a[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 Xd(t,e){return!!t.tools[e]}function Gd(t,e,r,n,s){let o=t.tools[e]??_a[e],i;if(o?.agent){let l=Ts(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=TS[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(Ts).join(" ");i=`printf '%s\\n' ${Ts(n)} | ${u}`}else i=c.map(Ts).join(" ")}let a=SS(t,e,s);return a&&(i+=" "+a),i}var _a,TS,Vd=T(()=>{"use strict";_a={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:""}}}},TS={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 Kd(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 Yd=T(()=>{"use strict"});var kS,Ie,Ss,gt=T(()=>{"use strict";kS="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: ${kS}`,Ss=`send this exact lmctl seed instruction: "${Ie}"`});import{spawn as zd}from"node:child_process";import{mkdirSync as vS}from"node:fs";var ha,xe,Mt=T(()=>{"use strict";Vd();Yd();gt();ha=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},xe=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 vS(e,{recursive:!0}),new Promise(n=>{let s;try{s=zd(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}
900
- `: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:Ss,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Xd(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 ha("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=Gd(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=Kd(r.env),c=zd(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 vs(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new yt(t,r,e)}var He,ye,wt,ks,yt,Ir=T(()=>{"use strict";He=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends He{},wt=class extends He{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},ks=class extends He{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},yt=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 wa from"node:child_process";function NS(t){if(typeof wa.spawnSync=="function")try{wa.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Zd(t){return t.exitCode!==null||t.signalCode!==null}function ga(t,e){return Zd(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??NS;if(Zd(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await ga(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 ga(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await ga(t,IS)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var IS,Is=T(()=>{"use strict";IS=1e3});import{readFileSync as $S,appendFileSync as jS,mkdirSync as xS,existsSync as bW,readdirSync as TW,unlinkSync as SW}from"node:fs";import{join as tf,dirname as AS}from"node:path";import{homedir as rf}from"node:os";function lt(){if(nf)return!0;let t=Date.now();return t-ef>=RS&&(Qd=MS(),ef=t),Qd}function CS(){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&&!lt())return;try{LS();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};jS(Ns,JSON.stringify(r)+`
901
- `)}catch{}}function LS(){if(!Ns){let e=CS().slice(0,13).replace("T","-");Ns=tf(rf(),".lmctl",`debug-${e}.log`)}xS(AS(Ns),{recursive:!0})}function Et(...t){Dt({event:"legacy",msg:t.join(" ")},{verbose:!0})}function te(t){Dt(t,{always:!0})}function MS(){try{let t=$S(OS,"utf-8");for(let e of t.split(`
902
- `)){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,Qd,ef,RS,OS,Ns,Je=T(()=>{"use strict";nf=!1,Qd=!1,ef=0,RS=5e3,OS=tf(rf(),".lmctl","config.toml");Ns=null});function Nr(t,e){let r=PS[t];if(r)return r[e]??r.yolo}function US(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(FS.has(t))return;let n=r==="plan"?Nr(t,"plan"):DS[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(!US(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 DS,PS,FS,hn=T(()=>{"use strict";Ir();Je();DS={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},PS={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"]}};FS=new Set(["codex","opencode"])});import{spawn as WS}from"node:child_process";import{existsSync as BS}from"node:fs";function HS(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 da,Le=T(()=>{"use strict";ca();pn();da=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;replaceTeamConnectionsTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=mS(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!==Es)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!==mn&&!a.includes(n))return{resumed:!1,reason:Cd};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){Md(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,M()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,M());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){Md(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,M());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,M())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,M());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,M()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,M(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(M(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,M());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,M());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,M(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,M());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",M());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,M());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=M(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,M(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,M(),e)??null}closeIssue(e,r,n){let s=M(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,M(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,M(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=M();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,M(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,M(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=uS(),s=M();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=M(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,M())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??M(),e.dedupe_key??null,e.concurrency_key??null,M());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:M();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,M()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,M()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??M(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,M());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=M(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,M(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(M(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}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,M(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,M())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,M());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,M(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??M(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,M());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,M()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,M()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,M());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(M(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=M();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??M());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,M())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,M())}}});import{realpathSync as _S}from"node:fs";import{resolve as hS}from"node:path";function ma(t){let e=hS(t);try{return _S(e)}catch{return e}}var Pd=T(()=>{"use strict"});import{platform as Fd}from"node:os";function it(t){let e=new _n;for(let r of t)e.registerAdapter(r);return e}var _n,pa=T(()=>{"use strict";Pd();_n=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=ma(e.workspace);o=o.filter(a=>ma(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=Fd()==="darwin"||Fd()==="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 Ud}from"node:fs";import{createInterface as Wd}from"node:readline";import{stat as gS}from"node:fs/promises";import{homedir as wS}from"node:os";async function*Me(t){let e=Ud(t,{encoding:"utf-8"}),r=Wd({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=Ud(t,{encoding:"utf-8"}),s=Wd({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 gS(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=T(()=>{"use strict";be=wS()});import{readdir as bs,stat as Bd,unlink as yS}from"node:fs/promises";import{join as vr,basename as qd}from"node:path";function ES(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function bS(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 Hd(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 Ts,Jd=T(()=>{"use strict";Ct();Ts=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||vr(be,".claude"),this.projectsDir=vr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await bs(this.projectsDir)}catch{return e}for(let n of r){let s=vr(this.projectsDir,n);if(!(await Bd(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await bs(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=qd(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=vr(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(!ES(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 Hd(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:bS(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 y of _)if(y.type==="tool_result"){let k=typeof y.content=="string"?ce(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:k,toolCallId:y.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 y of _)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:ce(y.text),model:h.message.model}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolCallId:y.id,model:h.message.model}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!o)return null;let p=await Hd(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 yS(r),!0):!1}async resolveSessionFile(e){let r;try{r=await bs(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=vr(this.projectsDir,i);if(!(await Bd(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await bs(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=qd(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:vr(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 Ss(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function SS(t,e,r){if(!r)return"";let n=t.tools[e]??_a[e],s=n?.profiles?.[r]?.flags??_a[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 Xd(t,e){return!!t.tools[e]}function Gd(t,e,r,n,s){let o=t.tools[e]??_a[e],i;if(o?.agent){let l=Ss(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=TS[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(Ss).join(" ");i=`printf '%s\\n' ${Ss(n)} | ${u}`}else i=c.map(Ss).join(" ")}let a=SS(t,e,s);return a&&(i+=" "+a),i}var _a,TS,Vd=T(()=>{"use strict";_a={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:""}}}},TS={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 Kd(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 Yd=T(()=>{"use strict"});var kS,Ie,ks,gt=T(()=>{"use strict";kS="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: ${kS}`,ks=`send this exact lmctl seed instruction: "${Ie}"`});import{spawn as zd}from"node:child_process";import{mkdirSync as vS}from"node:fs";var ha,xe,Lt=T(()=>{"use strict";Vd();Yd();gt();ha=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},xe=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 vS(e,{recursive:!0}),new Promise(n=>{let s;try{s=zd(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:ks,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Xd(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 ha("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=Gd(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=Kd(r.env),c=zd(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 Is(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new yt(t,r,e)}var He,ye,wt,vs,yt,Ir=T(()=>{"use strict";He=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends He{},wt=class extends He{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},vs=class extends He{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},yt=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 wa from"node:child_process";function NS(t){if(typeof wa.spawnSync=="function")try{wa.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Zd(t){return t.exitCode!==null||t.signalCode!==null}function ga(t,e){return Zd(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??NS;if(Zd(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await ga(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 ga(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await ga(t,IS)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var IS,Ns=T(()=>{"use strict";IS=1e3});import{readFileSync as $S,appendFileSync as jS,mkdirSync as xS,existsSync as TW,readdirSync as SW,unlinkSync as kW}from"node:fs";import{join as tf,dirname as AS}from"node:path";import{homedir as rf}from"node:os";function at(){if(nf)return!0;let t=Date.now();return t-ef>=RS&&(Qd=MS(),ef=t),Qd}function CS(){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 Mt(t,e){if(e?.verbose){if(!nf)return}else if(!e?.always&&!at())return;try{LS();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};jS($s,JSON.stringify(r)+`
927
+ `)}catch{}}function LS(){if(!$s){let e=CS().slice(0,13).replace("T","-");$s=tf(rf(),".lmctl",`debug-${e}.log`)}xS(AS($s),{recursive:!0})}function Et(...t){Mt({event:"legacy",msg:t.join(" ")},{verbose:!0})}function te(t){Mt(t,{always:!0})}function MS(){try{let t=$S(OS,"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,Qd,ef,RS,OS,$s,Je=T(()=>{"use strict";nf=!1,Qd=!1,ef=0,RS=5e3,OS=tf(rf(),".lmctl","config.toml");$s=null});function Nr(t,e){let r=PS[t];if(r)return r[e]??r.yolo}function US(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function Dt(t,e,r="yolo"){if(FS.has(t))return;let n=r==="plan"?Nr(t,"plan"):DS[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(!US(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 DS,PS,FS,hn=T(()=>{"use strict";Ir();Je();DS={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},PS={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"]}};FS=new Set(["codex","opencode"])});import{spawn as WS}from"node:child_process";import{existsSync as BS}from"node:fs";function HS(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(`
903
929
 
904
930
  --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
905
931
 
@@ -907,42 +933,42 @@ var hT=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{f
907
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:
908
934
  ${e}
909
935
 
910
- ${r}`:r}function sf(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||qS[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=Nr(s,a)??VS[s]??["--dangerously-skip-permissions"];i.push(...l);try{Pt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!BS(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=WS(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=JS({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 sf(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||qS[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=Nr(s,a)??VS[s]??["--dangerously-skip-permissions"];i.push(...l);try{Dt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!BS(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=WS(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=JS({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(`
911
937
  `);f=_.pop()||"";for(let y of _)m(y)});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();_?(Et(`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(GS({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
912
- `),Et(`stream-json: prompt sent (${t.length} chars)`)})}var qS,VS,of=T(()=>{"use strict";Ir();Is();hn();Je();qS={claude:"claude",qwen:"qwen"};VS={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as KS,constants as YS}from"node:fs";import{delimiter as zS,join as ZS}from"node:path";function QS(t,e=process.env){let r=e.PATH??"";for(let n of r.split(zS))if(n)try{return KS(ZS(n,t),YS.X_OK),!0}catch{}return!1}function ek(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 $r(t,e,r={}){if(QS(t,r.env))return;(r.warn??console.warn)(ek(t,e))}var $s=T(()=>{"use strict"});function af(t={}){return $r("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${rk}`]}var tk,rk,lf=T(()=>{"use strict";$s();tk=864e5,rk=tk/1e3});import{spawn as nk}from"node:child_process";import{createInterface as sk}from"node:readline";import{existsSync as ok,readFileSync as ik}from"node:fs";import{fileURLToPath as ak}from"node:url";function lk(t){return t==="plan"?"read-only":"danger-full-access"}function uk(){return{clientInfo:{name:"lmctl",title:"lmctl",version:ck},capabilities:{experimentalApi:!1}}}function Ft(t,e){Et(`[codex:${t}] ${JSON.stringify(e)}`)}function dk(){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 fk(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function mk(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 _k(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
938
+ `),Et(`stream-json: prompt sent (${t.length} chars)`)})}var qS,VS,of=T(()=>{"use strict";Ir();Ns();hn();Je();qS={claude:"claude",qwen:"qwen"};VS={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as KS,constants as YS}from"node:fs";import{delimiter as zS,join as ZS}from"node:path";function QS(t,e=process.env){let r=e.PATH??"";for(let n of r.split(zS))if(n)try{return KS(ZS(n,t),YS.X_OK),!0}catch{}return!1}function ek(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 $r(t,e,r={}){if(QS(t,r.env))return;(r.warn??console.warn)(ek(t,e))}var js=T(()=>{"use strict"});function af(t={}){return $r("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${rk}`]}var tk,rk,lf=T(()=>{"use strict";js();tk=864e5,rk=tk/1e3});import{spawn as nk}from"node:child_process";import{createInterface as sk}from"node:readline";import{existsSync as ok,readFileSync as ik}from"node:fs";import{fileURLToPath as ak}from"node:url";function lk(t){return t==="plan"?"read-only":"danger-full-access"}function uk(){return{clientInfo:{name:"lmctl",title:"lmctl",version:ck},capabilities:{experimentalApi:!1}}}function Pt(t,e){Et(`[codex:${t}] ${JSON.stringify(e)}`)}function dk(){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 fk(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function mk(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 _k(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
913
939
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
914
940
  ${e}
915
941
 
916
- ${r}`:r}function hk(t,e){let r=mk(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function gk(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 uf(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=lk(i);try{Pt("codex",o,i)}catch(R){return n(R)}if(e.cwd&&!ok(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=nk(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=sk({input:l.stdout}),d=new Map,f=1,m=e.threadId||"",p="",h=!1,g=!1,_=Date.now(),y=dk(),k=pk();function v(R,L={}){return new Promise((q,ee)=>{let j=f++;d.set(j,{resolve:q,reject:ee});let H=JSON.stringify({jsonrpc:"2.0",id:j,method:R,params:L});l.stdin?.write(H+`
942
+ ${r}`:r}function hk(t,e){let r=mk(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function gk(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 uf(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=lk(i);try{Dt("codex",o,i)}catch(R){return n(R)}if(e.cwd&&!ok(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=nk(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=sk({input:l.stdout}),d=new Map,f=1,m=e.threadId||"",p="",h=!1,g=!1,_=Date.now(),y=dk(),k=pk();function v(R,L={}){return new Promise((q,ee)=>{let j=f++;d.set(j,{resolve:q,reject:ee});let H=JSON.stringify({jsonrpc:"2.0",id:j,method:R,params:L});l.stdin?.write(H+`
917
943
  `)})}function $(R,L={}){let q=JSON.stringify({jsonrpc:"2.0",method:R,params:L});l.stdin?.write(q+`
918
- `)}u.on("line",R=>{let L;try{L=JSON.parse(R)}catch{return}if(typeof L.id=="number"&&d.has(L.id)){let j=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);j.reject(vs(`codex app-server error: ${me}`,H))}else j.resolve(L);e.onEvent?.(L);return}let q=L.method;if(!q){e.onEvent?.(L);return}if(q==="thread/started"){let H=L.params?.thread;H?.id&&(m=H.id)}let ee=lt()?j=>{Ft("item.text/buffer-mismatch",{itemId:j.itemId,threadId:j.threadId??null,turnId:j.turnId??null,expectedFromItemText:j.expectedFromItemText,gotFromBuffer:j.gotFromBuffer,expectedLen:j.expectedFromItemText.length,gotLen:j.gotFromBuffer.length})}:void 0;if(q==="turn/started"){let j=L.params,H=j?.turn;H?.id&&(p=H.id),cf(L,y,e.onDelta,ee),lt()&&Ft("turn/started",{params:j??null})}if(lt()&&(q==="item/started"||q==="item/completed")){let j=L.params;j?.item?.type==="agentMessage"&&Ft(q,{params:j??null})}if(q==="item/started"||q==="item/agentMessage/delta"||q==="item/completed"){if(q==="item/agentMessage/delta"){let j=L.params;lt()&&Ft("agentMessage/delta",{params:j??null})}cf(L,y,e.onDelta,ee)}if(q==="turn/completed"){let j=L.params;if(lt())for(let[me,I]of y.agentItems.entries())I.buffer&&Ft("turn/completed/unflushed-item",{itemId:me,phase:I.phase,bufferLen:I.buffer.length});fk(y),lt()&&Ft("turn/completed",{params:j??null});let H=gk(L,k);H.shouldReject?(lt()&&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(q==="error"){let j=hk(L,k);if(lt()){let H=L.params,me=H?.error,I=typeof me?.message=="string"?me.message:"(no message)";Ft(j.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:j.willRetry,params:H??null})}}e.onEvent?.(L)});let S="";l.stderr?.on("data",R=>{S+=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:y.resultText,threadId:m,turnId:p,durationMs:Date.now()-_,exitCode:R});return}if(k.pendingCodexError){n(k.pendingCodexError);return}te({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:R,stderr_tail:S.slice(0,500)}),n(new Error(_k({exitCode:R,stderr:S})))}}),(async()=>{try{if(await v("initialize",uk()),$("initialized",{}),e.threadId)try{let R=v("thread/resume",{threadId:e.threadId,sandbox:a,approvalPolicy:"never",...e.model?{model:e.model}:{}}),L=new Promise((q,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
919
- `);let L=(await v("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 v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(m=L.id)}await v("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 ck,df=T(()=>{"use strict";Je();Je();Ir();Is();hn();lf();Je();ck=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(ik(ak(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function ya(){return{deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(ff.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(mf.map(t=>[t,{name:t}]))}}}function pf(){return[...wk,...ff.map(t=>`deepseek/${t}`),...mf.map(t=>`openrouter/${t}`)].sort()}var wk,ff,mf,Ea=T(()=>{"use strict";wk=["github-copilot/claude-haiku-4.5","github-copilot/gpt-5-mini"],ff=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],mf=["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 yk,mkdirSync as Ek,readFileSync as bk,writeFileSync as _f}from"node:fs";import{join as hf}from"node:path";function wf(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:Tk}}function Sk(t,e){return JSON.stringify(t)===JSON.stringify(e)}function kk(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 js(t,e={}){let r=hf(t,".opencode"),n=hf(r,"opencode.json");if($r("lmctl","lmctl_chat",e),!yk(n)){Ek(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:ya(),mcp:{lmctl:wf()}},null,2);return _f(n,l+`
944
+ `)}u.on("line",R=>{let L;try{L=JSON.parse(R)}catch{return}if(typeof L.id=="number"&&d.has(L.id)){let j=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);j.reject(Is(`codex app-server error: ${me}`,H))}else j.resolve(L);e.onEvent?.(L);return}let q=L.method;if(!q){e.onEvent?.(L);return}if(q==="thread/started"){let H=L.params?.thread;H?.id&&(m=H.id)}let ee=at()?j=>{Pt("item.text/buffer-mismatch",{itemId:j.itemId,threadId:j.threadId??null,turnId:j.turnId??null,expectedFromItemText:j.expectedFromItemText,gotFromBuffer:j.gotFromBuffer,expectedLen:j.expectedFromItemText.length,gotLen:j.gotFromBuffer.length})}:void 0;if(q==="turn/started"){let j=L.params,H=j?.turn;H?.id&&(p=H.id),cf(L,y,e.onDelta,ee),at()&&Pt("turn/started",{params:j??null})}if(at()&&(q==="item/started"||q==="item/completed")){let j=L.params;j?.item?.type==="agentMessage"&&Pt(q,{params:j??null})}if(q==="item/started"||q==="item/agentMessage/delta"||q==="item/completed"){if(q==="item/agentMessage/delta"){let j=L.params;at()&&Pt("agentMessage/delta",{params:j??null})}cf(L,y,e.onDelta,ee)}if(q==="turn/completed"){let j=L.params;if(at())for(let[me,I]of y.agentItems.entries())I.buffer&&Pt("turn/completed/unflushed-item",{itemId:me,phase:I.phase,bufferLen:I.buffer.length});fk(y),at()&&Pt("turn/completed",{params:j??null});let H=gk(L,k);H.shouldReject?(at()&&Pt("turn/completed/terminal-reject",{message:H.turnError.message}),g=!0,h=!0,l.stdin?.end(),n(H.turnError)):(h=!0,l.stdin?.end())}if(q==="error"){let j=hk(L,k);if(at()){let H=L.params,me=H?.error,I=typeof me?.message=="string"?me.message:"(no message)";Pt(j.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:j.willRetry,params:H??null})}}e.onEvent?.(L)});let S="";l.stderr?.on("data",R=>{S+=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:y.resultText,threadId:m,turnId:p,durationMs:Date.now()-_,exitCode:R});return}if(k.pendingCodexError){n(k.pendingCodexError);return}te({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:R,stderr_tail:S.slice(0,500)}),n(new Error(_k({exitCode:R,stderr:S})))}}),(async()=>{try{if(await v("initialize",uk()),$("initialized",{}),e.threadId)try{let R=v("thread/resume",{threadId:e.threadId,sandbox:a,approvalPolicy:"never",...e.model?{model:e.model}:{}}),L=new Promise((q,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 v("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 v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(m=L.id)}await v("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 ck,df=T(()=>{"use strict";Je();Je();Ir();Ns();hn();lf();Je();ck=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(ik(ak(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function ya(){return{deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(ff.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(mf.map(t=>[t,{name:t}]))}}}function pf(){return[...wk,...ff.map(t=>`deepseek/${t}`),...mf.map(t=>`openrouter/${t}`)].sort()}var wk,ff,mf,Ea=T(()=>{"use strict";wk=["github-copilot/claude-haiku-4.5","github-copilot/gpt-5-mini"],ff=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],mf=["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 yk,mkdirSync as Ek,readFileSync as bk,writeFileSync as _f}from"node:fs";import{join as hf}from"node:path";function wf(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:Tk}}function Sk(t,e){return JSON.stringify(t)===JSON.stringify(e)}function kk(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 xs(t,e={}){let r=hf(t,".opencode"),n=hf(r,"opencode.json");if($r("lmctl","lmctl_chat",e),!yk(n)){Ek(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:ya(),mcp:{lmctl:wf()}},null,2);return _f(n,l+`
920
946
  `,"utf-8"),!0}let s;try{s=JSON.parse(bk(n,"utf-8"))}catch{return console.log(gf.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(gf.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),kk(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.`}),vk(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=wf();return Sk(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&_f(n,JSON.stringify(s,null,2)+`
921
- `,"utf-8"),o}function vk(t){let e=ya(),r=gn(t.provider)?t.provider:{},n=!gn(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(!gn(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=gn(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=gn(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 gn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var gf,Tk,ba=T(()=>{"use strict";Je();Ea();$s();gf={yellow:t=>t},Tk=864e5});import{spawn as Ik}from"node:child_process";import{existsSync as Nk}from"node:fs";import{createInterface as $k}from"node:readline";function jk(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
947
+ `,"utf-8"),o}function vk(t){let e=ya(),r=gn(t.provider)?t.provider:{},n=!gn(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(!gn(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=gn(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=gn(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 gn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var gf,Tk,ba=T(()=>{"use strict";Je();Ea();js();gf={yellow:t=>t},Tk=864e5});import{spawn as Ik}from"node:child_process";import{existsSync as Nk}from"node:fs";import{createInterface as $k}from"node:readline";function jk(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
922
948
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
923
949
  ${e}
924
950
 
925
- ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return yf(t.slice(n).trimStart())}return yf(Pk(t.replace(Ok,"")))}function Pk(t){let e=Ck.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(Lk)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function yf(t){let e=[...t.matchAll(Mk)];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 bf(t,e){let r=xk[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{js(e.cwd)}catch($){te({event:"opencode_config_install_failed",cwd:e.cwd,error_message:$ instanceof Error?$.message:String($)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let $=Nr("gemini","plan"),S=Nr("gemini","yolo");a=a.filter(R=>!(S??[]).includes(R)),$&&a.push(...$)}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.
926
- `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Pt(e.tool,a,l)}catch($){return s($)}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.
927
- `),e.cwd&&!Nk(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=Ik(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=$k({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1;function y($,S={}){return new Promise((R,L)=>{let q=Ak++;m.set(q,{resolve:R,reject:L});let ee=JSON.stringify({jsonrpc:"2.0",id:q,method:$,params:S});Dt({event:"acp_send",direction:"SEND",provider:e.tool,method:$,id:q,params:S}),c.stdin?.write(ee+`
928
- `)})}f.on("line",$=>{let S;try{S=JSON.parse($)}catch{return}if(Dt({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof S.id=="number"?S.id:void 0,method:typeof S.method=="string"?S.method:void 0,preview:JSON.stringify(S).slice(0,300)}),e.onEvent?.(S),typeof S.id=="number"&&m.has(S.id)){let L=m.get(S.id);if(m.delete(S.id),S.error){let q=S.error,ee=typeof q?.message=="string"&&q.message.length>0?q.message:JSON.stringify(S.error);L.reject(vs(`ACP RPC error: ${ee}`,q))}else L.resolve(S);return}let R=S.method;if(R){if(typeof S.id=="number"){te({event:"acp_unhandled_request",provider:e.tool,method:R,id:S.id,params:S.params});let L=JSON.stringify({jsonrpc:"2.0",id:S.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:S.id,error:"method not found"}),c.stdin?.write(L+`
951
+ ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return yf(t.slice(n).trimStart())}return yf(Pk(t.replace(Ok,"")))}function Pk(t){let e=Ck.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(Lk)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function yf(t){let e=[...t.matchAll(Mk)];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 bf(t,e){let r=xk[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{xs(e.cwd)}catch($){te({event:"opencode_config_install_failed",cwd:e.cwd,error_message:$ instanceof Error?$.message:String($)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let $=Nr("gemini","plan"),S=Nr("gemini","yolo");a=a.filter(R=>!(S??[]).includes(R)),$&&a.push(...$)}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
+ `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Dt(e.tool,a,l)}catch($){return s($)}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
+ `),e.cwd&&!Nk(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=Ik(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=$k({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1;function y($,S={}){return new Promise((R,L)=>{let q=Ak++;m.set(q,{resolve:R,reject:L});let ee=JSON.stringify({jsonrpc:"2.0",id:q,method:$,params:S});Mt({event:"acp_send",direction:"SEND",provider:e.tool,method:$,id:q,params:S}),c.stdin?.write(ee+`
954
+ `)})}f.on("line",$=>{let S;try{S=JSON.parse($)}catch{return}if(Mt({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof S.id=="number"?S.id:void 0,method:typeof S.method=="string"?S.method:void 0,preview:JSON.stringify(S).slice(0,300)}),e.onEvent?.(S),typeof S.id=="number"&&m.has(S.id)){let L=m.get(S.id);if(m.delete(S.id),S.error){let q=S.error,ee=typeof q?.message=="string"&&q.message.length>0?q.message:JSON.stringify(S.error);L.reject(Is(`ACP RPC error: ${ee}`,q))}else L.resolve(S);return}let R=S.method;if(R){if(typeof S.id=="number"){te({event:"acp_unhandled_request",provider:e.tool,method:R,id:S.id,params:S.params});let L=JSON.stringify({jsonrpc:"2.0",id:S.id,error:{code:-32601,message:`Method not found: ${R} (lmctl does not implement server-side ACP methods)`}});Mt({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:S.id,error:"method not found"}),c.stdin?.write(L+`
929
955
  `);return}if(R==="session/update"){let q=S.params?.update;if(q?.sessionUpdate==="agent_message_chunk"){let j=q.content?.text||"";j&&(h+=j,e.onDelta?.(j))}}}});let k="";c.stderr?.on("data",$=>{k+=$.toString()}),c.on("error",$=>{te({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:$.message,elapsed_ms:Date.now()-u}),s(new ye(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${$.message}`,{cause:$}))}),c.on("exit",$=>{d||(_?n({result:e.tool==="gemini"?Dk(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:$}):(te({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:$,stderr_tail:k.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(jk({tool:e.tool,exitCode:$,stderr:k})))))});function v($,S={}){let R=JSON.stringify({jsonrpc:"2.0",method:$,params:S});c.stdin?.write(R+`
930
956
  `)}(async()=>{try{if(await y("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),v("notifications/initialized"),e.sessionId)try{p=(await y("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(S){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${S instanceof Error?S.message:String(S)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
931
957
  `),p=(await y("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await y("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await y("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),Et(`acp: set_config_option(model=${e.model}) ok`)}catch(S){let R=S instanceof Error?S.message:String(S);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${R}
932
- `)}Et(`acp: prompt sent (${t.length} chars)`),g=(await y("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,Et(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch($){Ze(c).catch(()=>{}),s($ instanceof Error?$:new Error(String($)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var xk,Ak,Ef,Rk,Ok,Ck,Lk,Mk,Tf=T(()=>{"use strict";Je();Ir();Is();hn();ba();Je();xk={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},Ak=1,Ef="(?:png|jpe?g|webp|heic|pdf)",Rk=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Ef}\\s*`,"gi"),Ok=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Ef}\\s*`,"i"),Ck=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,Lk=/^STANCE:\s+\S+\s*$/gim,Mk=/\[Thought:\s*true\]\s*/gi});function _e(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Sf(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=Fk){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 Uk(){let t=new Map;return(e,r)=>{Wk(e,Sf(t,r))}}function Wk(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(_e(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(_e(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:_e(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=_e(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:_e(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:_e(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
+ `)}Et(`acp: prompt sent (${t.length} chars)`),g=(await y("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,Et(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch($){Ze(c).catch(()=>{}),s($ instanceof Error?$:new Error(String($)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var xk,Ak,Ef,Rk,Ok,Ck,Lk,Mk,Tf=T(()=>{"use strict";Je();Ir();Ns();hn();ba();Je();xk={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},Ak=1,Ef="(?:png|jpe?g|webp|heic|pdf)",Rk=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Ef}\\s*`,"gi"),Ok=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Ef}\\s*`,"i"),Ck=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,Lk=/^STANCE:\s+\S+\s*$/gim,Mk=/\[Thought:\s*true\]\s*/gi});function _e(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Sf(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=Fk){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 Uk(){let t=new Map;return(e,r)=>{Wk(e,Sf(t,r))}}function Wk(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(_e(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(_e(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:_e(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=_e(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:_e(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:_e(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(`
933
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(`
934
- `).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 xs(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?Uk():void 0,s=await sf(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 Bk(){let t=new Map;return(e,r)=>{qk(e,Sf(t,r))}}function qk(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:_e(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:_e(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=_e(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:_e(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 ${_e(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function jr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Dt({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?Bk():void 0,s=await bf(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 Hk(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: ${_e(i,120)}`}:{kind:"other",summary:`codex error: ${_e(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:_e(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:_e(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:_e(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:_e(s)}:{kind:"text",summary:_e(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:_e(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 As(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?Uk():void 0,s=await sf(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 Bk(){let t=new Map;return(e,r)=>{qk(e,Sf(t,r))}}function qk(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:_e(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:_e(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=_e(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:_e(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 ${_e(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function jr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Mt({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?Bk():void 0,s=await bf(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 Hk(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: ${_e(i,120)}`}:{kind:"other",summary:`codex error: ${_e(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:_e(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:_e(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:_e(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:_e(s)}:{kind:"text",summary:_e(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:_e(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
935
961
  `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${_e(i,60)}`:_e(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(`
936
- `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${_e(i,60)}`:_e(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 kf(t,e){let r=await uf(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=>Hk(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var Fk,nr=T(()=>{"use strict";of();df();Tf();Je();Fk=256});function Sa(t){return new Ta(t)}var Ta,ka=T(()=>{"use strict";Jd();Mt();nr();gt();Ta=class extends xe{constructor(e){super({provider:new bs(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:xs})}}});import{readdir as Jk,stat as vf,unlink as Xk}from"node:fs/promises";import{join as wn,basename as Gk}from"node:path";function Vk(t,e,r){return`${t}|${e.toISOString()}|${r}`}function yn(t,e,r){let n=Vk(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function If(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function Kk(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 As(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 As(r)}).filter(r=>r.length>0).join(`
937
- `);try{return JSON.stringify(t)}catch{return String(t)}}async function Nf(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=Kk(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 Rs,$f=T(()=>{"use strict";Lt();Rs=class{name="codex";codexDirs;constructor(e={}){let r=[wn(be,".codex"),wn(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:wn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=wn(r,"sessions");try{await vf(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 Jk(e)}catch{return r}for(let s of n){let o=wn(e,s),i=await vf(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=Gk(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 Nf(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:If(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=If(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 y of _.content)if(y.type==="input_text"&&typeof y.text=="string"&&y.text){let k=y.text.trim();c||(c=G(k,80)),u=G(k,80),yn(s,m,{role:"user",timestamp:g,content:ce(k)})}continue}if(_.role==="assistant"&&_.content){for(let y of _.content)y.type==="output_text"&&typeof y.text=="string"&&y.text&&yn(s,m,{role:"assistant",timestamp:g,content:ce(y.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let y of _.content)(y.type==="input_text"||y.type==="output_text")&&typeof y.text=="string"&&y.text&&yn(s,m,{role:"system",timestamp:g,content:ce(y.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(As(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:ce(As(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let y=_.summary.map(k=>As(k.text)).join(`
938
- `);y.trim()&&yn(s,m,{role:"thinking",timestamp:g,content:ce(y)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&yn(s,m,{role:"thinking",timestamp:g,content:ce(_)})}}if(!o)return null;let p=await Nf(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 Xk(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 Ia(t){return new va(t)}var va,Na=T(()=>{"use strict";$f();Mt();nr();gt();va=class extends xe{constructor(e){super({provider:new Rs(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}
939
- `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:kf})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function En(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 Os(t){let e=En(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(`
962
+ `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${_e(i,60)}`:_e(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 kf(t,e){let r=await uf(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=>Hk(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var Fk,rr=T(()=>{"use strict";of();df();Tf();Je();Fk=256});function Sa(t){return new Ta(t)}var Ta,ka=T(()=>{"use strict";Jd();Lt();rr();gt();Ta=class extends xe{constructor(e){super({provider:new Ts(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:As})}}});import{readdir as Jk,stat as vf,unlink as Xk}from"node:fs/promises";import{join as wn,basename as Gk}from"node:path";function Vk(t,e,r){return`${t}|${e.toISOString()}|${r}`}function yn(t,e,r){let n=Vk(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function If(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function Kk(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 Rs(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 Rs(r)}).filter(r=>r.length>0).join(`
963
+ `);try{return JSON.stringify(t)}catch{return String(t)}}async function Nf(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=Kk(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 Os,$f=T(()=>{"use strict";Ct();Os=class{name="codex";codexDirs;constructor(e={}){let r=[wn(be,".codex"),wn(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:wn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=wn(r,"sessions");try{await vf(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 Jk(e)}catch{return r}for(let s of n){let o=wn(e,s),i=await vf(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=Gk(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 Nf(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:If(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=If(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 y of _.content)if(y.type==="input_text"&&typeof y.text=="string"&&y.text){let k=y.text.trim();c||(c=G(k,80)),u=G(k,80),yn(s,m,{role:"user",timestamp:g,content:ce(k)})}continue}if(_.role==="assistant"&&_.content){for(let y of _.content)y.type==="output_text"&&typeof y.text=="string"&&y.text&&yn(s,m,{role:"assistant",timestamp:g,content:ce(y.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let y of _.content)(y.type==="input_text"||y.type==="output_text")&&typeof y.text=="string"&&y.text&&yn(s,m,{role:"system",timestamp:g,content:ce(y.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(Rs(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:ce(Rs(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let y=_.summary.map(k=>Rs(k.text)).join(`
964
+ `);y.trim()&&yn(s,m,{role:"thinking",timestamp:g,content:ce(y)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&yn(s,m,{role:"thinking",timestamp:g,content:ce(_)})}}if(!o)return null;let p=await Nf(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 Xk(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 Ia(t){return new va(t)}var va,Na=T(()=>{"use strict";$f();Lt();rr();gt();va=class extends xe{constructor(e){super({provider:new Os(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:kf})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function En(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 Cs(t){let e=En(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(`
940
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?Yk(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 Yk(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&jf(t.tokens)&&jf(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function jf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function xf(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(`
941
967
  `)+`
942
- `}var $a=T(()=>{"use strict"});import{createHash as zk}from"node:crypto";import{readdir as bn,readFile as Af,stat as Cs,unlink as Zk}from"node:fs/promises";import{join as Fe,basename as Qk,dirname as ev}from"node:path";import{cwd as tv}from"node:process";function Rf(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Of(t){return t==="user"}function ja(t){return t==="gemini"||t==="assistant"}function sr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function rv(t){return`${t.sessionId}\0${t.cwd}`}function nv(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 Ls(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Cf(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!ja(a.type)||!a.tokens)continue;let l=Ls(a.tokens.input),c=Ls(a.tokens.cached),u=Math.max(l-c,0),d=Ls(a.tokens.output),f=Ls(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 sv(t){return zk("sha256").update(t).digest("hex")}function Tn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=ev(r);if(n===r)break;r=n}}var Ms,Lf=T(()=>{"use strict";Lt();$a();Je();Ms=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=rv(s),i=r.get(o);r.set(o,i?nv(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 _=sr(g.timestamp),y=g.type,k=ce(Rf(g.content));if(Of(y)){let $=k.trim();$&&(u||(u=G($,80)),d=G($,80)),o.push({role:"user",timestamp:_,content:$||k});continue}if(ja(y)){g.model&&(f=g.model);for(let $ of g.thoughts||[]){let S=[$.subject,$.description].filter(Boolean).join(`
943
- `).trim();S&&o.push({role:"thinking",timestamp:sr($.timestamp,_),content:ce(S)})}o.push({role:"assistant",timestamp:_,content:k,model:g.model});continue}let v=y?`[${y}] `:"";o.push({role:"system",timestamp:_,content:`${v}${k}`.trim()})}let m=sr(n.startTime,s.createdAt),p=sr(n.lastUpdated,s.modifiedAt),h=Cf(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(Of(m.type)){d++;let p=Rf(m.content).trim();p&&(l||(l=G(ce(p),80)),c=G(ce(p),80))}else ja(m.type)&&(d++,m.model&&(u=m.model));let f=Cf(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:sr(r.startTime,n.createdAt),modifiedAt:sr(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 Af(e,"utf-8");if(En(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 Os(r)}catch{return null}}extractSessionIdFromFilename(e){let r=Qk(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 bn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Fe(this.geminiTmpDir,n,"chats");if(!(await Cs(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await bn(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 Zk(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:sr(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;Tn(e,tv());for(let n of this.extraWorkspacePaths)Tn(e,n);for(let n of await this.collectGeminiProjectPaths())Tn(e,n);for(let n of await this.collectCodexCwds())Tn(e,n);for(let n of await this.collectClaudeCwds())Tn(e,n);let r=new Map;for(let n of e)r.set(sv(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Af(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 bn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Fe(this.claudeProjectsDir,n);if(!(await Cs(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await bn(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 Cs(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await bn(e)}catch{return r}for(let o of s){let i=Fe(e,o),a=await Cs(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 ov,writeFileSync as iv,mkdirSync as av}from"node:fs";import{join as lv,dirname as cv}from"node:path";import{randomUUID as uv}from"node:crypto";function Aa(t){return new xa(t)}var xa,Ra=T(()=>{"use strict";Lf();Mt();nr();gt();$a();xa=class extends xe{constructor(e){super({provider:new Ms(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)=>jr(r,{...n,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
944
- `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Ss,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=ov(n,"utf-8"),o=En(s),i=Os(s),a=uv();i.sessionId=a,i.kind="main";let l=cv(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=lv(l,d);return av(l,{recursive:!0}),iv(f,xf(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 Mf,readFile as dv,rm as fv,stat as xr}from"node:fs/promises";import{basename as mv,join as Qe}from"node:path";function pv(t){let e={};for(let r of t.split(`
945
- `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function or(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function _v(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 Ds,Df=T(()=>{"use strict";Lt();Ds=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 Mf(this.sessionStateDir)}catch{return e}for(let n of r){let s=Qe(this.sessionStateDir,n);if((await xr(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=Qe(r,"events.jsonl"),o=await xr(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||mv(r)||e;if(o)for await(let _ of Me(s)){let y=or(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=or(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let k=_.data.content||"",v=k.trim();v&&(m||(m=G(v,80)),p=G(v,80)),l.push({role:"user",timestamp:y,content:ce(v||k)});continue}if(_.type==="assistant.message"&&_.data){let k=(_.data.content||"").trim();if(k&&l.push({role:"assistant",timestamp:y,content:ce(k),model:u}),_.data.toolRequests)for(let v of _.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:v.name||"unknown tool",toolName:v.name,toolInput:v.arguments?JSON.stringify(v.arguments,null,2):void 0,toolCallId:v.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let k=_.data.result?.content||"",v=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:ce(k),toolDetailedContent:v?ce(v):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:y,content:ce(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let k=_.data?.message||"";k.trim()&&l.push({role:"system",timestamp:y,content:ce(k)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??or(n?.created_at)??a.createdAt,modifiedAt:or(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=Qe(e,"events.jsonl"),o=await xr(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=or(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let y=(_.data.content||"").trim();y&&(p||(p=G(y,80)),h=G(y,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=o?await _v(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??or(n?.created_at)??a.createdAt,modifiedAt:or(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=Qe(e,"workspace.yaml");try{let n=await dv(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 fv(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Mf(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=Qe(this.sessionStateDir,e);if((await xr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=Qe(this.sessionStateDir,s);(await xr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=Qe(this.sessionStateDir,s);if(!(await xr(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function Oa(t){return new xe({provider:new Ds(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)=>jr(e,{...r,acpTool:"copilot"})})}var Ca=T(()=>{"use strict";Df();Mt();nr();gt()});import{existsSync as Pf}from"node:fs";import{join as Ps}from"node:path";import{createRequire as hv}from"node:module";function Ff(){return La===null&&(La=hv(import.meta.url)("node:sqlite").DatabaseSync),La}function gv(){let t=process.env.XDG_DATA_HOME||Ps(be,".local","share"),e=process.env.XDG_CONFIG_HOME||Ps(be,".config");return[Ps(t,"opencode","opencode.db"),Ps(e,"opencode","opencode.db")]}var La,Fs,Uf=T(()=>{"use strict";Lt();La=null;Fs=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=gv().find(r=>Pf(r))??null}openDb(){return!this.dbPath||!Pf(this.dbPath)?null:new(Ff())(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 $a=T(()=>{"use strict"});import{createHash as zk}from"node:crypto";import{readdir as bn,readFile as Af,stat as Ls,unlink as Zk}from"node:fs/promises";import{join as Fe,basename as Qk,dirname as ev}from"node:path";import{cwd as tv}from"node:process";function Rf(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Of(t){return t==="user"}function ja(t){return t==="gemini"||t==="assistant"}function nr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function rv(t){return`${t.sessionId}\0${t.cwd}`}function nv(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 Ms(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Cf(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!ja(a.type)||!a.tokens)continue;let l=Ms(a.tokens.input),c=Ms(a.tokens.cached),u=Math.max(l-c,0),d=Ms(a.tokens.output),f=Ms(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 sv(t){return zk("sha256").update(t).digest("hex")}function Tn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=ev(r);if(n===r)break;r=n}}var Ds,Lf=T(()=>{"use strict";Ct();$a();Je();Ds=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=rv(s),i=r.get(o);r.set(o,i?nv(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 _=nr(g.timestamp),y=g.type,k=ce(Rf(g.content));if(Of(y)){let $=k.trim();$&&(u||(u=G($,80)),d=G($,80)),o.push({role:"user",timestamp:_,content:$||k});continue}if(ja(y)){g.model&&(f=g.model);for(let $ of g.thoughts||[]){let S=[$.subject,$.description].filter(Boolean).join(`
969
+ `).trim();S&&o.push({role:"thinking",timestamp:nr($.timestamp,_),content:ce(S)})}o.push({role:"assistant",timestamp:_,content:k,model:g.model});continue}let v=y?`[${y}] `:"";o.push({role:"system",timestamp:_,content:`${v}${k}`.trim()})}let m=nr(n.startTime,s.createdAt),p=nr(n.lastUpdated,s.modifiedAt),h=Cf(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(Of(m.type)){d++;let p=Rf(m.content).trim();p&&(l||(l=G(ce(p),80)),c=G(ce(p),80))}else ja(m.type)&&(d++,m.model&&(u=m.model));let f=Cf(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:nr(r.startTime,n.createdAt),modifiedAt:nr(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 Af(e,"utf-8");if(En(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 Cs(r)}catch{return null}}extractSessionIdFromFilename(e){let r=Qk(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 bn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Fe(this.geminiTmpDir,n,"chats");if(!(await Ls(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await bn(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 Zk(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:nr(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;Tn(e,tv());for(let n of this.extraWorkspacePaths)Tn(e,n);for(let n of await this.collectGeminiProjectPaths())Tn(e,n);for(let n of await this.collectCodexCwds())Tn(e,n);for(let n of await this.collectClaudeCwds())Tn(e,n);let r=new Map;for(let n of e)r.set(sv(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Af(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 bn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Fe(this.claudeProjectsDir,n);if(!(await Ls(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await bn(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 Ls(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await bn(e)}catch{return r}for(let o of s){let i=Fe(e,o),a=await Ls(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 ov,writeFileSync as iv,mkdirSync as av}from"node:fs";import{join as lv,dirname as cv}from"node:path";import{randomUUID as uv}from"node:crypto";function Aa(t){return new xa(t)}var xa,Ra=T(()=>{"use strict";Lf();Lt();rr();gt();$a();xa=class extends xe{constructor(e){super({provider:new Ds(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)=>jr(r,{...n,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
970
+ `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:ks,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=ov(n,"utf-8"),o=En(s),i=Cs(s),a=uv();i.sessionId=a,i.kind="main";let l=cv(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=lv(l,d);return av(l,{recursive:!0}),iv(f,xf(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 Mf,readFile as dv,rm as fv,stat as xr}from"node:fs/promises";import{basename as mv,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 sr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function _v(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 Ps,Df=T(()=>{"use strict";Ct();Ps=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 Mf(this.sessionStateDir)}catch{return e}for(let n of r){let s=Qe(this.sessionStateDir,n);if((await xr(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=Qe(r,"events.jsonl"),o=await xr(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||mv(r)||e;if(o)for await(let _ of Me(s)){let y=sr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=sr(_.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 k=_.data.content||"",v=k.trim();v&&(m||(m=G(v,80)),p=G(v,80)),l.push({role:"user",timestamp:y,content:ce(v||k)});continue}if(_.type==="assistant.message"&&_.data){let k=(_.data.content||"").trim();if(k&&l.push({role:"assistant",timestamp:y,content:ce(k),model:u}),_.data.toolRequests)for(let v of _.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:v.name||"unknown tool",toolName:v.name,toolInput:v.arguments?JSON.stringify(v.arguments,null,2):void 0,toolCallId:v.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let k=_.data.result?.content||"",v=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:ce(k),toolDetailedContent:v?ce(v):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:y,content:ce(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let k=_.data?.message||"";k.trim()&&l.push({role:"system",timestamp:y,content:ce(k)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??sr(n?.created_at)??a.createdAt,modifiedAt:sr(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 xr(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=sr(_.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 y=(_.data.content||"").trim();y&&(p||(p=G(y,80)),h=G(y,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=o?await _v(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??sr(n?.created_at)??a.createdAt,modifiedAt:sr(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 dv(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 fv(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Mf(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=Qe(this.sessionStateDir,e);if((await xr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=Qe(this.sessionStateDir,s);(await xr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=Qe(this.sessionStateDir,s);if(!(await xr(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function Oa(t){return new xe({provider:new Ps(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)=>jr(e,{...r,acpTool:"copilot"})})}var Ca=T(()=>{"use strict";Df();Lt();rr();gt()});import{existsSync as Pf}from"node:fs";import{join as Fs}from"node:path";import{createRequire as hv}from"node:module";function Ff(){return La===null&&(La=hv(import.meta.url)("node:sqlite").DatabaseSync),La}function gv(){let t=process.env.XDG_DATA_HOME||Fs(be,".local","share"),e=process.env.XDG_CONFIG_HOME||Fs(be,".config");return[Fs(t,"opencode","opencode.db"),Fs(e,"opencode","opencode.db")]}var La,Us,Uf=T(()=>{"use strict";Ct();La=null;Us=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=gv().find(r=>Pf(r))??null}openDb(){return!this.dbPath||!Pf(this.dbPath)?null:new(Ff())(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,
946
972
  s.time_created, s.time_updated
947
973
  FROM session s
948
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
@@ -955,9 +981,9 @@ ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length
955
981
  FROM session s
956
982
  WHERE s.id LIKE ?
957
983
  ORDER BY s.time_updated DESC
958
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Da(){return new Ma}var Ma,Pa=T(()=>{"use strict";Uf();Mt();nr();gt();Ma=class extends xe{constructor(){super({provider:new Fs,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)=>jr(e,{...r,acpTool:"opencode"})})}}});import{readdir as Us,readFile as wv,rm as yv}from"node:fs/promises";import{basename as Wf,join as Ut}from"node:path";function Bf(t){return t.type==="user"||t.message?.role==="user"}function qf(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Hf(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 Da(){return new Ma}var Ma,Pa=T(()=>{"use strict";Uf();Lt();rr();gt();Ma=class extends xe{constructor(){super({provider:new Us,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)=>jr(e,{...r,acpTool:"opencode"})})}}});import{readdir as Ws,readFile as wv,rm as yv}from"node:fs/promises";import{basename as Wf,join as Ft}from"node:path";function Bf(t){return t.type==="user"||t.message?.role==="user"}function qf(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Hf(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(`
959
985
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
960
- `):"":""}function Jf(t){return t.model||t.message?.model}var Ws,Xf=T(()=>{"use strict";Lt();Ws=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 Us(e)}catch{return[]}let n=[];for(let s of r){let o=Ut(e,s,"chats"),i;try{i=await Us(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)),Bf(d)){let f=Hf(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(qf(d)){let f=Jf(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=Wf(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(Bf(f)){let h=Hf(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(qf(f)){let h=Jf(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 Us(r),s=[];for(let o of n){let i=Ut(r,o,"chats",`${e}.jsonl`);try{return await wv(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Ut(r,o,"chats"),a;try{a=await Us(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Wf(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 yv(r),!0}catch{return!1}}}});function Ua(){return new Fa}var Fa,Wa=T(()=>{"use strict";Xf();Mt();nr();gt();Fa=class extends xe{constructor(){super({provider:new Ws,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:xs})}}});import{readdir as Gf,readFile as Ev,rm as Vf,stat as Kf}from"node:fs/promises";import{basename as Ba,join as bt}from"node:path";async function bv(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 Tv(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Yf(t){return t.type==="USER_INPUT"}function zf(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function Sv(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Zf(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Qf(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 kv(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function vv(t){for await(let e of Me(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=Iv(s);if(o)return o}let n=Nv(e.content);if(n)return n}return null}function Iv(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 Nv(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function em(t){if(t.endsWith(".db"))return Ba(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Bs,tm=T(()=>{"use strict";Lt();Bs=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||bt(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:bt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=bt(this.baseDir,"conversations"),r;try{r=await Gf(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Ba(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return bt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return bt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await Kf(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await bv([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=Qf(f.content);if(m&&(a=m),Yf(f)){let p=Zf(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else zf(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=em(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=Tv(u.created_at,s.modifiedAt),f=Qf(u.content);if(f&&(a=f),Yf(u)){let m=Zf(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:kv(m.args),toolName:m.name||"tool"});zf(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):Sv(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 Kf(r),r}catch{}let n=bt(this.baseDir,"conversations");try{let s=[];for(let o of await Gf(n)){if(!o.endsWith(".db"))continue;Ba(o,".db").startsWith(e)&&s.push(bt(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=em(r);return n?(await Vf(this.conversationPath(n),{force:!0}),await Vf(bt(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 vv(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=bt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await Ev(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as $v}from"node:child_process";function Ha(t){return new qa(t)}async function jv(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",Av(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 xv(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 xv(t,e,r){return new Promise((n,s)=>{let o;try{o=$v(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 Av(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var qa,Ja=T(()=>{"use strict";tm();Mt();gt();hn();qa=class extends xe{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",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:jv})}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 Rv}from"node:crypto";import{join as Ov}from"node:path";function Cv(t){return Rv("sha256").update(t).digest("hex").slice(0,8)}function Lv(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function Mv(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 Dv(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function qs(t){return Math.max(1,Math.ceil(t.length/4))}function rm(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 Va(){return new Ga}var ir,Xa,Ga,Ka=T(()=>{"use strict";ir=new Map;Xa=class{name="ClaudeMock";async discoverSessions(){return[...ir.values()].map(rm)}async loadSession(e){let r=ir.get(e);return r===void 0?null:{...rm(r),messages:r.messages.slice()}}async resolveSessionPath(e){return ir.get(e)?.filePath??null}async deleteSession(e){return ir.delete(e)}},Ga=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Xa;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=Lv(Mv(e,r)),s=`mock-${n}-${Cv(`${e}:${n}`)}`,o=new Date,i=ir.get(s),a=r?.prompt??"ClaudeMock seed",l=qs(a),c={sessionId:s,cwd:e,filePath:Ov(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"),ir.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=ir.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${Dv(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 ct(t){let e=[Sa({claudeDir:t?.claudeDir}),Ia({codexDir:t?.codexDir,codeDir:t?.codeDir}),Aa({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Oa({copilotDir:t?.copilotDir}),Da(),Ua(),Ha({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Va()),e}var Ya=T(()=>{"use strict";ka();Na();Ra();Ca();Pa();Wa();Ja();Ka();ka();Na();Ra();Ca();Pa();Wa();Ja();Ka()});var el={};ie(el,{ProviderRegistry:()=>_n,TransportConnectionError:()=>ye,TransportError:()=>He,TransportJsonError:()=>ks,TransportProcessError:()=>wt,TransportRpcError:()=>yt,_resetDefaultRegistryForTests:()=>Pv,chat:()=>ar,countTokens:()=>Qa,createAdapterRegistry:()=>at,createAllAdapters:()=>ct,listSessions:()=>Za,seed:()=>za});function Js(){return Hs===null&&(Hs=at(ct())),Hs}function Pv(){Hs=null}function sm(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function ar(t){let e=t.registry??Js(),r=sm(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 za(t){let e=t.registry??Js(),r=sm(e,t.provider),n=await nm(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 nm(e,t.provider,t.cwd),i=Fv(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function nm(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 Fv(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 Za(t={}){return(t.registry??Js()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Qa(t){let r=await(t.registry??Js()).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 Hs,Tt=T(()=>{"use strict";pa();Ya();pa();Ya();Ir();Hs=null});function Uv(){return tl===null&&(tl=at(ct())),tl}async function Rr(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 Bv(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Ar.delete(r),e.setMemberState(r,"idle");else{let i=Wv(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function Wv(t,e){if(!(t instanceof Ee))return Ar.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=(Ar.get(e)??0)+1;return r>=3?(Ar.delete(e),"consecutive_timeouts"):(Ar.set(e,r),null)}return Ar.delete(e),null}async function Bv(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=Uv(),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`,rl(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${om(u)}`,rl(t.sessionid,t.sessiondir,"unresolved")))}let o=rl(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 ar({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):qv(u,o)}finally{a!==null&&clearTimeout(a)}}function rl(t,e,r){return["<library>","chat",t,e,"--provider",r]}function om(t){return t instanceof Error?t.message:String(t)}function qv(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 wt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof yt?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof He?new Ee("other",null,t.message,e):new Ee("other",null,om(t),e)}var Ee,tl,Ar,Sn=T(()=>{"use strict";Tt();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"}},tl=null;Ar=new Map});function im(){return nl===null&&(nl=at(ct())),nl}function Jv(t,e){if(!Hv.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 Or(t){let e=Jv(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await Xv({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function Xv(t){let e=t.member.provider,r=t.member.sessiondir,n=sl("seed",r,e);try{let s=await za({provider:e,cwd:r,registry:im()});if(!s.success)throw Vv(s.error,n);if(!s.sessionId)throw new Te("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Te?s:ol(s,n)}}async function am(t){return Gv(t)}async function Gv(t){let e=im(),r=sl("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:ol(o,r)}let s=sl("tokens",t.sessionid,n);try{let o=await Qa({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:ol(o,s)}}function sl(t,e,r){return["<library>",t,e,"--provider",r]}function Vv(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 ol(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 wt?new Te("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof yt?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,nl,Hv,Xs=T(()=>{"use strict";Tt();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"}},nl=null;Hv=/^provider[123]$/});function Gs(t){return Buffer.from(t,"utf8").toString("base64url")}function vn(t){return Buffer.from(t,"base64url").toString("utf8")}async function lm(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 Kv(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=um(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new kn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Rr({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 il(t,e,r){let n=um(t,e,r);if(n===null)throw new Error("session member not found");let s=await Or({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:dm(t,e,r)}}function Kv(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function um(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 kn,Vs=T(()=>{"use strict";Sn();Xs();kn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function al(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??zv(e),s=r-n,o=e.query(`
986
+ `):"":""}function Jf(t){return t.model||t.message?.model}var Bs,Xf=T(()=>{"use strict";Ct();Bs=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Ft(be,".qwen")}async discoverSessions(){let e=Ft(this.baseDir,"projects"),r;try{r=await Ws(e)}catch{return[]}let n=[];for(let s of r){let o=Ft(e,s,"chats"),i;try{i=await Ws(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Ft(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)),Bf(d)){let f=Hf(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(qf(d)){let f=Jf(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=Wf(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(Bf(f)){let h=Hf(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(qf(f)){let h=Jf(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=Ft(this.baseDir,"projects");try{let n=await Ws(r),s=[];for(let o of n){let i=Ft(r,o,"chats",`${e}.jsonl`);try{return await wv(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Ft(r,o,"chats"),a;try{a=await Ws(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Wf(l,".jsonl").startsWith(e)&&s.push(Ft(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 yv(r),!0}catch{return!1}}}});function Ua(){return new Fa}var Fa,Wa=T(()=>{"use strict";Xf();Lt();rr();gt();Fa=class extends xe{constructor(){super({provider:new Bs,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:As})}}});import{readdir as Gf,readFile as Ev,rm as Vf,stat as Kf}from"node:fs/promises";import{basename as Ba,join as bt}from"node:path";async function bv(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 Tv(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Yf(t){return t.type==="USER_INPUT"}function zf(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function Sv(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Zf(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Qf(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 kv(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function vv(t){for await(let e of Me(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=Iv(s);if(o)return o}let n=Nv(e.content);if(n)return n}return null}function Iv(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 Nv(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function em(t){if(t.endsWith(".db"))return Ba(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var qs,tm=T(()=>{"use strict";Ct();qs=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||bt(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:bt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=bt(this.baseDir,"conversations"),r;try{r=await Gf(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Ba(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return bt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return bt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await Kf(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await bv([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=Qf(f.content);if(m&&(a=m),Yf(f)){let p=Zf(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else zf(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=em(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=Tv(u.created_at,s.modifiedAt),f=Qf(u.content);if(f&&(a=f),Yf(u)){let m=Zf(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:kv(m.args),toolName:m.name||"tool"});zf(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):Sv(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 Kf(r),r}catch{}let n=bt(this.baseDir,"conversations");try{let s=[];for(let o of await Gf(n)){if(!o.endsWith(".db"))continue;Ba(o,".db").startsWith(e)&&s.push(bt(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=em(r);return n?(await Vf(this.conversationPath(n),{force:!0}),await Vf(bt(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 vv(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=bt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await Ev(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as $v}from"node:child_process";function Ha(t){return new qa(t)}async function jv(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",Av(e.timeoutMs)];e.model&&n.push("--model",e.model),Dt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await xv(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 xv(t,e,r){return new Promise((n,s)=>{let o;try{o=$v(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 Av(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var qa,Ja=T(()=>{"use strict";tm();Lt();gt();hn();qa=class extends xe{constructor(e){super({provider:new qs(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:jv})}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 Rv}from"node:crypto";import{join as Ov}from"node:path";function Cv(t){return Rv("sha256").update(t).digest("hex").slice(0,8)}function Lv(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function Mv(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 Dv(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Hs(t){return Math.max(1,Math.ceil(t.length/4))}function rm(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 Va(){return new Ga}var or,Xa,Ga,Ka=T(()=>{"use strict";or=new Map;Xa=class{name="ClaudeMock";async discoverSessions(){return[...or.values()].map(rm)}async loadSession(e){let r=or.get(e);return r===void 0?null:{...rm(r),messages:r.messages.slice()}}async resolveSessionPath(e){return or.get(e)?.filePath??null}async deleteSession(e){return or.delete(e)}},Ga=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Xa;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=Lv(Mv(e,r)),s=`mock-${n}-${Cv(`${e}:${n}`)}`,o=new Date,i=or.get(s),a=r?.prompt??"ClaudeMock seed",l=Hs(a),c={sessionId:s,cwd:e,filePath:Ov(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+=Hs("ACK: ClaudeMock seeded"),or.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=or.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${Dv(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+=Hs(e),s.totalOutputTokens+=Hs(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=[Sa({claudeDir:t?.claudeDir}),Ia({codexDir:t?.codexDir,codeDir:t?.codeDir}),Aa({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Oa({copilotDir:t?.copilotDir}),Da(),Ua(),Ha({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Va()),e}var Ya=T(()=>{"use strict";ka();Na();Ra();Ca();Pa();Wa();Ja();Ka();ka();Na();Ra();Ca();Pa();Wa();Ja();Ka()});var el={};ie(el,{ProviderRegistry:()=>_n,TransportConnectionError:()=>ye,TransportError:()=>He,TransportJsonError:()=>vs,TransportProcessError:()=>wt,TransportRpcError:()=>yt,_resetDefaultRegistryForTests:()=>Pv,chat:()=>ir,countTokens:()=>Qa,createAdapterRegistry:()=>it,createAllAdapters:()=>lt,listSessions:()=>Za,seed:()=>za});function Xs(){return Js===null&&(Js=it(lt())),Js}function Pv(){Js=null}function sm(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function ir(t){let e=t.registry??Xs(),r=sm(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 za(t){let e=t.registry??Xs(),r=sm(e,t.provider),n=await nm(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 nm(e,t.provider,t.cwd),i=Fv(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function nm(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 Fv(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 Za(t={}){return(t.registry??Xs()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Qa(t){let r=await(t.registry??Xs()).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 Js,Tt=T(()=>{"use strict";pa();Ya();pa();Ya();Ir();Js=null});function Uv(){return tl===null&&(tl=it(lt())),tl}async function Rr(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 Bv(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Ar.delete(r),e.setMemberState(r,"idle");else{let i=Wv(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function Wv(t,e){if(!(t instanceof Ee))return Ar.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=(Ar.get(e)??0)+1;return r>=3?(Ar.delete(e),"consecutive_timeouts"):(Ar.set(e,r),null)}return Ar.delete(e),null}async function Bv(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=Uv(),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`,rl(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${om(u)}`,rl(t.sessionid,t.sessiondir,"unresolved")))}let o=rl(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 ir({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):qv(u,o)}finally{a!==null&&clearTimeout(a)}}function rl(t,e,r){return["<library>","chat",t,e,"--provider",r]}function om(t){return t instanceof Error?t.message:String(t)}function qv(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 wt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof yt?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof He?new Ee("other",null,t.message,e):new Ee("other",null,om(t),e)}var Ee,tl,Ar,Sn=T(()=>{"use strict";Tt();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"}},tl=null;Ar=new Map});function im(){return nl===null&&(nl=it(lt())),nl}function Jv(t,e){if(!Hv.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 Or(t){let e=Jv(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await Xv({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function Xv(t){let e=t.member.provider,r=t.member.sessiondir,n=sl("seed",r,e);try{let s=await za({provider:e,cwd:r,registry:im()});if(!s.success)throw Vv(s.error,n);if(!s.sessionId)throw new Te("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Te?s:ol(s,n)}}async function am(t){return Gv(t)}async function Gv(t){let e=im(),r=sl("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:ol(o,r)}let s=sl("tokens",t.sessionid,n);try{let o=await Qa({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:ol(o,s)}}function sl(t,e,r){return["<library>",t,e,"--provider",r]}function Vv(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 ol(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 wt?new Te("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof yt?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,nl,Hv,Gs=T(()=>{"use strict";Tt();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"}},nl=null;Hv=/^provider[123]$/});function Vs(t){return Buffer.from(t,"utf8").toString("base64url")}function vn(t){return Buffer.from(t,"base64url").toString("utf8")}async function lm(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 Kv(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=um(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new kn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Rr({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 il(t,e,r){let n=um(t,e,r);if(n===null)throw new Error("session member not found");let s=await Or({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:dm(t,e,r)}}function Kv(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function um(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 kn,Ks=T(()=>{"use strict";Sn();Gs();kn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function al(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??zv(e),s=r-n,o=e.query(`
961
987
  SELECT
962
988
  isess.id AS interactive_session_id,
963
989
  isess.run_id,
@@ -983,16 +1009,16 @@ ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length
983
1009
  JOIN step s ON s.id = isess.step_id
984
1010
  WHERE isess.status = 'waiting_agent'
985
1011
  AND r.terminal_state IS NULL
986
- `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=e0(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=Zv(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,Qv(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 zv(t){return fm(t.getConfig(Ks),Yv)*1e3}function ll(t,e){return fm(t.getConfig(Ys),e)}function fm(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 Zv(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function Qv(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=e0(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=Zv(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,Qv(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 zv(t){return fm(t.getConfig(Ys),Yv)*1e3}function ll(t,e){return fm(t.getConfig(zs),e)}function fm(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 Zv(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function Qv(t,e,r,n){return t.query(`SELECT * FROM attention
987
1013
  WHERE kind = 'session_hung'
988
1014
  AND run_id = ?
989
- AND acknowledged_at IS NULL`,e).some(o=>{let i=mm(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function e0(t,e,r){let n=mm(t);return n===null?null:t0(n,e,r)??r0(n,e,r)}function t0(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(n0),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=lr(s.members)?s.members:null,i=o!==null&&lr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function r0(t,e,r){if(!lr(t.states))return null;let n=t.states[e]??t.states[r];if(!lr(n))return null;let s=n;if(!lr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function n0(t){return lr(t)}function mm(t){if(t===null)return null;try{let e=JSON.parse(t);return lr(e)?e:null}catch{return null}}function lr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ks,Ys,Yv,cl=T(()=>{"use strict";Le();Ks="monitor.session_hung.elapsed_threshold_seconds",Ys="monitor.session_hung.check_interval_ms",Yv=600});function Zs(t){let e=t.query(`
1015
+ AND acknowledged_at IS NULL`,e).some(o=>{let i=mm(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function e0(t,e,r){let n=mm(t);return n===null?null:t0(n,e,r)??r0(n,e,r)}function t0(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(n0),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=ar(s.members)?s.members:null,i=o!==null&&ar(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function r0(t,e,r){if(!ar(t.states))return null;let n=t.states[e]??t.states[r];if(!ar(n))return null;let s=n;if(!ar(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function n0(t){return ar(t)}function mm(t){if(t===null)return null;try{let e=JSON.parse(t);return ar(e)?e:null}catch{return null}}function ar(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ys,zs,Yv,cl=T(()=>{"use strict";Le();Ys="monitor.session_hung.elapsed_threshold_seconds",zs="monitor.session_hung.check_interval_ms",Yv=600});function Qs(t){let e=t.query(`
990
1016
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
991
- `),r={queued:zs(e,"queued"),running:zs(e,"running"),done:zs(e,"done"),failed:zs(e,"failed"),total:dl(e)},n=t.query(`
1017
+ `),r={queued:Zs(e,"queued"),running:Zs(e,"running"),done:Zs(e,"done"),failed:Zs(e,"failed"),total:dl(e)},n=t.query(`
992
1018
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
993
1019
  `),s=t.query(`
994
1020
  SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
995
- `);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:dl(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:dl(s)},projects:ul(t,"project"),teams:ul(t,"team"),workflows:ul(t,"workflow")}}function Qs(t){return t.listProjects()}function hm(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function eo(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:dl(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:dl(s)},projects:ul(t,"project"),teams:ul(t,"team"),workflows:ul(t,"workflow")}}function eo(t){return t.listProjects()}function hm(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function to(t){return t.query(`
996
1022
  SELECT w.*
997
1023
  FROM workflow w
998
1024
  JOIN (
@@ -1001,16 +1027,16 @@ ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length
1001
1027
  GROUP BY name
1002
1028
  ) latest ON latest.name = w.name AND latest.version = w.version
1003
1029
  ORDER BY w.name ASC
1004
- `)}function gm(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 wm(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 ym(t,e){return t.getSubmittedPr(e)}function to(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Cr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function cr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:to(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:s0(t,r.id)}}function s0(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Em(t,r.id)}))}function fl(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:Em(t,n.id)}}function Em(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function ur(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 bm(t,e,r){let n=fl(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 Tm(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 Sm(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 ro(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(`${km}
1030
+ `)}function gm(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 wm(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 ym(t,e){return t.getSubmittedPr(e)}function ro(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Cr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function lr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:ro(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:s0(t,r.id)}}function s0(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Em(t,r.id)}))}function fl(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:Em(t,n.id)}}function Em(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function cr(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 bm(t,e,r){let n=fl(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 Tm(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 Sm(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 Wt(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 no(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(`${km}
1005
1031
  WHERE ${n}
1006
- ORDER BY a.created_at DESC`,...r).map(vm)}function ut(t,e){let n=t.query(`${km}
1032
+ ORDER BY a.created_at DESC`,...r).map(vm)}function ct(t,e){let n=t.query(`${km}
1007
1033
  WHERE a.id = ?`,e)[0];return n===void 0?null:vm(n)}function vm(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 Im(t){return t.query(`
1008
1034
  SELECT w.name AS workflow_name, r.terminal_state, COUNT(*) AS count
1009
1035
  FROM run r
1010
1036
  JOIN workflow w ON w.id = r.workflow_id
1011
1037
  GROUP BY w.name, r.terminal_state
1012
1038
  ORDER BY w.name ASC, r.terminal_state ASC
1013
- `)}function ul(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function zs(t,e){return t.find(r=>r.status===e)?.count??0}function dl(t){return t.reduce((e,r)=>e+r.count,0)}function ml(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 ul(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function Zs(t,e){return t.find(r=>r.status===e)?.count??0}function dl(t){return t.reduce((e,r)=>e+r.count,0)}function ml(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
1014
1040
  FROM step s
1015
1041
  JOIN run r ON r.id = s.run_id
1016
1042
  JOIN job j ON j.id = r.job_id
@@ -1077,9 +1103,9 @@ ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length
1077
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 Nm(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 Lr(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?Nm(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
1078
1104
  FROM interactive_session
1079
1105
  WHERE run_id = ? AND status = 'waiting_operator'
1080
- 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,y=l.get(g),k="pending",v=null;if(g.startsWith("@terminal:"))k=r.terminal_state===g.slice(10)?"done":"pending";else if(y!==void 0&&(y.ended_at===null?k=_&&u===g?"paused":"running":y.outcome===null?k="failed":k="done",y.ended_at!==null)){let $=Date.parse(y.started_at),S=Date.parse(y.ended_at);!Number.isNaN($)&&!Number.isNaN(S)&&(v=S-$)}_&&u===g&&(k="paused"),h.push({id:g,status:k,is_current:_,elapsed_ms:v,prompt:_&&k==="paused"?f:null,expected:_&&k==="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 no(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(...o0(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,y=l.get(g),k="pending",v=null;if(g.startsWith("@terminal:"))k=r.terminal_state===g.slice(10)?"done":"pending";else if(y!==void 0&&(y.ended_at===null?k=_&&u===g?"paused":"running":y.outcome===null?k="failed":k="done",y.ended_at!==null)){let $=Date.parse(y.started_at),S=Date.parse(y.ended_at);!Number.isNaN($)&&!Number.isNaN(S)&&(v=S-$)}_&&u===g&&(k="paused"),h.push({id:g,status:k,is_current:_,elapsed_ms:v,prompt:_&&k==="paused"?f:null,expected:_&&k==="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 so(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(...o0(o));return`${e.join(`
1081
1107
  `)}
1082
- `}function o0(t){let e=[],r=i0(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 i0(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function so(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?Nm(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=$=>c.schema==="v3"&&c.nameToId.has($)?c.nameToId.get($):$,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let $ of d)f.set(u($.state_name),$);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let $ of m)p.set(u($.state_name),$);let h=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let $ of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1108
+ `}function o0(t){let e=[],r=i0(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 i0(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function oo(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?Nm(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=$=>c.schema==="v3"&&c.nameToId.has($)?c.nameToId.get($):$,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let $ of d)f.set(u($.state_name),$);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let $ of m)p.set(u($.state_name),$);let h=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let $ of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1083
1109
  FROM session_event
1084
1110
  WHERE run_id = ? AND step_id IS NOT NULL
1085
1111
  GROUP BY step_id`,e))$.step_id!==null&&h.set($.step_id,$.timestamp_ms);let _=a0(c,d,u),y=l0(s.current_state),k=t.query(`SELECT kind, severity, payload
@@ -1087,9 +1113,9 @@ ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length
1087
1113
  WHERE run_id = ?
1088
1114
  AND kind = 'session_hung'
1089
1115
  AND acknowledged_at IS NULL
1090
- ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:_0($.payload)})),v=_.map($=>{let S=f.get($),R=p.get($),L=c0(s,$,y,S,R),q=S===void 0?null:Date.parse(S.started_at),ee=S?.ended_at===null||S===void 0?null:Date.parse(S.ended_at),j=S===void 0||Number.isNaN(q??NaN)?null:ee!==null&&!Number.isNaN(ee)?ee-q:L==="running"||L==="paused"?n-q:null,H=S===void 0?null:h.get(S.id)??null,me=h0(R?.last_activity_at??null,H,g),I=o===null||R===void 0?void 0:f0(t,s.team_id,o.definition,R.state_name,S?.state_name??$);return{step_id:S?.id??null,state_id:$,status:L,started_at:S?.started_at??null,ended_at:S?.ended_at??null,last_activity_at:me,elapsed_ms:j,...I!==void 0?{member:I}:{},...R!==void 0?{interactive_session:{id:R.id,status:R.status,turn_count:R.turn_count,state_name:R.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:d0(s,a,v),submitted_at:a?.enqueued_at??s.started_at,nodes:v,current_node_index:u0(v,s.terminal_state!==null),related_attentions:k}}function oo(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} (${_m(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 ${io(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 ${_m(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}${g0(a.payload)}`)}return`${n.join(`
1116
+ ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:_0($.payload)})),v=_.map($=>{let S=f.get($),R=p.get($),L=c0(s,$,y,S,R),q=S===void 0?null:Date.parse(S.started_at),ee=S?.ended_at===null||S===void 0?null:Date.parse(S.ended_at),j=S===void 0||Number.isNaN(q??NaN)?null:ee!==null&&!Number.isNaN(ee)?ee-q:L==="running"||L==="paused"?n-q:null,H=S===void 0?null:h.get(S.id)??null,me=h0(R?.last_activity_at??null,H,g),I=o===null||R===void 0?void 0:f0(t,s.team_id,o.definition,R.state_name,S?.state_name??$);return{step_id:S?.id??null,state_id:$,status:L,started_at:S?.started_at??null,ended_at:S?.ended_at??null,last_activity_at:me,elapsed_ms:j,...I!==void 0?{member:I}:{},...R!==void 0?{interactive_session:{id:R.id,status:R.status,turn_count:R.turn_count,state_name:R.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:d0(s,a,v),submitted_at:a?.enqueued_at??s.started_at,nodes:v,current_node_index:u0(v,s.terminal_state!==null),related_attentions:k}}function io(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} (${_m(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 ${ao(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 ${_m(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}${g0(a.payload)}`)}return`${n.join(`
1091
1117
  `)}
1092
- `}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 l0(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function c0(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 u0(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 d0(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 f0(t,e,r,n,s){let o=m0(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 m0(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 _0(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 h0(...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)?"[+? ]":`[+${io(Math.max(0,n-r)).padEnd(6)}]`}function _m(t,e){return Number.isNaN(t)?"?":io(Math.max(0,e-t))}function io(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 g0(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"?`, ${io(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var km,St=T(()=>{"use strict";Le();km=`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 l0(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function c0(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 u0(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 d0(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 f0(t,e,r,n,s){let o=m0(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 m0(t,e,r){let n=p0(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Ut(a)?a.id===e||a.name===e||a.name===r:!1),o=Ut(s?.members)?s.members:null,i=o!==null&&Ut(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Ut(n.states)){let s=n.states[e]??n.states[r];if(!Ut(s))return null;let o=Ut(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 Ut(e)?e:null}catch{return null}}function _0(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Ut(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function h0(...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)?"[+? ]":`[+${ao(Math.max(0,n-r)).padEnd(6)}]`}function _m(t,e){return Number.isNaN(t)?"?":ao(Math.max(0,e-t))}function ao(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 g0(t){if(!Ut(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"?`, ${ao(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var km,St=T(()=>{"use strict";Le();km=`SELECT a.id AS attention_id,
1093
1119
  a.kind AS kind,
1094
1120
  a.severity AS severity,
1095
1121
  a.created_at AS created_at,
@@ -1111,40 +1137,40 @@ ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length
1111
1137
  ON isess.run_id = a.run_id
1112
1138
  AND isess.id = (
1113
1139
  SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
1114
- )`});var qm={};ie(qm,{parseApiArgs:()=>Rm,readApiClientConfig:()=>Nn,runApi:()=>S0});import{readFileSync as w0}from"node:fs";import{basename as y0,extname as E0}from"node:path";async function S0(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(T0),0;if(t[0]==="config")return v0(t.slice(1),e);let r=Wm(t,"--direct");if(r.rest[0]==="escalations")return I0(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&co(r.rest.slice(2)))return e.stdout.write(`${x0}
1140
+ )`});var qm={};ie(qm,{parseApiArgs:()=>Rm,readApiClientConfig:()=>Nn,runApi:()=>S0});import{readFileSync as w0}from"node:fs";import{basename as y0,extname as E0}from"node:path";async function S0(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(T0),0;if(t[0]==="config")return v0(t.slice(1),e);let r=Wm(t,"--direct");if(r.rest[0]==="escalations")return I0(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&uo(r.rest.slice(2)))return e.stdout.write(`${x0}
1115
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
1116
- `),2):kI(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&co(r.rest.slice(2)))return e.stdout.write(`${$0}
1117
- `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&co(r.rest.slice(2)))return e.stdout.write(`${j0}
1142
+ `),2):kI(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&uo(r.rest.slice(2)))return e.stdout.write(`${$0}
1143
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&uo(r.rest.slice(2)))return e.stdout.write(`${j0}
1118
1144
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?EI(r.rest.slice(2),e):bI(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?TI(r.rest.slice(2),e):SI(r.rest.slice(2),e);if(r.present)return oI(r.rest,e);let n=Rm(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1119
- `),2;let s=dr(e),o=s.baseUrl,i=qt(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=P0(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1145
+ `),2;let s=ur(e),o=s.baseUrl,i=Bt(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=P0(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1120
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)}
1121
1147
  `),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1122
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
1123
- `),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)}
1149
+ `),2;let d;try{d=await fetch(new URL(`/api/jobs/${u}/run`,o),{method:"POST",headers:Bt("application/json",s.token)})}catch(m){return e.stderr.write(`error: network failure: ${m instanceof Error?m.message:String(m)}
1124
1150
  `),2}if(!d.ok)return e.stderr.write(`error: HTTP ${d.status}: ${await d.text()}
1125
1151
  `),d.status===400?2:1;let f=await d.json();n.json?e.stdout.write(`${JSON.stringify(f,null,2)}
1126
1152
  `):e.stdout.write(`${JSON.stringify(f)}
1127
1153
  `)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1128
1154
  `):(e.stdout.write(await l.text()),e.stdout.write(`
1129
- `));return 0}function Rm(t){let e=Lm(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"?lo(o,"/api/status",n):s==="projects"?lo(o,"/api/projects",n):s==="teams"?lo(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?V0(o.slice(1),e.format):lo(o,"/api/workflows",n):s==="workflow"?G0(o,n):s==="upload"?J0(o,n):s==="submit-job"?X0(o,n):s==="issues"?H0(o,n):s==="jobs"?In(o,"--status","/api/jobs","status",n):s==="job"?q0(o,n):s==="project"?K0(o,n):s==="artifact"?Z0(o,n):s==="runs"?In(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?In(o,"--type","/api/external-objects","type",n):s==="external-signals"?jm(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?Q0(o,n):jm(o,"--unacked","/api/attentions","unacked",n):s==="stats"?eI(o,n):s==="daemon"?tI(o,n):s==="intake"?rI(o,n):s==="session"?nI(o,n):s==="run"?sI(o,e.format):s==="prs"?In(o,"--status","/api/submitted-prs","status",n):s==="pr"?W0(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 dr(t){if(t.dal!==void 0)return Nn(t.dal,process.env,t);let e=pe({path:de()});try{return Nn(e,process.env,t)}finally{e.close()}}function Nn(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=b0;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: ${k0(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1155
+ `));return 0}function Rm(t){let e=Lm(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"?co(o,"/api/status",n):s==="projects"?co(o,"/api/projects",n):s==="teams"?co(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?V0(o.slice(1),e.format):co(o,"/api/workflows",n):s==="workflow"?G0(o,n):s==="upload"?J0(o,n):s==="submit-job"?X0(o,n):s==="issues"?H0(o,n):s==="jobs"?In(o,"--status","/api/jobs","status",n):s==="job"?q0(o,n):s==="project"?K0(o,n):s==="artifact"?Z0(o,n):s==="runs"?In(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?In(o,"--type","/api/external-objects","type",n):s==="external-signals"?jm(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?Q0(o,n):jm(o,"--unacked","/api/attentions","unacked",n):s==="stats"?eI(o,n):s==="daemon"?tI(o,n):s==="intake"?rI(o,n):s==="session"?nI(o,n):s==="run"?sI(o,e.format):s==="prs"?In(o,"--status","/api/submitted-prs","status",n):s==="pr"?W0(o,n):`unknown subcommand: ${s}`}function Bt(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function ur(t){if(t.dal!==void 0)return Nn(t.dal,process.env,t);let e=pe({path:de()});try{return Nn(e,process.env,t)}finally{e.close()}}function Nn(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=b0;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: ${k0(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1130
1156
  `);return{baseUrl:o,token:a}}function k0(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 v0(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1131
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>
1132
- `),2;let i=n[0];if(!ao.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...ao].join(", ")})
1158
+ `),2;let i=n[0];if(!lo.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...lo].join(", ")})
1133
1159
  `),2;let a=o.getConfig(i);return a===null?(e.stderr.write(`error: ${i} is not set
1134
1160
  `),1):(e.stdout.write(`${a}
1135
1161
  `),0)}if(r==="set"){if(n.length!==2)return e.stderr.write(`usage: lmctl api config set <key> <value>
1136
- `),2;let[i,a]=n;if(!ao.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...ao].join(", ")})
1162
+ `),2;let[i,a]=n;if(!lo.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...lo].join(", ")})
1137
1163
  `),2;let l=D0(i,a);return l!==null?(e.stderr.write(`error: ${l}
1138
1164
  `),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${$m(i,a,!1)}
1139
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}
1140
1166
  `),2}let a=o.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return e.stdout.write(`(no config rows)
1141
1167
  `),0;for(let c of l)e.stdout.write(`${c} = ${$m(c,a[c],i)}
1142
1168
  `);return 0}return e.stderr.write(`error: unknown api config verb: ${r}
1143
- `),2}finally{s&&o.close()}}async function I0(t,e,r){if(co(t))return e.stdout.write(`${N0}
1169
+ `),2}finally{s&&o.close()}}async function I0(t,e,r){if(uo(t))return e.stdout.write(`${N0}
1144
1170
  `),0;let n=Wm(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>
1145
1171
  `),2):s?A0(i,a,e):i==="list"?O0(a,e):i==="show"?L0(a,e):i==="respond"?M0(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
1146
- `),2)}function co(t){return t.some(e=>e==="--help"||e==="-h")}function A0(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:de()});try{return Bm(s,[t,...e],r)}finally{n&&s.close()}}function Om(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 O0(t,e){let r=Om(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1147
- `),2;let n=dr(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)}
1172
+ `),2)}function uo(t){return t.some(e=>e==="--help"||e==="-h")}function A0(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:de()});try{return Bm(s,[t,...e],r)}finally{n&&s.close()}}function Om(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 O0(t,e){let r=Om(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1173
+ `),2;let n=ur(e),s=Bt("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)}
1148
1174
  `),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1149
1175
  `),a.status===400?2:1;let l=await a.json();return Cm(l,r.json,e)}function Cm(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
1150
1176
  `),0;if(t.length===0)return r.stdout.write(`No pending escalations.
@@ -1158,18 +1184,18 @@ ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length
1158
1184
  `),r.stdout.write(`
1159
1185
  `)}return 0}function C0(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 L0(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]
1160
1186
  `),2;let n=ne(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
1161
- `),2;let s=dr(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)}
1187
+ `),2;let s=ur(e),o=Bt("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)}
1162
1188
  `),1}return i.status===404?(e.stderr.write(`error: escalation not found: ${n}
1163
1189
  `),1):i.ok?(e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1164
1190
  `),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1165
1191
  `),i.status===400?2:1)}async function M0(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]
1166
1192
  `),2;let o=ne(s[0],"attention_id");if(typeof o=="string")return e.stderr.write(`error: ${o}
1167
- `),2;let i=s[1],a=dr(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)}
1193
+ `),2;let i=s[1],a=ur(e),l=Bt("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)}
1168
1194
  `),1}if(u.status===404)return e.stderr.write(`error: escalation not found: ${o}
1169
1195
  `),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
1170
1196
  `),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
1171
1197
  `):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
1172
- `),0}function $m(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function D0(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===Ks||t===Ys){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function P0(t,e){let r=w0(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:F0(t)}),y0(t)),e!==void 0&&s.append("project",e),s}function F0(t){switch(E0(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 W0(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return In(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 Lm(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 lo(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function In(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 jm(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 B0(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 q0(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return B0([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=_l(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 H0(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"?Mm(n,e):r==="claim"?Dm(n,e):r==="claim-next"?Pm(n,e):r==="close"?Fm(n,e):r==="reopen"?Um(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Mm(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=_l(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 Dm(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 Pm(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 Fm(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 Um(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 J0(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 X0(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 _l(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 V0(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 K0(t,e){let[r,n,...s]=t;return r==="workflow"?Y0([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 Y0(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=z0(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 z0(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=_l(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 Z0(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 Q0(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 eI(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 tI(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 rI(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 nI(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=Gs(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 sI(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 Wm(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 oI(t,e){let r=Lm(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1198
+ `),0}function $m(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function D0(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===Ys||t===zs){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function P0(t,e){let r=w0(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:F0(t)}),y0(t)),e!==void 0&&s.append("project",e),s}function F0(t){switch(E0(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 W0(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return In(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 Lm(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 co(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function In(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 jm(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 B0(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 q0(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return B0([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=_l(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 H0(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"?Mm(n,e):r==="claim"?Dm(n,e):r==="claim-next"?Pm(n,e):r==="close"?Fm(n,e):r==="reopen"?Um(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Mm(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=_l(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 Dm(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 Pm(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 Fm(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 Um(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 J0(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 X0(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 _l(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 V0(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 K0(t,e){let[r,n,...s]=t;return r==="workflow"?Y0([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 Y0(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=z0(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 z0(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=_l(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 Z0(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 Q0(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 eI(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 tI(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 rI(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 nI(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=Vs(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 sI(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 Wm(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 oI(t,e){let r=Lm(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1173
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)
1174
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)
1175
1201
  `),2):c==="create"?iI(l,u,e,s):c==="claim"?aI(l,u,e,s):c==="claim-next"?lI(l,u,e,s):c==="close"?cI(l,u,e,s):c==="reopen"?uI(l,u,e,s):c==="list"?pI(l,u,e,s):c==="show"?_I(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
@@ -1201,9 +1227,9 @@ ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length
1201
1227
  `),2;let s=ne(e[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
1202
1228
  `),2;let o=t.getIssue(s);return o===null?(r.stderr.write(`error: issue not found: ${s}
1203
1229
  `),1):(Ue(r,o,n),0)}function hI(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1204
- `),2):(Ue(r,Zs(t),n),0)}function gI(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1205
- `),2):(Ue(r,Qs(t),n),0)}function wI(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1206
- `),2):(Ue(r,eo(t),n),0)}function yI(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}
1230
+ `),2):(Ue(r,Qs(t),n),0)}function gI(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1231
+ `),2):(Ue(r,eo(t),n),0)}function wI(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1232
+ `),2):(Ue(r,to(t),n),0)}function yI(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}
1207
1233
  `),2;if(i==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
1208
1234
  `),2;s=Number(a)}else return r.stderr.write(`error: ${re(i)}
1209
1235
  `),2}return Ue(r,Cr(t,s!==void 0?{limit:s}:{}),n),0}function EI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
@@ -1211,44 +1237,44 @@ ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length
1211
1237
  `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${re(a)}
1212
1238
  `),2}let o=e.dal===void 0,i=e.dal??pe({path:de()});try{let a=Lr(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1213
1239
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1214
- `):e.stdout.write(no(a)),0)}finally{o&&i.close()}}async function bI(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(so(a)),0)}finally{o&&i.close()}}async function bI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1215
1241
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1216
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)}
1217
- `),2}let o=dr(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)}
1243
+ `),2}let o=ur(e),a=Bt(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)}
1218
1244
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1219
1245
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1220
1246
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1221
1247
  `),l.status===404?1:l.status===400?2:1)}function TI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
1222
1248
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1223
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)}
1224
- `),2}let o=e.dal===void 0,i=e.dal??pe({path:de()});try{let a=so(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1250
+ `),2}let o=e.dal===void 0,i=e.dal??pe({path:de()});try{let a=oo(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1225
1251
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1226
- `):e.stdout.write(oo(a)),0)}finally{o&&i.close()}}async function SI(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(io(a)),0)}finally{o&&i.close()}}async function SI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1227
1253
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1228
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)}
1229
- `),2}let o=dr(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)}
1255
+ `),2}let o=ur(e),a=Bt(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)}
1230
1256
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1231
1257
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1232
1258
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1233
1259
  `),l.status===404?1:l.status===400?2:1)}async function kI(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)}
1234
- `),2}let n=dr(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)}
1260
+ `),2}let n=ur(e),o=Bt(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)}
1235
1261
  `),2}return i.ok?(r?e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1236
1262
  `):(e.stdout.write(await i.text()),i.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1237
1263
  `)),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1238
1264
  `),i.status===400?2:1)}function vI(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)}
1239
- `),2}return Ue(r,Bt(t,{unacked:s}),n),0}function Bm(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1265
+ `),2}return Ue(r,Wt(t,{unacked:s}),n),0}function Bm(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1240
1266
  `),2;if(n==="list"){let o=Om(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
1241
- `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=ro(t,i);return Cm(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]
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=no(t,i);return Cm(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]
1242
1268
  `),2;let i=ne(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1243
- `),2;let a=ut(t,i);return a===null?(r.stderr.write(`error: escalation not found: ${i}
1269
+ `),2;let a=ct(t,i);return a===null?(r.stderr.write(`error: escalation not found: ${i}
1244
1270
  `),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
1245
1271
  `),0)}return n==="respond"?II(t,s,r):(r.stderr.write(`error: --direct escalations does not support: ${n} (supported: list, show, respond)
1246
1272
  `),2)}function II(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]
1247
1273
  `),2;let i=ne(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1248
- `),2;let a=o[1],l=ut(t,i);if(l===null)return r.stderr.write(`error: escalation not found: ${i}
1249
- `),1;let c=Bt(t).find(m=>m.id===i);if(c===void 0)return r.stderr.write(`error: escalation not found: ${i}
1274
+ `),2;let a=o[1],l=ct(t,i);if(l===null)return r.stderr.write(`error: escalation not found: ${i}
1275
+ `),1;let c=Wt(t).find(m=>m.id===i);if(c===void 0)return r.stderr.write(`error: escalation not found: ${i}
1250
1276
  `),1;if(c.kind==="workflow_escalation"){let m=t.resumeEscalation(i,a);if(!m.resumed)return r.stderr.write(`error: escalation resume failed: ${m.reason} (attention=${i})
1251
- `),2;let p=Bt(t).find(g=>g.id===i),h={ok:!0,attention_id:i,run_id:m.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(h,null,2)}
1277
+ `),2;let p=Wt(t).find(g=>g.id===i),h={ok:!0,attention_id:i,run_id:m.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(h,null,2)}
1252
1278
  `):r.stdout.write(`ok: attention ${i} acknowledged; run ${m.run.id} resumed with decision "${a}"
1253
1279
  `),0}if(c.kind!=="interactive_waiting_operator")return r.stderr.write(`error: attention ${i} is kind=${c.kind}, not interactive_waiting_operator
1254
1280
  `),2;if(c.acknowledged_at!==null)return r.stderr.write(`error: attention ${i} is already acknowledged (${c.acknowledged_at})
@@ -1256,12 +1282,12 @@ ${r}`:r}function Dk(t){let e=[...t.matchAll(Rk)];if(e.length>0){let r=e[e.length
1256
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})
1257
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)}
1258
1284
  `):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1259
- `),0}function xm(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 b0,T0,Am,ao,N0,$0,j0,x0,mI,hl=T(()=>{"use strict";Le();qe();Vs();cl();St();b0="http://127.0.0.1:8787",T0=`usage: lmctl api [--direct] <subcommand> ...
1285
+ `),0}function xm(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 b0,T0,Am,lo,N0,$0,j0,x0,mI,hl=T(()=>{"use strict";Le();qe();Ks();cl();St();b0="http://127.0.0.1:8787",T0=`usage: lmctl api [--direct] <subcommand> ...
1260
1286
 
1261
1287
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1262
1288
  workflow shellstep-safe commands also support --direct to use the local DAL
1263
1289
  without an HTTP round trip.
1264
- `,Am=["low","medium","high","critical"];ao=new Set(["api.url","api.port","api.token","project.docroot",Ks,Ys]);N0=`usage: lmctl api escalations <list|show|respond>
1290
+ `,Am=["low","medium","high","critical"];lo=new Set(["api.url","api.port","api.token","project.docroot",Ys,zs]);N0=`usage: lmctl api escalations <list|show|respond>
1265
1291
 
1266
1292
  list [--project P] [--all] [--since DURATION] [--json]
1267
1293
  Print pending operator escalations (interactive_waiting_operator
@@ -1286,7 +1312,7 @@ without an HTTP round trip.
1286
1312
 
1287
1313
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1288
1314
  and report the first step that would be started. Default output is the TTY
1289
- table; --json emits the structured WorkflowVerifyReport payload.`;mI=["open","assigned","closed","reopened"]});import{existsSync as Hm,mkdirSync as NI,readdirSync as $I,readFileSync as Jm,writeFileSync as jI}from"node:fs";import{join as Mr}from"node:path";import{fileURLToPath as xI}from"node:url";function $n(t){try{return AI.some(e=>Hm(Mr(t,e)))}catch{return!1}}function RI(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 uo(t,e){t.durable_memory_mode!=="db"?OI(t):CI(t,e)}function Xm(t){let e=$n(t),r;try{r=$I(gl).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 OI(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Mr(e,"durable-memory");try{NI(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=Xm(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Mr(r,i);if(!Hm(a))try{let l=Jm(Mr(gl,o),"utf8");jI(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 CI(t,e){let r=t.local_path??"",n=Xm(r),s=[];for(let o of n){let i=Mr(gl,o),a;try{a=Jm(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=RI(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 gl,AI,jn=T(()=>{"use strict";gl=Mr(xI(import.meta.url),"../../config/durable_memory_templates"),AI=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as LI,mkdirSync as MI,readdirSync as DI,readFileSync as PI,writeFileSync as FI}from"node:fs";import{join as fo}from"node:path";import{fileURLToPath as UI}from"node:url";function mo(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!$n(e))return;let r=fo(e,"ai-test");try{MI(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of WI()){let o=s.replace(/\.template$/,""),i=fo(r,o);if(!LI(i))try{FI(i,BI(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 WI(){try{return DI(Gm).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function BI(t){try{return PI(fo(Gm,t),"utf8")}catch{return qI(t)}}function qI(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1315
+ table; --json emits the structured WorkflowVerifyReport payload.`;mI=["open","assigned","closed","reopened"]});import{existsSync as Hm,mkdirSync as NI,readdirSync as $I,readFileSync as Jm,writeFileSync as jI}from"node:fs";import{join as Mr}from"node:path";import{fileURLToPath as xI}from"node:url";function $n(t){try{return AI.some(e=>Hm(Mr(t,e)))}catch{return!1}}function RI(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 fo(t,e){t.durable_memory_mode!=="db"?OI(t):CI(t,e)}function Xm(t){let e=$n(t),r;try{r=$I(gl).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 OI(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Mr(e,"durable-memory");try{NI(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=Xm(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Mr(r,i);if(!Hm(a))try{let l=Jm(Mr(gl,o),"utf8");jI(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 CI(t,e){let r=t.local_path??"",n=Xm(r),s=[];for(let o of n){let i=Mr(gl,o),a;try{a=Jm(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=RI(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 gl,AI,jn=T(()=>{"use strict";gl=Mr(xI(import.meta.url),"../../config/durable_memory_templates"),AI=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as LI,mkdirSync as MI,readdirSync as DI,readFileSync as PI,writeFileSync as FI}from"node:fs";import{join as mo}from"node:path";import{fileURLToPath as UI}from"node:url";function po(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!$n(e))return;let r=mo(e,"ai-test");try{MI(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of WI()){let o=s.replace(/\.template$/,""),i=mo(r,o);if(!LI(i))try{FI(i,BI(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 WI(){try{return DI(Gm).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function BI(t){try{return PI(mo(Gm,t),"utf8")}catch{return qI(t)}}function qI(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1290
1316
 
1291
1317
  Add test chapters in this directory.
1292
1318
  `:`---
@@ -1308,7 +1334,7 @@ last_run_id: 0
1308
1334
  ## Expected
1309
1335
 
1310
1336
  ## Cleanup
1311
- `}var Gm,wl=T(()=>{"use strict";jn();Gm=fo(UI(import.meta.url),"../../config/ai_test_templates")});var Dr,yl=T(()=>{"use strict";Dr=`---
1337
+ `}var Gm,wl=T(()=>{"use strict";jn();Gm=mo(UI(import.meta.url),"../../config/ai_test_templates")});var Dr,yl=T(()=>{"use strict";Dr=`---
1312
1338
 
1313
1339
  # Durable memory \u2014 how to use it
1314
1340
 
@@ -1319,13 +1345,13 @@ ON EVERY NEW TASK:
1319
1345
  2. Pull only the chapters relevant to your current task. Don't load everything.
1320
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.
1321
1347
 
1322
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function po(t){return HI.has(t)}function bl(){return El===null&&(El=at(ct())),El}function Tl(t,e){if(!po(t))return null;try{let r=bl().getAdapter?.(t);if(r===void 0)return null;let n=r.resumeCommand(e).trim();return n.length===0?null:[...n.split(/\s+/),...Vm[t]??[]]}catch{return null}}function Pr(t,e){let r=Tl(t,e);return r===null?null:r.join(" ")}function fr(t,e){return bl().getSession(t,e)}async function _o(t){return(await bl().resolveSessions(t)).map(r=>r.provider.name)}var Vm,HI,Km,El,Fr=T(()=>{"use strict";Tt();Vm={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},HI=new Set(Object.keys(Vm)),Km=/^[\w.:-]+$/;El=null});import{createHash as JI}from"node:crypto";import{existsSync as go,mkdirSync as zm,readFileSync as Sl,readdirSync as XI,renameSync as GI,statSync as VI,writeFileSync as ho}from"node:fs";import{homedir as KI}from"node:os";import{dirname as Zm,join as Xe,resolve as wo}from"node:path";import{fileURLToPath as YI}from"node:url";function ep(t){let e=wo(t);for(;;){let r=Xe(e,kl);try{if(VI(r).isDirectory())return r}catch{}let n=Zm(e);if(n===e)return null;e=n}}function yo(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return wo(e);let r=ep(t);return r!==null?r:Xe(Qm(),kl)}function tp(t){return Xe(yo(t),"templates","workflows")}function rp(){return wo(Zm(YI(import.meta.url)),"..","..","workflows")}function zI(t){let e=Xe(t,np);try{let r=JSON.parse(Sl(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 ZI(t,e){zm(t,{recursive:!0});let r=Xe(t,np),n=`${r}.tmp-${process.pid}`;ho(n,`${JSON.stringify(e,null,2)}
1323
- `,"utf8"),GI(n,r)}function Eo(t={}){let e=yo(t.cwd),r=Xe(e,"templates","workflows"),n=rp(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=go(n)?XI(n).filter(l=>l.endsWith(".compound.json")||l.endsWith(".lmctl")||l==="index.jsonl"):[];if(o.length===0)return s;zm(r,{recursive:!0});let i=zI(e),a=rr();for(let l of o){let c=`workflows/${l}`,u=Sl(Xe(n,l)),d=Ym(u),f=Xe(r,l);if(!go(f)){try{ho(f,u,{flag:"wx"}),s.copied.push(l)}catch{}i.files[c]=d;continue}let m=Ym(Sl(f));if(m===d){i.files[c]=d;continue}let p=i.files[c];if(p!==void 0&&m===p)ho(f,u),i.files[c]=d,s.refreshed.push(l);else{let h=Xe(r,`${l}.dist-${a}`);ho(h,u),s.preserved.push(l),s.shadowed.push(`${l}.dist-${a}`)}}ZI(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function vl(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(wo(r));let n=ep(t??process.cwd());return n!==null&&e.push(n),e.push(Xe(Qm(),kl)),e}function bo(t,e){let r=vl(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(go(i))return i}for(let s of n){let o=Xe(rp(),s);if(go(o))return o}return null}var kl,Qm,Ym,np,To=T(()=>{"use strict";gs();kl=".lmctl",Qm=()=>process.env.HOME??KI(),Ym=t=>JI("sha256").update(t).digest("hex");np=".dist-manifest.json"});import{createHash as QI}from"node:crypto";import{existsSync as eN,mkdirSync as tN,writeFileSync as rN}from"node:fs";import{dirname as nN,join as Ur}from"node:path";function mr(t){return typeof t=="string"&&t.startsWith(sp)}function cN(t){if(!mr(t))throw new et(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(sp.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(!aN.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 uN(t,e,r){if(t==="workflow")return bo(e,r);let n=t==="mcp"?Ur("templates","mcp",`${e}.json`):Ur("templates","skills",e,"SKILL.md");for(let s of vl(r)){let o=Ur(s,n);if(eN(o))return o}return null}function dN(t,e,r){let n=Ur(yo(r),oN,t);return t==="skill"?Ur(n,e,"SKILL.md"):Ur(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function fN(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 xn(t,e){let{kind:r,name:n,ref:s}=cN(t),o=uN(r,n,e);if(o!==null)return o;let i=`${sN}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(iN)})}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=lN.exec(s);if(u!==null){let d=QI("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(!fN(r,l))throw new et(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=dN(r,n,e);return tN(nN(c),{recursive:!0}),rN(c,l,"utf8"),c}var sp,sN,oN,iN,aN,et,lN,Il=T(()=>{"use strict";To();sp="lmctl://",sN="https://lmctl.com/templates/",oN=".cache",iN=8e3,aN=new Set(["workflow","mcp","skill"]),et=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},lN=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as up}from"node:child_process";import{cpSync as op,existsSync as jl,mkdirSync as dp,mkdtempSync as mN,readFileSync as fp,statSync as pN,writeFileSync as Nl}from"node:fs";import{homedir as _N,tmpdir as hN}from"node:os";import{basename as ip,join as Ge}from"node:path";function kt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function $l(t,e,r){if(Array.isArray(t)){for(let n of t)$l(n,e,r);return}if(kt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))$l(n,e,r)}}function EN(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!kt(a)||!Array.isArray(a.steps)))for(let l of a.steps)kt(l)&&l.members!==void 0&&$l(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(yN(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function mp(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(gN)})}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 bN(t,e){if(typeof t!="string")return[t];mr(t)&&(t=await xn(t));let r;if(xl.test(t))r=await mp(t,e);else{if(!jl(t))throw new tt(e,`mcp file not found: ${t}`);r=fp(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new tt(e,`mcp source is not JSON: ${t}`)}if(kt(n)&&kt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...kt(o)?o:{}}));if(kt(n)&&typeof n.name=="string")return[n];throw new tt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function So(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function An(t,e,r,n){let s=up(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 TN(t,e,r){up(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function SN(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function kN(t){let e=["mcp","add"];if(So(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 vN(t){if(So(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 IN(t){if(So(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 NN(t){let e=Ge(process.env.XDG_CONFIG_HOME??Ge(Rn(),".config"),"opencode"),r=Ge(e,"opencode.json"),n={};if(jl(r))try{let o=JSON.parse(fp(r,"utf8"));kt(o)&&(n=o)}catch{}let s=kt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=So(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}),Nl(r,`${JSON.stringify(n,null,2)}
1324
- `,"utf8")}function $N(t){if(typeof t!="string")return t.name;let e=ip(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?ip(t.replace(/\/skill\.md$/i,"")):e}async function lp(t,e,r){let n=$N(t),s=Ge(e,n);if(dp(s,{recursive:!0}),typeof t!="string")return Nl(Ge(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(mr(t)&&(t=await xn(t)),xl.test(t))return Nl(Ge(s,"SKILL.md"),await mp(t,r),"utf8"),{name:n,dir:s};if(!jl(t))throw new tt(r,`skill path not found: ${t}`);return pN(t).isDirectory()?(op(t,s,{recursive:!0}),{name:n,dir:s}):(op(t,Ge(s,"SKILL.md")),{name:n,dir:s})}async function ko(t){let{dal:e,member:r,stderr:n}=t,s=EN(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}
1348
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function _o(t){return HI.has(t)}function bl(){return El===null&&(El=it(lt())),El}function Tl(t,e){if(!_o(t))return null;try{let r=bl().getAdapter?.(t);if(r===void 0)return null;let n=r.resumeCommand(e).trim();return n.length===0?null:[...n.split(/\s+/),...Vm[t]??[]]}catch{return null}}function Pr(t,e){let r=Tl(t,e);return r===null?null:r.join(" ")}function dr(t,e){return bl().getSession(t,e)}async function ho(t){return(await bl().resolveSessions(t)).map(r=>r.provider.name)}var Vm,HI,Km,El,Fr=T(()=>{"use strict";Tt();Vm={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},HI=new Set(Object.keys(Vm)),Km=/^[\w.:-]+$/;El=null});import{createHash as JI}from"node:crypto";import{existsSync as wo,mkdirSync as zm,readFileSync as Sl,readdirSync as XI,renameSync as GI,statSync as VI,writeFileSync as go}from"node:fs";import{homedir as KI}from"node:os";import{dirname as Zm,join as Xe,resolve as yo}from"node:path";import{fileURLToPath as YI}from"node:url";function ep(t){let e=yo(t);for(;;){let r=Xe(e,kl);try{if(VI(r).isDirectory())return r}catch{}let n=Zm(e);if(n===e)return null;e=n}}function Eo(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return yo(e);let r=ep(t);return r!==null?r:Xe(Qm(),kl)}function tp(t){return Xe(Eo(t),"templates","workflows")}function rp(){return yo(Zm(YI(import.meta.url)),"..","..","workflows")}function zI(t){let e=Xe(t,np);try{let r=JSON.parse(Sl(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 ZI(t,e){zm(t,{recursive:!0});let r=Xe(t,np),n=`${r}.tmp-${process.pid}`;go(n,`${JSON.stringify(e,null,2)}
1349
+ `,"utf8"),GI(n,r)}function bo(t={}){let e=Eo(t.cwd),r=Xe(e,"templates","workflows"),n=rp(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=wo(n)?XI(n).filter(l=>l.endsWith(".compound.json")||l.endsWith(".lmctl")||l==="index.jsonl"):[];if(o.length===0)return s;zm(r,{recursive:!0});let i=zI(e),a=tr();for(let l of o){let c=`workflows/${l}`,u=Sl(Xe(n,l)),d=Ym(u),f=Xe(r,l);if(!wo(f)){try{go(f,u,{flag:"wx"}),s.copied.push(l)}catch{}i.files[c]=d;continue}let m=Ym(Sl(f));if(m===d){i.files[c]=d;continue}let p=i.files[c];if(p!==void 0&&m===p)go(f,u),i.files[c]=d,s.refreshed.push(l);else{let h=Xe(r,`${l}.dist-${a}`);go(h,u),s.preserved.push(l),s.shadowed.push(`${l}.dist-${a}`)}}ZI(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function vl(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(yo(r));let n=ep(t??process.cwd());return n!==null&&e.push(n),e.push(Xe(Qm(),kl)),e}function To(t,e){let r=vl(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(wo(i))return i}for(let s of n){let o=Xe(rp(),s);if(wo(o))return o}return null}var kl,Qm,Ym,np,So=T(()=>{"use strict";ws();kl=".lmctl",Qm=()=>process.env.HOME??KI(),Ym=t=>JI("sha256").update(t).digest("hex");np=".dist-manifest.json"});import{createHash as QI}from"node:crypto";import{existsSync as eN,mkdirSync as tN,writeFileSync as rN}from"node:fs";import{dirname as nN,join as Ur}from"node:path";function fr(t){return typeof t=="string"&&t.startsWith(sp)}function cN(t){if(!fr(t))throw new et(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(sp.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(!aN.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 uN(t,e,r){if(t==="workflow")return To(e,r);let n=t==="mcp"?Ur("templates","mcp",`${e}.json`):Ur("templates","skills",e,"SKILL.md");for(let s of vl(r)){let o=Ur(s,n);if(eN(o))return o}return null}function dN(t,e,r){let n=Ur(Eo(r),oN,t);return t==="skill"?Ur(n,e,"SKILL.md"):Ur(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function fN(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 xn(t,e){let{kind:r,name:n,ref:s}=cN(t),o=uN(r,n,e);if(o!==null)return o;let i=`${sN}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(iN)})}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=lN.exec(s);if(u!==null){let d=QI("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(!fN(r,l))throw new et(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=dN(r,n,e);return tN(nN(c),{recursive:!0}),rN(c,l,"utf8"),c}var sp,sN,oN,iN,aN,et,lN,Il=T(()=>{"use strict";So();sp="lmctl://",sN="https://lmctl.com/templates/",oN=".cache",iN=8e3,aN=new Set(["workflow","mcp","skill"]),et=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},lN=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as up}from"node:child_process";import{cpSync as op,existsSync as jl,mkdirSync as dp,mkdtempSync as mN,readFileSync as fp,statSync as pN,writeFileSync as Nl}from"node:fs";import{homedir as _N,tmpdir as hN}from"node:os";import{basename as ip,join as Ge}from"node:path";function kt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function $l(t,e,r){if(Array.isArray(t)){for(let n of t)$l(n,e,r);return}if(kt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))$l(n,e,r)}}function EN(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!kt(a)||!Array.isArray(a.steps)))for(let l of a.steps)kt(l)&&l.members!==void 0&&$l(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(yN(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function mp(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(gN)})}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 bN(t,e){if(typeof t!="string")return[t];fr(t)&&(t=await xn(t));let r;if(xl.test(t))r=await mp(t,e);else{if(!jl(t))throw new tt(e,`mcp file not found: ${t}`);r=fp(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new tt(e,`mcp source is not JSON: ${t}`)}if(kt(n)&&kt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...kt(o)?o:{}}));if(kt(n)&&typeof n.name=="string")return[n];throw new tt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function ko(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function An(t,e,r,n){let s=up(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 TN(t,e,r){up(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function SN(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function kN(t){let e=["mcp","add"];if(ko(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 vN(t){if(ko(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 IN(t){if(ko(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 NN(t){let e=Ge(process.env.XDG_CONFIG_HOME??Ge(Rn(),".config"),"opencode"),r=Ge(e,"opencode.json"),n={};if(jl(r))try{let o=JSON.parse(fp(r,"utf8"));kt(o)&&(n=o)}catch{}let s=kt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=ko(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}),Nl(r,`${JSON.stringify(n,null,2)}
1350
+ `,"utf8")}function $N(t){if(typeof t!="string")return t.name;let e=ip(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?ip(t.replace(/\/skill\.md$/i,"")):e}async function lp(t,e,r){let n=$N(t),s=Ge(e,n);if(dp(s,{recursive:!0}),typeof t!="string")return Nl(Ge(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(fr(t)&&(t=await xn(t)),xl.test(t))return Nl(Ge(s,"SKILL.md"),await mp(t,r),"utf8"),{name:n,dir:s};if(!jl(t))throw new tt(r,`skill path not found: ${t}`);return pN(t).isDirectory()?(op(t,s,{recursive:!0}),{name:n,dir:s}):(op(t,Ge(s,"SKILL.md")),{name:n,dir:s})}async function vo(t){let{dal:e,member:r,stderr:n}=t,s=EN(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}
1325
1351
  `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await bN(c,r.alias));if(o==="opencode")NN(l);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex"||o==="copilot")for(let c of l)if(TN(o,SN(o,c.name),i),o==="claude"){let{name:u,...d}=c;An("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?An("codex",vN(c),i,r.alias):o==="copilot"?An("copilot",IN(c),i,r.alias):An(o,kN(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(wN.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=mN(Ge(hN(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!xl.test(c)?c:(await lp(c,l,r.alias)).dir;An(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,xl,gN,ap,wN,yN,Rn,cp,Al=T(()=>{"use strict";Le();Il();tt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},xl=/^https?:\/\//i,gN=8e3,ap=1e6,wN=new Set(["opencode"]),yN=t=>JSON.stringify(t),Rn=()=>process.env.HOME??_N();cp={claude:()=>Ge(Rn(),".claude","skills"),qwen:()=>Ge(Rn(),".qwen","skills"),codex:()=>Ge(Rn(),".codex","skills"),copilot:()=>Ge(Rn(),".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 x(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function D(t,e){return t.flags[e]===!0}function W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1326
1352
  `)}function w(t,e){return t.stderr.write(`error: ${e}
1327
1353
  `),1}function fe(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1328
- `),2}var Se=T(()=>{"use strict";Le();qe()});var wp={};ie(wp,{defaultTeamNameForProject:()=>GN,resolveAlias:()=>No,resolveProject:()=>vo,resolveTeam:()=>Io,runCode:()=>AN});import{execFileSync as jN}from"node:child_process";import{basename as xN,resolve as pp}from"node:path";import*as Ol from"node:readline";import{setTimeout as Rl}from"node:timers/promises";async function AN(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 hp(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return WN(e);try{return await J(e,async s=>{switch(r){case"team":return ON(n,e,s);case"chat":return PN(n,e,s);case"spec":return FN(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=T(()=>{"use strict";Le();qe()});var wp={};ie(wp,{defaultTeamNameForProject:()=>GN,resolveAlias:()=>$o,resolveProject:()=>Io,resolveTeam:()=>No,runCode:()=>AN});import{execFileSync as jN}from"node:child_process";import{basename as xN,resolve as pp}from"node:path";import*as Ol from"node:readline";import{setTimeout as Rl}from"node:timers/promises";async function AN(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 hp(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return WN(e);try{return await J(e,async s=>{switch(r){case"team":return ON(n,e,s);case"chat":return PN(n,e,s);case"spec":return FN(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(`
1329
1355
  `)),0}function ON(t,e,r){let[n,...s]=t;switch(n){case"add":return CN(s,e,r);case"list":return LN(s,e,r);case"show":return MN(s,e,r);case"rm":return DN(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function CN(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=x(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=Wr(e,r,x(n,"--project"),x(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??i.project.local_path});return D(n,"--json")?W(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1330
1356
  `),0}function LN(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=Wr(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=gp(r.listTeamMembers(s.team.id));if(D(n,"--json"))W(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${ke(i)} ${i.sessionid??"(unseeded)"}
1331
1357
  `);return 0}function MN(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=Wr(e,r,x(n,"--project"),x(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}`):(D(n,"--json")?W(e,i):(e.stdout.write(`member ${i.alias}
@@ -1335,7 +1361,7 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1335
1361
  `),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
1336
1362
  `),e.stdout.write(`sessiondir: ${i.sessiondir}
1337
1363
  `)),0)}function DN(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=Wr(e,r,x(n,"--project"),x(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 D(n,"--json")?W(e,a):e.stdout.write(`retired member ${i.alias}
1338
- `),0}async function PN(t,e,r){if(t.includes("--help")||t.includes("-h"))return hp(e);let n=P(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=Wr(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=No(e,r,s.team,x(n,"--alias"));if(typeof o=="number")return o;let i=await XN(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1364
+ `),0}async function PN(t,e,r){if(t.includes("--help")||t.includes("-h"))return hp(e);let n=P(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=Wr(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=$o(e,r,s.team,x(n,"--alias"));if(typeof o=="number")return o;let i=await XN(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1339
1365
  `);let a=e.stdin??process.stdin,l=Ol.createInterface({input:a,terminal:!1}),c=i;On(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){On(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1340
1366
  `),0;if(d==="/help"){JN(e),On(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
1341
1367
  `),On(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
@@ -1351,32 +1377,32 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1351
1377
  `);let a=Ol.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}
1352
1378
  `),0;if(c==="/done")return await Cn(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await Cn(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function Cn(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 HN(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function hp(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(`
1353
1379
  `)),0}function JN(t){t.stderr.write(`commands: /help, /exit
1354
- `)}function On(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function vo(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=jN("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 Io(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 No(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=gp(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 Wr(t,e,r,n){let s=vo(t,e,r);if(typeof s=="number")return s;let o=Io(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function gp(t){return t.filter(e=>e.state!=="retired")}async function XN(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1355
- `),uo(r,e),mo(r);let s=await Or({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=Pr(ke(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
1380
+ `)}function On(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function Io(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=jN("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 No(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 $o(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=gp(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 Wr(t,e,r,n){let s=Io(t,e,r);if(typeof s=="number")return s;let o=No(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function gp(t){return t.filter(e=>e.state!=="retired")}async function XN(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1381
+ `),fo(r,e),po(r);let s=await Or({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=Pr(ke(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
1356
1382
  ${i}
1357
- `),await ko({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
1383
+ `),await vo({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
1358
1384
 
1359
- ${Dr}`:Dr;return e.setMemberPromptSnapshot(o.id,l)??o}function GN(t){return`${xN(t.local_path)}-code`}var _p,Cl=T(()=>{"use strict";Sn();Xs();jn();wl();yl();Le();Fr();Al();Se();hl();_p="spec-driven-task"});import yp from"jexl";function Ht(t){yp.compile(Ep(t))}async function pr(t,e){return yp.eval(Ep(t),e)}function Ep(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Br=T(()=>{"use strict"});import{z as E}from"zod";function Wl(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var VN,bp,Ll,Ml,Dl,Pl,Fl,Ul,Tp,KN,YN,zN,Ln,ZN,$o,jo,xo,Ao,Ro,Sp,QN,e$,t$,r$,Oo,qr=T(()=>{"use strict";Br();VN=E.object({kind:E.enum(["success","neutral","failure"])}),bp=E.enum(["string","number","boolean","object","array"]),Ll=E.object({name:E.string().min(1),type:bp,required:E.boolean().optional(),default:E.unknown().optional(),description:E.string().optional()}),Ml=E.object({name:E.string().min(1),type:bp,source_step_id:E.string().min(1),source_field:E.string().min(1),description:E.string().optional()}),Dl=E.object({id:E.string().min(1),type:E.string().min(1),parameters:E.record(E.string(),E.unknown()).default({})}),Pl="__failure__",Fl=E.object({tools:E.array(E.string().min(1)).optional(),auth:E.array(E.string().min(1)).optional()}).strict().optional(),Ul=E.object({on_unhandled_failure:E.object({attention_kind:E.string().min(1).default("workflow_failed"),severity:E.enum(["warn","error","critical"]).default("warn"),capture_evidence:E.boolean().default(!0),recommend_recovery:E.string().min(1).optional()}).optional(),on_unhandled_failure_state:E.string().min(1).optional()}).optional(),Tp=E.object({type:E.literal("AssertRepoClean"),fail_message:E.string().min(1).optional(),next:E.string().min(1)}),KN=E.object({name:E.string().min(1),command:E.string().min(1).optional(),args:E.array(E.string()).optional(),env:E.record(E.string(),E.string()).optional(),type:E.enum(["stdio","http","sse"]).optional(),url:E.string().min(1).optional(),headers:E.record(E.string(),E.string()).optional()}).strict(),YN=E.union([E.string().min(1),KN]),zN=E.union([E.string().min(1),E.object({name:E.string().min(1),content:E.string().min(1)}).strict()]),Ln=E.object({team:E.string().min(1),alias:E.string().min(1),prompt_template:E.string().optional(),mcp:E.array(YN).optional(),skills:E.array(zN).optional()}),ZN=E.object({kind:E.literal("shell"),command:E.string().min(1),description:E.string().optional()}),$o=E.object({type:E.literal("Review"),state_name:E.string().min(1),coder:Ln,pre_checks:E.array(ZN).optional(),reviewers:E.array(Ln.extend({rubric_artifact:E.string().optional()})).optional(),outcomes:E.object({approve:E.string().min(1),request_changes:E.string().optional(),fail_pre_check:E.string().optional(),max_loops_exceeded:E.string().optional()}),writes_to_project_path:E.boolean().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional(),max_loops:E.number().int().positive().default(5),loop_feedback_artifact:E.string().optional(),outcomes_from_stance:E.record(E.string(),E.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"})}),jo=E.object({type:E.literal("Consolidate"),state_name:E.string().min(1),researchers:E.array(Ln.extend({topic:E.string().min(1)})).optional(),consolidator:Ln,outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),research_artifact_prefix:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),xo=E.object({type:E.literal("Interactive"),state_name:E.string().min(1),agent:Ln.extend({initial_prompt_template:E.string().min(1)}),termination:E.object({operator_signal:E.boolean().default(!0),agent_signal:E.string().optional(),max_turns:E.number().int().positive().default(20),timeout_seconds:E.number().int().positive().optional()}),outcomes:E.object({done:E.string().min(1),timeout:E.string().optional()}),artifact_name:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Ao=E.object({type:E.literal("Loop"),state_name:E.string().min(1),over:E.string().min(1),item_var:E.string().min(1),body:E.string().min(1),outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),stop_on_error:E.boolean().default(!0),max_items:E.number().int().positive().default(1e3)}),Ro=E.object({type:E.literal("ShellStep"),state_name:E.string().min(1),command:E.string().min(1),outcomes_from_exit:E.record(E.string(),E.string().min(1)),timeout_ms:E.number().int().nonnegative().optional(),capture_output_to:E.string().optional(),writes_to_project_path:E.boolean().optional()}),Sp=E.object({type:E.literal("Choice"),state_name:E.string().min(1),branches:E.array(E.object({when:E.string().min(1),next:E.string().min(1)})).default([]),default_next:E.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{Ht(Wl(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}`})}}),QN=E.discriminatedUnion("type",[Tp,$o,jo,xo,Ao,Ro,Sp]),e$=E.object({type:E.literal("ForEach"),state_name:E.string().min(1),items_from:E.string().min(1),mode:E.enum(["sequential","parallel"]).default("sequential"),max_concurrency:E.number().int().positive().default(1),on_item_failure:E.enum(["continue","stop"]).default("stop"),body:QN,outcomes:E.object({all_ok:E.string().min(1),any_failed:E.string().optional()})}).superRefine((t,e)=>{try{Ht(Wl(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}`})}}),t$=E.object({type:E.literal("Subflow"),state_name:E.string().min(1),workflow_name:E.string().min(1),inputs:E.record(E.string(),E.string().min(1)).optional(),outcomes:E.record(E.string(),E.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{Ht(Wl(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),r$=E.discriminatedUnion("type",[Tp,$o,jo,xo,Ao,Ro,Sp,e$,t$]),Oo=E.object({name:E.string().min(1),version:E.number().int().positive(),definition_schema_version:E.union([E.literal(1),E.literal(2)]),description:E.string().optional(),estimated_duration_ms:E.number().int().nonnegative().optional(),primitive_version:E.union([E.literal(1),E.literal(2)]).default(1),start_at:E.string().min(1),states:E.record(E.string().min(1),r$),terminals:E.record(E.string().min(1),VN),errors:Ul,concurrency_key:E.string().min(1).optional(),concurrent_limit:E.number().int().positive().optional(),default_task_timeout_ms:E.number().int().positive().max(216e5).optional(),inputs:E.array(Ll).optional(),outputs:E.array(Ml).optional(),triggers:E.array(Dl).optional(),read_only:E.boolean().optional(),requires:Fl}).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$,Co,s$,o$,i$,dt,Hr=T(()=>{"use strict";qr();n$=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Co=Y.string().regex(n$),s$=Y.object({step_id:Co,type:Y.literal("main"),index:Y.number().int().min(0)}),o$=Y.record(Co,Y.record(Y.string().min(1),Y.array(Y.array(s$)))),i$=Y.object({id:Co,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()}),dt=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:Ul,inputs:Y.array(Ll).optional(),outputs:Y.array(Ml).optional(),steps:Y.array(i$).min(1),connections:o$.default({}),entry_step_id:Co,triggers:Y.array(Dl).optional(),read_only:Y.boolean().optional(),requires:Fl}).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 Lo(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=l$[r.type];n!==void 0&&(r.type=n)}return r}var Bl,a$,l$,Hl=T(()=>{"use strict";Bl="lmctl.builtin.",a$={Review:`${Bl}Review`,Research:`${Bl}Research`,Consolidate:`${Bl}Consolidate`},l$=Object.fromEntries(Object.entries(a$).map(([t,e])=>[e,t]))});import{readFileSync as c$}from"node:fs";function Ip(t){return u$(t)}function u$(t){let e=Lo(m$(t));if(f$(e),Np(e)===3)return d$(e);let r=Oo.safeParse(e);if(!r.success)throw new vt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=p$(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new vt(n);return r.data}function d$(t){let e=dt.safeParse(t);if(!e.success)throw new vt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function f$(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Np(t);if(!(e===null||kp.includes(e)))throw new vt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${kp.join(", ")}`}]})}function Np(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 m$(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1385
+ ${Dr}`:Dr;return e.setMemberPromptSnapshot(o.id,l)??o}function GN(t){return`${xN(t.local_path)}-code`}var _p,Cl=T(()=>{"use strict";Sn();Gs();jn();wl();yl();Le();Fr();Al();Se();hl();_p="spec-driven-task"});import yp from"jexl";function qt(t){yp.compile(Ep(t))}async function mr(t,e){return yp.eval(Ep(t),e)}function Ep(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Br=T(()=>{"use strict"});import{z as E}from"zod";function Wl(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var VN,bp,Ll,Ml,Dl,Pl,Fl,Ul,Tp,KN,YN,zN,Ln,ZN,jo,xo,Ao,Ro,Oo,Sp,QN,e$,t$,r$,Co,qr=T(()=>{"use strict";Br();VN=E.object({kind:E.enum(["success","neutral","failure"])}),bp=E.enum(["string","number","boolean","object","array"]),Ll=E.object({name:E.string().min(1),type:bp,required:E.boolean().optional(),default:E.unknown().optional(),description:E.string().optional()}),Ml=E.object({name:E.string().min(1),type:bp,source_step_id:E.string().min(1),source_field:E.string().min(1),description:E.string().optional()}),Dl=E.object({id:E.string().min(1),type:E.string().min(1),parameters:E.record(E.string(),E.unknown()).default({})}),Pl="__failure__",Fl=E.object({tools:E.array(E.string().min(1)).optional(),auth:E.array(E.string().min(1)).optional()}).strict().optional(),Ul=E.object({on_unhandled_failure:E.object({attention_kind:E.string().min(1).default("workflow_failed"),severity:E.enum(["warn","error","critical"]).default("warn"),capture_evidence:E.boolean().default(!0),recommend_recovery:E.string().min(1).optional()}).optional(),on_unhandled_failure_state:E.string().min(1).optional()}).optional(),Tp=E.object({type:E.literal("AssertRepoClean"),fail_message:E.string().min(1).optional(),next:E.string().min(1)}),KN=E.object({name:E.string().min(1),command:E.string().min(1).optional(),args:E.array(E.string()).optional(),env:E.record(E.string(),E.string()).optional(),type:E.enum(["stdio","http","sse"]).optional(),url:E.string().min(1).optional(),headers:E.record(E.string(),E.string()).optional()}).strict(),YN=E.union([E.string().min(1),KN]),zN=E.union([E.string().min(1),E.object({name:E.string().min(1),content:E.string().min(1)}).strict()]),Ln=E.object({team:E.string().min(1),alias:E.string().min(1),prompt_template:E.string().optional(),mcp:E.array(YN).optional(),skills:E.array(zN).optional()}),ZN=E.object({kind:E.literal("shell"),command:E.string().min(1),description:E.string().optional()}),jo=E.object({type:E.literal("Review"),state_name:E.string().min(1),coder:Ln,pre_checks:E.array(ZN).optional(),reviewers:E.array(Ln.extend({rubric_artifact:E.string().optional()})).optional(),outcomes:E.object({approve:E.string().min(1),request_changes:E.string().optional(),fail_pre_check:E.string().optional(),max_loops_exceeded:E.string().optional()}),writes_to_project_path:E.boolean().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional(),max_loops:E.number().int().positive().default(5),loop_feedback_artifact:E.string().optional(),outcomes_from_stance:E.record(E.string(),E.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"})}),xo=E.object({type:E.literal("Consolidate"),state_name:E.string().min(1),researchers:E.array(Ln.extend({topic:E.string().min(1)})).optional(),consolidator:Ln,outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),research_artifact_prefix:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Ao=E.object({type:E.literal("Interactive"),state_name:E.string().min(1),agent:Ln.extend({initial_prompt_template:E.string().min(1)}),termination:E.object({operator_signal:E.boolean().default(!0),agent_signal:E.string().optional(),max_turns:E.number().int().positive().default(20),timeout_seconds:E.number().int().positive().optional()}),outcomes:E.object({done:E.string().min(1),timeout:E.string().optional()}),artifact_name:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Ro=E.object({type:E.literal("Loop"),state_name:E.string().min(1),over:E.string().min(1),item_var:E.string().min(1),body:E.string().min(1),outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),stop_on_error:E.boolean().default(!0),max_items:E.number().int().positive().default(1e3)}),Oo=E.object({type:E.literal("ShellStep"),state_name:E.string().min(1),command:E.string().min(1),outcomes_from_exit:E.record(E.string(),E.string().min(1)),timeout_ms:E.number().int().nonnegative().optional(),capture_output_to:E.string().optional(),writes_to_project_path:E.boolean().optional()}),Sp=E.object({type:E.literal("Choice"),state_name:E.string().min(1),branches:E.array(E.object({when:E.string().min(1),next:E.string().min(1)})).default([]),default_next:E.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{qt(Wl(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}`})}}),QN=E.discriminatedUnion("type",[Tp,jo,xo,Ao,Ro,Oo,Sp]),e$=E.object({type:E.literal("ForEach"),state_name:E.string().min(1),items_from:E.string().min(1),mode:E.enum(["sequential","parallel"]).default("sequential"),max_concurrency:E.number().int().positive().default(1),on_item_failure:E.enum(["continue","stop"]).default("stop"),body:QN,outcomes:E.object({all_ok:E.string().min(1),any_failed:E.string().optional()})}).superRefine((t,e)=>{try{qt(Wl(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}`})}}),t$=E.object({type:E.literal("Subflow"),state_name:E.string().min(1),workflow_name:E.string().min(1),inputs:E.record(E.string(),E.string().min(1)).optional(),outcomes:E.record(E.string(),E.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{qt(Wl(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),r$=E.discriminatedUnion("type",[Tp,jo,xo,Ao,Ro,Oo,Sp,e$,t$]),Co=E.object({name:E.string().min(1),version:E.number().int().positive(),definition_schema_version:E.union([E.literal(1),E.literal(2)]),description:E.string().optional(),estimated_duration_ms:E.number().int().nonnegative().optional(),primitive_version:E.union([E.literal(1),E.literal(2)]).default(1),start_at:E.string().min(1),states:E.record(E.string().min(1),r$),terminals:E.record(E.string().min(1),VN),errors:Ul,concurrency_key:E.string().min(1).optional(),concurrent_limit:E.number().int().positive().optional(),default_task_timeout_ms:E.number().int().positive().max(216e5).optional(),inputs:E.array(Ll).optional(),outputs:E.array(Ml).optional(),triggers:E.array(Dl).optional(),read_only:E.boolean().optional(),requires:Fl}).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$,Lo,s$,o$,i$,ut,Hr=T(()=>{"use strict";qr();n$=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Lo=Y.string().regex(n$),s$=Y.object({step_id:Lo,type:Y.literal("main"),index:Y.number().int().min(0)}),o$=Y.record(Lo,Y.record(Y.string().min(1),Y.array(Y.array(s$)))),i$=Y.object({id:Lo,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:Ul,inputs:Y.array(Ll).optional(),outputs:Y.array(Ml).optional(),steps:Y.array(i$).min(1),connections:o$.default({}),entry_step_id:Lo,triggers:Y.array(Dl).optional(),read_only:Y.boolean().optional(),requires:Fl}).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 Mo(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=l$[r.type];n!==void 0&&(r.type=n)}return r}var Bl,a$,l$,Hl=T(()=>{"use strict";Bl="lmctl.builtin.",a$={Review:`${Bl}Review`,Research:`${Bl}Research`,Consolidate:`${Bl}Consolidate`},l$=Object.fromEntries(Object.entries(a$).map(([t,e])=>[e,t]))});import{readFileSync as c$}from"node:fs";function Ip(t){return u$(t)}function u$(t){let e=Mo(m$(t));if(f$(e),Np(e)===3)return d$(e);let r=Co.safeParse(e);if(!r.success)throw new vt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=p$(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new vt(n);return r.data}function d$(t){let e=ut.safeParse(t);if(!e.success)throw new vt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function f$(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Np(t);if(!(e===null||kp.includes(e)))throw new vt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${kp.join(", ")}`}]})}function Np(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 m$(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1360
1386
  `)||e.startsWith("{")||e.startsWith("[")?vp(t,"$"):e.endsWith(".json")?vp(c$(e,"utf8"),e):t}function vp(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new vt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function p$(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"}),_$(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function _$(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 kp,vt,$p=T(()=>{"use strict";qr();Hr();Hl();kp=[1,2,3],vt=class extends Error{errors;unresolvedRefs;constructor(e){super(e.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=e.errors??[],this.unresolvedRefs=e.unresolvedRefs??[]}}});import{createHash as h$}from"node:crypto";function jp(t,e){let r=g$(e),n=h$("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function g$(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var xp=T(()=>{"use strict";Hr()});function E$(t,e){let r=y$[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 Cp(t){let e=[],r=(I,N)=>{throw new Jr([{line:I,message:N}])},n=t.split(`
1361
- `),s=[];for(let I=0;I<n.length;I+=1){let O=S$(n[I]).trim();O.length>0&&s.push({n:I+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(I,N,O,B,F,C)=>{l.has(I)&&r(B,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(B,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:N,params:O,line:B,isTerminal:F,...C?{members:C}:{}}),u.push(I)},y=I=>{let N=[],O=I+1;for(;O<s.length;O+=1){let B=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(B===null)break;N.push({label:B[1],dst:B[2]})}return{branches:N,nextIdx:O-1}};for(let I=1;I<s.length;I+=1){let{n:N,text:O}=s[I],B=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){I!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let 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))Rp.has(Z)||r(N,`unknown \`meta\` key \`${Z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Rp].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(B==="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],he=F[3],oe=Ap[Z];oe===void 0&&r(N,`unknown step type: ${Z} (supported \`step\` archetypes: ${Object.keys(Ap).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:pt}=E$(oe,Jt(he,N,r));_(C,oe,we,N,!1,Object.keys(pt).length>0?pt:void 0);continue}if(B==="trigger"){let F=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),C=F[1],Z=F[2],he=F[3],oe=Op[Z];oe===void 0&&r(N,`unknown trigger type: ${Z} (registered trigger archetypes: ${Object.keys(Op).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:oe,parameters:Jt(he,N,r)});continue}if(B==="mcp"||B==="skill"){let F=new RegExp(`^${B}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${B}\` decl (expected \`${B} <name> = {json} | ${B} <name> = "<file|url>"\`): ${O}`),C=F[1],Z=F[2].trim(),he=B==="mcp"?h:g;he.has(C)&&r(N,`duplicate ${B} declaration: ${C}`);let oe;if(Z.startsWith("{")){let we=Jt(Z,N,r);B==="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=Lp(Z);(typeof we!="string"||we.length===0)&&r(N,`\`${B} ${C}\`: string form must be a non-empty file path or http(s) URL`),oe=we}he.set(C,oe);continue}if(B==="terminal"){let F=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(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(B==="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 he=C[Z],oe=C[Z+1],we=C[Z+2],pt=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:he,port:pt,dstDeclId:we,line:N})}continue}if(B==="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=[],he,oe=I+1;for(;oe<s.length;oe+=1){let we=s[oe].text,pt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(pt!==null){he!==void 0&&r(s[oe].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let ln=pt[2];Z.push({when:pt[1].trim(),next:`@terminal:${ln}`}),c.push({srcDeclId:C,port:ln,dstDeclId:pt[3],line:s[oe].n});continue}let ea=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(ea!==null){he!==void 0&&r(s[oe].n,`\`choice ${C}\` has more than one \`default\``);let ln=ea[1];he=`@terminal:${ln}`,c.push({srcDeclId:C,port:ln,dstDeclId:ea[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,...he!==void 0?{default_next:he}:{}},N,!1),I=oe-1;continue}if(B==="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(B==="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(B==="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),he=Z.workflow;(typeof he!="string"||he.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...we}=Z;_(C,"lmctl/subflow",{workflow_name:he,...we},N,!1),d.push({declId:C,target:he,line:N});continue}if(B==="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:he,nextIdx:oe}=y(I);he.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 he)c.push({srcDeclId:C,port:we.label,dstDeclId:we.dst,line:N});I=oe;continue}if(B==="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 \`${B}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let k=I=>{if(Array.isArray(I)){for(let O of I)k(O);return}if(typeof I!="object"||I===null)return;let N=I;if(typeof N.alias=="string")for(let[O,B]of[["mcp",h],["skills",g]]){let F=N[O];Array.isArray(F)&&(N[O]=F.map(C=>typeof C=="string"&&B.has(C)?structuredClone(B.get(C)):C))}for(let O of Object.values(N))k(O)};for(let I of u){let N=l.get(I);N.members!==void 0&&k(N.members)}let v=I=>jp(i,I),$=u.map(I=>{let N=l.get(I);return{id:v(I),name:I,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),S={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let N=v(I.srcDeclId);S[N]??={},S[N][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),S[N][I.port]=[[{step_id:v(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let N=l.get(I);b$.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let I of c){let N=R.get(I.srcDeclId);N===void 0?R.set(I.srcDeclId,[I.dstDeclId]):N.push(I.dstDeclId)}for(let I of u){let N=l.get(I);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let B=R.get(I);B===void 0?R.set(I,[O]):B.push(O)}}let L=new Set([f]),q=[f];for(;q.length>0;){let I=q.shift();for(let N of R.get(I)??[])L.has(N)||(L.add(N),q.push(N))}for(let I of u)L.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let ee=new Map;for(let I of c){let N=ee.get(I.srcDeclId);N===void 0&&(N=new Set,ee.set(I.srcDeclId,N)),N.add(I.port)}let j=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let N=l.get(I);if(N.isTerminal)continue;let O=ee.get(I)??new Set;if(N.type==="lmctl/review"){let F=[...O].some(C=>!j.has(C));!O.has("approve")&&!F&&r(N.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let B=T$[N.type];if(B!==void 0)for(let F of B)O.has(F)||r(N.line,`uncovered outcome: required outcome \`${F}\` of step \`${I}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${I} -${F}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${I}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let N=l.get(I),O=w$[N.type];if(O===void 0)continue;let B={...N.params,...N.members??{},type:O.v2type,state_name:I,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},F=O.schema.safeParse(B);if(!F.success){let C=F.error.issues[0],Z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${I}\` (\`${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 ${I} = ${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:$,connections:S,entry_step_id:v(f)},me=dt.safeParse(H);if(!me.success)throw new Jr(me.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return me.data}function S$(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 k$(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]=Lp(l)}return s}function k$(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Lp(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 w$,y$,Ap,Jr,b$,T$,Rp,Op,Mp=T(()=>{"use strict";Hr();xp();qr();w$={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:$o},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:jo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:xo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Ao},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Ro}},y$={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Ap={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"},Jr=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1387
+ `),s=[];for(let I=0;I<n.length;I+=1){let O=S$(n[I]).trim();O.length>0&&s.push({n:I+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(I,N,O,B,F,C)=>{l.has(I)&&r(B,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(B,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:N,params:O,line:B,isTerminal:F,...C?{members:C}:{}}),u.push(I)},y=I=>{let N=[],O=I+1;for(;O<s.length;O+=1){let B=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(B===null)break;N.push({label:B[1],dst:B[2]})}return{branches:N,nextIdx:O-1}};for(let I=1;I<s.length;I+=1){let{n:N,text:O}=s[I],B=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){I!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let 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=Ht(F[1],N,r);for(let Z of Object.keys(C))Rp.has(Z)||r(N,`unknown \`meta\` key \`${Z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Rp].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(B==="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],he=F[3],oe=Ap[Z];oe===void 0&&r(N,`unknown step type: ${Z} (supported \`step\` archetypes: ${Object.keys(Ap).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:pt}=E$(oe,Ht(he,N,r));_(C,oe,we,N,!1,Object.keys(pt).length>0?pt:void 0);continue}if(B==="trigger"){let F=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),C=F[1],Z=F[2],he=F[3],oe=Op[Z];oe===void 0&&r(N,`unknown trigger type: ${Z} (registered trigger archetypes: ${Object.keys(Op).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:oe,parameters:Ht(he,N,r)});continue}if(B==="mcp"||B==="skill"){let F=new RegExp(`^${B}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${B}\` decl (expected \`${B} <name> = {json} | ${B} <name> = "<file|url>"\`): ${O}`),C=F[1],Z=F[2].trim(),he=B==="mcp"?h:g;he.has(C)&&r(N,`duplicate ${B} declaration: ${C}`);let oe;if(Z.startsWith("{")){let we=Ht(Z,N,r);B==="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=Lp(Z);(typeof we!="string"||we.length===0)&&r(N,`\`${B} ${C}\`: string form must be a non-empty file path or http(s) URL`),oe=we}he.set(C,oe);continue}if(B==="terminal"){let F=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(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(B==="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 he=C[Z],oe=C[Z+1],we=C[Z+2],pt=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:he,port:pt,dstDeclId:we,line:N})}continue}if(B==="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=[],he,oe=I+1;for(;oe<s.length;oe+=1){let we=s[oe].text,pt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(pt!==null){he!==void 0&&r(s[oe].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let ln=pt[2];Z.push({when:pt[1].trim(),next:`@terminal:${ln}`}),c.push({srcDeclId:C,port:ln,dstDeclId:pt[3],line:s[oe].n});continue}let ea=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(ea!==null){he!==void 0&&r(s[oe].n,`\`choice ${C}\` has more than one \`default\``);let ln=ea[1];he=`@terminal:${ln}`,c.push({srcDeclId:C,port:ln,dstDeclId:ea[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,...he!==void 0?{default_next:he}:{}},N,!1),I=oe-1;continue}if(B==="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",Ht(F[2],N,r),N,!1);continue}if(B==="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=Ht(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(B==="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=Ht(F[2],N,r),he=Z.workflow;(typeof he!="string"||he.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...we}=Z;_(C,"lmctl/subflow",{workflow_name:he,...we},N,!1),d.push({declId:C,target:he,line:N});continue}if(B==="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=Ht(F[2],N,r),{branches:he,nextIdx:oe}=y(I);he.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 he)c.push({srcDeclId:C,port:we.label,dstDeclId:we.dst,line:N});I=oe;continue}if(B==="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 \`${B}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let k=I=>{if(Array.isArray(I)){for(let O of I)k(O);return}if(typeof I!="object"||I===null)return;let N=I;if(typeof N.alias=="string")for(let[O,B]of[["mcp",h],["skills",g]]){let F=N[O];Array.isArray(F)&&(N[O]=F.map(C=>typeof C=="string"&&B.has(C)?structuredClone(B.get(C)):C))}for(let O of Object.values(N))k(O)};for(let I of u){let N=l.get(I);N.members!==void 0&&k(N.members)}let v=I=>jp(i,I),$=u.map(I=>{let N=l.get(I);return{id:v(I),name:I,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),S={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let N=v(I.srcDeclId);S[N]??={},S[N][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),S[N][I.port]=[[{step_id:v(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let N=l.get(I);b$.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let I of c){let N=R.get(I.srcDeclId);N===void 0?R.set(I.srcDeclId,[I.dstDeclId]):N.push(I.dstDeclId)}for(let I of u){let N=l.get(I);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let B=R.get(I);B===void 0?R.set(I,[O]):B.push(O)}}let L=new Set([f]),q=[f];for(;q.length>0;){let I=q.shift();for(let N of R.get(I)??[])L.has(N)||(L.add(N),q.push(N))}for(let I of u)L.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let ee=new Map;for(let I of c){let N=ee.get(I.srcDeclId);N===void 0&&(N=new Set,ee.set(I.srcDeclId,N)),N.add(I.port)}let j=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let N=l.get(I);if(N.isTerminal)continue;let O=ee.get(I)??new Set;if(N.type==="lmctl/review"){let F=[...O].some(C=>!j.has(C));!O.has("approve")&&!F&&r(N.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let B=T$[N.type];if(B!==void 0)for(let F of B)O.has(F)||r(N.line,`uncovered outcome: required outcome \`${F}\` of step \`${I}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${I} -${F}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${I}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let N=l.get(I),O=w$[N.type];if(O===void 0)continue;let B={...N.params,...N.members??{},type:O.v2type,state_name:I,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},F=O.schema.safeParse(B);if(!F.success){let C=F.error.issues[0],Z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${I}\` (\`${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 ${I} = ${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:$,connections:S,entry_step_id:v(f)},me=ut.safeParse(H);if(!me.success)throw new Jr(me.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return me.data}function S$(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 Ht(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 k$(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]=Lp(l)}return s}function k$(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Lp(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 w$,y$,Ap,Jr,b$,T$,Rp,Op,Mp=T(()=>{"use strict";Hr();xp();qr();w$={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:jo},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:xo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Ao},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Ro},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Oo}},y$={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Ap={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"},Jr=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1362
1388
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1363
1389
  `)}`),this.issues=e,this.name="DslCompileError"}},b$=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"]),T$={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},Rp=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),Op={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as v$}from"node:fs";function I$(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function N$(t){for(let e of t.split(`
1364
- `)){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"&&I$()&&N$(t)){let r;try{r=Cp(t)}catch(s){throw s instanceof Jr?new It(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=dt.safeParse(r);if(!n.success)throw new It(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Lo(j$(t));if(x$(e)&&e.definition_schema_version===3){let r=dt.safeParse(e);if(!r.success)throw new It(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return $$(e)}function $$(t){let e=Oo.safeParse(t);if(!e.success)throw new It(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 It([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Ip(r)}catch(s){throw s instanceof vt?new Jl(s):s}}function j$(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1365
- `)||e.startsWith("{")||e.startsWith("[")?Dp(t):e.endsWith(".json")?Dp(v$(e,"utf8")):t}function Dp(t){return JSON.parse(t)}function x$(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Jl,It,Xr=T(()=>{"use strict";qr();$p();Hl();Hr();Mp();Jl=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},It=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Mo(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:A$(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:O$(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function A$(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=R$(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function R$(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 O$(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Xl=T(()=>{"use strict"});var Pp={};ie(Pp,{enqueueFromAgentOutput:()=>L$,enqueueFromGitHubIssue:()=>Gl,enqueueManual:()=>C$,enqueueScheduled:()=>M$});function Gl(t,e){return Po(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:Do(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function C$(t,e){return Po(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:Do(e.payload),concurrency_key:e.concurrency_key})}function L$(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Po(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:Do(e.payload),concurrency_key:e.concurrency_key})}function M$(t,e){return Po(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:Do(e.payload),concurrency_key:e.concurrency_key})}function Do(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Po(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=Mo({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Vl=T(()=>{"use strict";Xr();Xl()});async function Up(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Fp(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 D$(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...P$(o.parameters_override)},l=Fp(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 Fp(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Gl(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 D$(t,e){if(t===null||t.trim().length===0)return!0;try{return await pr(t,e)===!0}catch{return!1}}function P$(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 Wp=T(()=>{"use strict";Br();Vl()});import{spawnSync as F$}from"node:child_process";async function Yl(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=F$(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(!W$(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await Up({dal:t.dal,project:t.project,issue:B$(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function Gr(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=U$(r.intake_config);try{let s=await Yl({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 U$(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Kl(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 W$(t){return Array.isArray(t)&&t.every(e=>{if(!Kl(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:Kl(n)&&typeof n.name=="string"))})}function B$(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 Kl(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Fo=T(()=>{"use strict";Wp()});function qp(t){return async e=>H$(t.app,e,t.log!==void 0?{log:t.log}:{})}async function H$(t,e,r={}){let n=J$(e.path),s={"content-type":"application/json",...e.headers??{},[Uo]:zl},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} ${Bp(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} ${Bp(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Bp(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function J$(t){let e=t.startsWith("/")?t:`/${t}`;return`${q$}${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()!==Uo&&(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 Uo,zl,q$,Zl=T(()=>{"use strict";Uo="x-mailbox-channel",zl="1",q$="http://mailbox.local"});import{createHash as Hp,createHmac as G$,timingSafeEqual as V$}from"node:crypto";function Jp(){return async(t,e)=>{let r=Xp();if(r===null||Q$(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Uo)===zl){await e();return}let n=t.req.query("token");if(n!==void 0&&Wo(n,r)){ec(t,r),await e();return}if(Z$(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 Xp(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Gp(t){let e=Xp();return e!==null&&Wo(t,e)}function ec(t,e,r=new Date){t.header("Set-Cookie",`${Ql}=${Y$(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Vp(t){t.header("Set-Cookie",`${Ql}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function Y$(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+K$*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Kp(t,n)}`,"utf8").toString("base64url")}function z$(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:Wo(s[2],Kp(e,`${s[0]}|${s[1]}`))}function Wo(t,e){return V$(Hp("sha256").update(t).digest(),Hp("sha256").update(e).digest())}function Z$(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&Wo(r,e))return!0;let n=ej(t.req.header("cookie")??"")[Ql];return n!==void 0&&z$(n,e)}function Q$(t){return t==="/login"||t==="/logout"}function ej(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 Kp(t,e){return G$("sha256",t).update(e).digest("hex")}var Ql,K$,Yp=T(()=>{"use strict";Zl();Ql="lmctl_next_session",K$=30});import{existsSync as Vr,mkdirSync as tj,readdirSync as rj,readFileSync as Bo,unlinkSync as nj,writeFileSync as nc}from"node:fs";import{join as _r}from"node:path";function Ve(t){if(!sj.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Zp(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 lj(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:zp,updated_at:zp}:null}function oj(t,e,r,n){let s=r!==null?`
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"&&I$()&&N$(t)){let r;try{r=Cp(t)}catch(s){throw s instanceof Jr?new It(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=ut.safeParse(r);if(!n.success)throw new It(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Mo(j$(t));if(x$(e)&&e.definition_schema_version===3){let r=ut.safeParse(e);if(!r.success)throw new It(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return $$(e)}function $$(t){let e=Co.safeParse(t);if(!e.success)throw new It(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 It([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Ip(r)}catch(s){throw s instanceof vt?new Jl(s):s}}function j$(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1391
+ `)||e.startsWith("{")||e.startsWith("[")?Dp(t):e.endsWith(".json")?Dp(v$(e,"utf8")):t}function Dp(t){return JSON.parse(t)}function x$(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Jl,It,Xr=T(()=>{"use strict";qr();$p();Hl();Hr();Mp();Jl=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},It=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Do(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:A$(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:O$(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function A$(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=R$(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function R$(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 O$(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Xl=T(()=>{"use strict"});var Pp={};ie(Pp,{enqueueFromAgentOutput:()=>L$,enqueueFromGitHubIssue:()=>Gl,enqueueManual:()=>C$,enqueueScheduled:()=>M$});function Gl(t,e){return Fo(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:Po(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function C$(t,e){return Fo(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:Po(e.payload),concurrency_key:e.concurrency_key})}function L$(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Fo(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:Po(e.payload),concurrency_key:e.concurrency_key})}function M$(t,e){return Fo(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:Po(e.payload),concurrency_key:e.concurrency_key})}function Po(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Fo(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=Do({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Vl=T(()=>{"use strict";Xr();Xl()});async function Up(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Fp(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 D$(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...P$(o.parameters_override)},l=Fp(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 Fp(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Gl(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 D$(t,e){if(t===null||t.trim().length===0)return!0;try{return await mr(t,e)===!0}catch{return!1}}function P$(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 Wp=T(()=>{"use strict";Br();Vl()});import{spawnSync as F$}from"node:child_process";async function Yl(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=F$(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(!W$(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await Up({dal:t.dal,project:t.project,issue:B$(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function Gr(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=U$(r.intake_config);try{let s=await Yl({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 U$(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Kl(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 W$(t){return Array.isArray(t)&&t.every(e=>{if(!Kl(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:Kl(n)&&typeof n.name=="string"))})}function B$(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 Kl(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Uo=T(()=>{"use strict";Wp()});function qp(t){return async e=>H$(t.app,e,t.log!==void 0?{log:t.log}:{})}async function H$(t,e,r={}){let n=J$(e.path),s={"content-type":"application/json",...e.headers??{},[Wo]:zl},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} ${Bp(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} ${Bp(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Bp(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function J$(t){let e=t.startsWith("/")?t:`/${t}`;return`${q$}${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()!==Wo&&(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 Wo,zl,q$,Zl=T(()=>{"use strict";Wo="x-mailbox-channel",zl="1",q$="http://mailbox.local"});import{createHash as Hp,createHmac as G$,timingSafeEqual as V$}from"node:crypto";function Jp(){return async(t,e)=>{let r=Xp();if(r===null||Q$(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Wo)===zl){await e();return}let n=t.req.query("token");if(n!==void 0&&Bo(n,r)){ec(t,r),await e();return}if(Z$(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 Xp(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Gp(t){let e=Xp();return e!==null&&Bo(t,e)}function ec(t,e,r=new Date){t.header("Set-Cookie",`${Ql}=${Y$(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Vp(t){t.header("Set-Cookie",`${Ql}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function Y$(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+K$*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Kp(t,n)}`,"utf8").toString("base64url")}function z$(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:Bo(s[2],Kp(e,`${s[0]}|${s[1]}`))}function Bo(t,e){return V$(Hp("sha256").update(t).digest(),Hp("sha256").update(e).digest())}function Z$(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&Bo(r,e))return!0;let n=ej(t.req.header("cookie")??"")[Ql];return n!==void 0&&z$(n,e)}function Q$(t){return t==="/login"||t==="/logout"}function ej(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 Kp(t,e){return G$("sha256",t).update(e).digest("hex")}var Ql,K$,Yp=T(()=>{"use strict";Zl();Ql="lmctl_next_session",K$=30});import{existsSync as Vr,mkdirSync as tj,readdirSync as rj,readFileSync as qo,unlinkSync as nj,writeFileSync as nc}from"node:fs";import{join as pr}from"node:path";function Ve(t){if(!sj.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Zp(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 lj(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:zp,updated_at:zp}:null}function oj(t,e,r,n){let s=r!==null?`
1366
1392
  description: ${r}`:"";return`---
1367
1393
  name: ${t}${s}
1368
1394
  type: ${e}
1369
1395
  ---
1370
- ${n}`}function ij(t,e,r,n){let s=_r(t,sc),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=Vr(s)?Bo(s,"utf8"):"",a=new RegExp(`^- \\[${Qp(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1396
+ ${n}`}function ij(t,e,r,n){let s=pr(t,sc),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=Vr(s)?qo(s,"utf8"):"",a=new RegExp(`^- \\[${Qp(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1371
1397
  `)?`${i}
1372
1398
  ${o}
1373
1399
  `:`${i}${o}
1374
- `,nc(s,i,"utf8")}function aj(t,e){let r=_r(t,sc);if(!Vr(r))return;let n=Bo(r,"utf8"),s=new RegExp(`^- \\[${Qp(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&nc(r,n.replace(s,""),"utf8")}function Qp(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function lj(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function rt(t,e){return t.durable_memory_mode==="db"?new rc(e,t.id):new tc(t.local_path)}var sj,sc,zp,tc,rc,oc=T(()=>{"use strict";sj=/^[a-zA-Z0-9_-]+$/;sc="MEMORY.md",zp="1970-01-01T00:00:00.000Z",tc=class{dir;constructor(e){this.dir=_r(e,"durable-memory")}read(e){Ve(e);let r=_r(this.dir,`${e}.md`);if(!Vr(r))return null;let n=Bo(r,"utf8");return Zp(e,n)}write(e){Ve(e.name),tj(this.dir,{recursive:!0});let r=_r(this.dir,`${e.name}.md`),n=!Vr(r),s=oj(e.name,e.type,e.description??null,e.body);return nc(r,s,"utf8"),ij(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=_r(this.dir,`${e}.md`);return Vr(r)?(nj(r),aj(this.dir,e),!0):!1}listFiles(){if(!Vr(this.dir))return[];let e=rj(this.dir).filter(n=>n.endsWith(".md")&&n!==sc),r=[];for(let n of e){let s=n.slice(0,-3),o=Bo(_r(this.dir,n),"utf8"),i=Zp(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};rc=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 t_(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||!e_.has(a))return n.json({error:`invalid type: must be one of ${[...e_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=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 e_,r_=T(()=>{"use strict";oc();e_=new Set(["user","feedback","project","reference"])});function uj(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(cj[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function dj(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 n_(t,e=new Date){let{time:r,date:n}=dj(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=uj(h.data),y=h.data.length,k=new Uint8Array(30+g.length),v=new DataView(k.buffer);v.setUint32(0,67324752,!0),v.setUint16(4,20,!0),v.setUint16(6,0,!0),v.setUint16(8,0,!0),v.setUint16(10,r,!0),v.setUint16(12,n,!0),v.setUint32(14,_,!0),v.setUint32(18,y,!0),v.setUint32(22,y,!0),v.setUint16(26,g.length,!0),v.setUint16(28,0,!0),k.set(g,30),s.push(k,h.data);let $=new Uint8Array(46+g.length),S=new DataView($.buffer);S.setUint32(0,33639248,!0),S.setUint16(4,20,!0),S.setUint16(6,20,!0),S.setUint16(8,0,!0),S.setUint16(10,0,!0),S.setUint16(12,r,!0),S.setUint16(14,n,!0),S.setUint32(16,_,!0),S.setUint32(20,y,!0),S.setUint32(24,y,!0),S.setUint16(28,g.length,!0),S.setUint16(30,0,!0),S.setUint16(32,0,!0),S.setUint16(34,0,!0),S.setUint16(36,0,!0),S.setUint32(38,0,!0),S.setUint32(42,i,!0),$.set(g,46),o.push($),i+=k.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 cj,s_=T(()=>{"use strict";cj=(()=>{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 Jo,mkdirSync as fj,readdirSync as mj,readFileSync as a_,statSync as pj,unlinkSync as _j,writeFileSync as hj}from"node:fs";import{join as Pn}from"node:path";function l_(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(wj(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||!Ho.has(l))return A(n,`invalid type: must be one of ${[...Ho].join("|")}`,400);try{Ve(i)}catch(f){return A(n,f.message,400)}let c=Mn(s.local_path),u=Pn(c,`${i}.md`);if(Jo(u))return A(n,`chapter already exists: ${i}`,409);fj(c,{recursive:!0}),i_(u,i,l,ae(o,"description"),a);let d=Dn(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=Dn(Mn(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=Mn(s.local_path),a=Dn(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(!Ho.has(d))return A(n,`invalid type: must be one of ${[...Ho].join("|")}`,400);i_(Pn(i,`${o}.md`),o,d,u,c);let f=Dn(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=Pn(Mn(s.local_path),`${o}.md`);return Jo(i)?(_j(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(o_))),t.post("/api/chat/sessions",async n=>{let s=await gj(n);if(typeof s=="string")return A(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(o_,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=ur(r,s),a=[];for(let c of i){let u=Ej(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=a_(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=n_(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 gj(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 Mn(t){return Pn(t,"ai-test")}function Dn(t,e){let r=Pn(t,`${e}.md`);if(!Jo(r))return null;let n=a_(r,"utf8"),s=yj(n),o=pj(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function wj(t){let e=Mn(t);return Jo(e)?mj(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Dn(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function i_(t,e,r,n,s){let o=n!==null&&n.length>0?`
1400
+ `,nc(s,i,"utf8")}function aj(t,e){let r=pr(t,sc);if(!Vr(r))return;let n=qo(r,"utf8"),s=new RegExp(`^- \\[${Qp(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&nc(r,n.replace(s,""),"utf8")}function Qp(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function lj(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function rt(t,e){return t.durable_memory_mode==="db"?new rc(e,t.id):new tc(t.local_path)}var sj,sc,zp,tc,rc,oc=T(()=>{"use strict";sj=/^[a-zA-Z0-9_-]+$/;sc="MEMORY.md",zp="1970-01-01T00:00:00.000Z",tc=class{dir;constructor(e){this.dir=pr(e,"durable-memory")}read(e){Ve(e);let r=pr(this.dir,`${e}.md`);if(!Vr(r))return null;let n=qo(r,"utf8");return Zp(e,n)}write(e){Ve(e.name),tj(this.dir,{recursive:!0});let r=pr(this.dir,`${e.name}.md`),n=!Vr(r),s=oj(e.name,e.type,e.description??null,e.body);return nc(r,s,"utf8"),ij(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=pr(this.dir,`${e}.md`);return Vr(r)?(nj(r),aj(this.dir,e),!0):!1}listFiles(){if(!Vr(this.dir))return[];let e=rj(this.dir).filter(n=>n.endsWith(".md")&&n!==sc),r=[];for(let n of e){let s=n.slice(0,-3),o=qo(pr(this.dir,n),"utf8"),i=Zp(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};rc=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 t_(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||!e_.has(a))return n.json({error:`invalid type: must be one of ${[...e_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=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 e_,r_=T(()=>{"use strict";oc();e_=new Set(["user","feedback","project","reference"])});function uj(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(cj[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function dj(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 n_(t,e=new Date){let{time:r,date:n}=dj(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=uj(h.data),y=h.data.length,k=new Uint8Array(30+g.length),v=new DataView(k.buffer);v.setUint32(0,67324752,!0),v.setUint16(4,20,!0),v.setUint16(6,0,!0),v.setUint16(8,0,!0),v.setUint16(10,r,!0),v.setUint16(12,n,!0),v.setUint32(14,_,!0),v.setUint32(18,y,!0),v.setUint32(22,y,!0),v.setUint16(26,g.length,!0),v.setUint16(28,0,!0),k.set(g,30),s.push(k,h.data);let $=new Uint8Array(46+g.length),S=new DataView($.buffer);S.setUint32(0,33639248,!0),S.setUint16(4,20,!0),S.setUint16(6,20,!0),S.setUint16(8,0,!0),S.setUint16(10,0,!0),S.setUint16(12,r,!0),S.setUint16(14,n,!0),S.setUint32(16,_,!0),S.setUint32(20,y,!0),S.setUint32(24,y,!0),S.setUint16(28,g.length,!0),S.setUint16(30,0,!0),S.setUint16(32,0,!0),S.setUint16(34,0,!0),S.setUint16(36,0,!0),S.setUint32(38,0,!0),S.setUint32(42,i,!0),$.set(g,46),o.push($),i+=k.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 cj,s_=T(()=>{"use strict";cj=(()=>{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 Xo,mkdirSync as fj,readdirSync as mj,readFileSync as a_,statSync as pj,unlinkSync as _j,writeFileSync as hj}from"node:fs";import{join as Pn}from"node:path";function l_(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||!Ho.includes(l))return A(n,`invalid type: must be one of ${Ho.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(!Ho.includes(d))return A(n,`invalid type: must be one of ${Ho.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(wj(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||!Jo.has(l))return A(n,`invalid type: must be one of ${[...Jo].join("|")}`,400);try{Ve(i)}catch(f){return A(n,f.message,400)}let c=Mn(s.local_path),u=Pn(c,`${i}.md`);if(Xo(u))return A(n,`chapter already exists: ${i}`,409);fj(c,{recursive:!0}),i_(u,i,l,ae(o,"description"),a);let d=Dn(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=Dn(Mn(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=Mn(s.local_path),a=Dn(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(!Jo.has(d))return A(n,`invalid type: must be one of ${[...Jo].join("|")}`,400);i_(Pn(i,`${o}.md`),o,d,u,c);let f=Dn(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=Pn(Mn(s.local_path),`${o}.md`);return Xo(i)?(_j(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(o_))),t.post("/api/chat/sessions",async n=>{let s=await gj(n);if(typeof s=="string")return A(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(o_,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=cr(r,s),a=[];for(let c of i){let u=Ej(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=a_(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=n_(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 gj(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 Mn(t){return Pn(t,"ai-test")}function Dn(t,e){let r=Pn(t,`${e}.md`);if(!Xo(r))return null;let n=a_(r,"utf8"),s=yj(n),o=pj(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function wj(t){let e=Mn(t);return Xo(e)?mj(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Dn(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function i_(t,e,r,n,s){let o=n!==null&&n.length>0?`
1375
1401
  description: ${n}`:"",i=`---
1376
1402
  name: ${e}${o}
1377
1403
  type: ${r}
1378
1404
  ---
1379
- ${s}`;hj(t,i,"utf8")}function yj(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 Ej(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?bj(t.path):Tj(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function bj(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function Tj(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var qo,Ho,o_,c_=T(()=>{"use strict";St();s_();oc();qo=["user","feedback","project","reference"],Ho=new Set(["smoke","integration","vision","scenario","regression"]),o_="operator"});function Ne(t,e){return`<!doctype html>
1405
+ ${s}`;hj(t,i,"utf8")}function yj(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 Ej(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?bj(t.path):Tj(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function bj(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function Tj(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var Ho,Jo,o_,c_=T(()=>{"use strict";St();s_();oc();Ho=["user","feedback","project","reference"],Jo=new Set(["smoke","integration","vision","scenario","regression"]),o_="operator"});function Ne(t,e){return`<!doctype html>
1380
1406
  <html lang="en">
1381
1407
  <head>
1382
1408
  <meta charset="utf-8">
@@ -1446,40 +1472,40 @@ ${s}`;hj(t,i,"utf8")}function yj(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1446
1472
  FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],R=S?.input!==null&&S?.input!==void 0?`input: ${S.input}, output: ${S.output??0}`:"n/a",L=e.getWorkflow(n.workflow_id),q=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,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:q,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:v,token_totals:R};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(ee)})}var d_=T(()=>{"use strict"});import{spawnSync as m_}from"node:child_process";function ac(t){return Sj[t]??`no install hint; ensure '${t}' is on PATH`}function kj(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 f_(t){return m_("which",[t],{encoding:"utf8"}).status===0}function p_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!f_(e)){let r=ac(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!f_(e)){let s=ac(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=kj(e);if(r===null)continue;let n=m_(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:ac(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var Sj,__=T(()=>{"use strict";Sj={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 vj,readdirSync as Ij,readFileSync as Nj}from"node:fs";import{join as h_}from"node:path";function $j(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(`
1447
1473
  `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function g_(t,e){let r=t.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function w_(t,e){if(e.length===0)return null;let r=h_(t,"durable-memory");if(!vj(r))return null;let n;try{n=Ij(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=Nj(h_(r,o),"utf8");if($j(i).some(l=>e.includes(l))){let l=g_(i,"name")??o.replace(".md",""),c=g_(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 y_=T(()=>{"use strict"});function uc(t){let e=t.trim().replace(jj,"").trim();for(let r=0;r<4;r+=1){let n=xj.exec(e);if(n===null)break;e=n[2].trim()}return e}function E_(t){let e=t.trim(),r=Aj.exec(e);if(r!==null)return r[2];let n=Rj.exec(e);return n!==null?n[0]:null}function Fn(t,e){let r=t.split(`
1448
1474
  `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=uc(r[i]),l=lc.exec(a);if(l===null)continue;let c=l[1].trim();if(cc.test(c))continue;let u=E_(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=uc(r[i]),l=lc.exec(a);if(l===null)break;let c=cc.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function b_(t){let e=t.split(`
1449
- `),r=null;for(let n=0;n<e.length;n+=1){let s=uc(e[n]),o=lc.exec(s);if(o===null)continue;let i=o[1].trim();if(cc.test(i))continue;let a=E_(i);if(a===null||!kr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var jj,xj,lc,cc,Aj,Rj,dc=T(()=>{"use strict";pn();jj=/^#{1,6}\s+/,xj=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,lc=/^STANCE:\s+(.+)$/,cc=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,Aj=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,Rj=/^[A-Za-z0-9_-]+/});function T_(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 S_=T(()=>{"use strict"});import{readFileSync as Oj}from"node:fs";import{dirname as Cj,join as Lj}from"node:path";import{fileURLToPath as Mj}from"node:url";function Fj(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function qj(t){let e=[],r=[];for(let n of t)Dj.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function Hj(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&Pj.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 Jj(t,e){if(t.length===0)return{matched:!1};let r=qj(t);for(let n of r){let s=Hj(n,e);if(s.matched)return s}return{matched:!1}}function fc(t){return Jj(t,Bj)}function Xj(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 mc(t){return Xj(t).split(" ").filter(e=>e.length>0)}var Dj,Pj,Uj,Wj,Bj,k_=T(()=>{"use strict";Dj=new Set(["&&","||",";","|",">",">>","<","<<"]),Pj=/^[A-Za-z_][A-Za-z0-9_]*=/;Uj=Cj(Mj(import.meta.url)),Wj=JSON.parse(Oj(Lj(Uj,"side_effect_classifier.json"),"utf-8")),Bj=Fj(Wj)});function Xo(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function v_(t,e){try{return await pr(pc(t)??t,Xo(e))===!0}catch{return!1}}async function Go(t,e){try{return await pr(pc(t)??t,Xo(e))}catch{return}}async function I_(t,e){if(typeof t!="string")return t;let r=pc(t);if(r===null)return t;try{return await pr(r,Xo(e))}catch{return}}async function N_(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 pr(a,Xo(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function pc(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 Un=T(()=>{"use strict";Br()});import{existsSync as $_,readdirSync as j_,readFileSync as Vj,statSync as x_}from"node:fs";import{join as Ko}from"node:path";function A_(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=M(),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,`${Wn}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=kr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:ys,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:Kj(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function Kj(t){return t.length>8e3?`${t.slice(0,8e3)}
1450
- \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=Yj(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return N_(n,e)}function Yj(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 Bn(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=T_(e.dal,e.run_id,()=>o),c=_c(e,r),u={violation:null},d=y=>{if(l(y),u.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let k=mc(y.summary),v=fc(k);v.matched&&!c&&(u.violation={summary:y.summary,kind:v.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=y=>{d(y),zj(y,(k,v)=>{m+=k,p+=v})},g=await Rr({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})}),Zj(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&&hc(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function zj(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Vo(s.input_tokens),a=Vo(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Vo(o.input_tokens),a=Vo(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Vo(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 Bn({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 Kr(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(Ld(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(`
1475
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=uc(e[n]),o=lc.exec(s);if(o===null)continue;let i=o[1].trim();if(cc.test(i))continue;let a=E_(i);if(a===null||!kr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var jj,xj,lc,cc,Aj,Rj,dc=T(()=>{"use strict";pn();jj=/^#{1,6}\s+/,xj=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,lc=/^STANCE:\s+(.+)$/,cc=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,Aj=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,Rj=/^[A-Za-z0-9_-]+/});function T_(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 S_=T(()=>{"use strict"});import{readFileSync as Oj}from"node:fs";import{dirname as Cj,join as Lj}from"node:path";import{fileURLToPath as Mj}from"node:url";function Fj(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function qj(t){let e=[],r=[];for(let n of t)Dj.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function Hj(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&Pj.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 Jj(t,e){if(t.length===0)return{matched:!1};let r=qj(t);for(let n of r){let s=Hj(n,e);if(s.matched)return s}return{matched:!1}}function fc(t){return Jj(t,Bj)}function Xj(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 mc(t){return Xj(t).split(" ").filter(e=>e.length>0)}var Dj,Pj,Uj,Wj,Bj,k_=T(()=>{"use strict";Dj=new Set(["&&","||",";","|",">",">>","<","<<"]),Pj=/^[A-Za-z_][A-Za-z0-9_]*=/;Uj=Cj(Mj(import.meta.url)),Wj=JSON.parse(Oj(Lj(Uj,"side_effect_classifier.json"),"utf-8")),Bj=Fj(Wj)});function Go(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function v_(t,e){try{return await mr(pc(t)??t,Go(e))===!0}catch{return!1}}async function Vo(t,e){try{return await mr(pc(t)??t,Go(e))}catch{return}}async function I_(t,e){if(typeof t!="string")return t;let r=pc(t);if(r===null)return t;try{return await mr(r,Go(e))}catch{return}}async function N_(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 mr(a,Go(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function pc(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 Un=T(()=>{"use strict";Br()});import{existsSync as $_,readdirSync as j_,readFileSync as Vj,statSync as x_}from"node:fs";import{join as Yo}from"node:path";function A_(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=M(),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,`${Wn}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=kr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Es,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:Kj(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function Kj(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=Jt(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=Jt(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=Jt(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=Yj(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return N_(n,e)}function Yj(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 Jt(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 Bn(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=T_(e.dal,e.run_id,()=>o),c=_c(e,r),u={violation:null},d=y=>{if(l(y),u.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let k=mc(y.summary),v=fc(k);v.matched&&!c&&(u.violation={summary:y.summary,kind:v.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=y=>{d(y),zj(y,(k,v)=>{m+=k,p+=v})},g=await Rr({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})}),Zj(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&&hc(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function zj(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Ko(s.input_tokens),a=Ko(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Ko(o.input_tokens),a=Ko(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Ko(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 Bn({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 Kr(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(Ld(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(`
1451
1477
 
1452
1478
  `);try{let p=await Bn({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=Fn(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 Yr(t,e){return(e?.length??0)>0?w_(t.project.local_path,e):null}function O_(t){return fc(mc(t))}function _c(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1453
1479
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1454
- 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 hc(t,e){if(!$_(t))return!1;let r=Ko(t,"durable-memory");function n(s){let o;try{o=j_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Ko(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(x_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function Zj(t,e,r){let n=Ko(t.local_path,"durable-memory");if(!$_(n))return;let s;try{s=j_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Ko(n,o),a;try{a=x_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=Vj(i,"utf8")}catch{continue}let c=ex(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
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 hc(t,e){if(!$_(t))return!1;let r=Yo(t,"durable-memory");function n(s){let o;try{o=j_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Yo(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(x_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function Zj(t,e,r){let n=Yo(t.local_path,"durable-memory");if(!$_(n))return;let s;try{s=j_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Yo(n,o),a;try{a=x_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=Vj(i,"utf8")}catch{continue}let c=ex(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1455
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 ex(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||!Qj.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var Wn,Qj,De=T(()=>{"use strict";Le();qr();Sn();y_();dc();pn();S_();k_();Un();Wn="__paused__:";Qj=new Set(["user","feedback","project","reference"])});import{spawnSync as C_}from"node:child_process";function tx(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=C_("git",["diff","--quiet"],{cwd:o}).status!==0,a=C_("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,Pl),{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 L_,M_=T(()=>{"use strict";De();L_={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=>tx(t,t.state)}});async function rx(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await v_(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),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 D_,P_=T(()=>{"use strict";De();Un();D_={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=>rx(t,t.state)}});async function nx(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=Yr(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 Kr(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??""}
1456
1482
  ${m}`:null).filter(m=>m!==null).join(`
1457
1483
 
1458
- `),c=`${n}:consolidator`,u=await Kr(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 F_,U_=T(()=>{"use strict";De();F_={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=>nx(t,t.state)}});async function sx(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 Go(e.items_from,t),a=lx(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 ix(t,e,s.id,a,l):await ox(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 ox(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await B_(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 ix(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 B_(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function B_(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__":ax(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 ax(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function lx(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 W_,q_=T(()=>{"use strict";De();Un();W_={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=>sx(t,t.state)}});async function cx(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=Yr(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 Bn({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)):(H_({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 Kr(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 F_,U_=T(()=>{"use strict";De();F_={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=>nx(t,t.state)}});async function sx(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 Vo(e.items_from,t),a=lx(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 ix(t,e,s.id,a,l):await ox(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 ox(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await B_(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 ix(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 B_(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function B_(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__":ax(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 ax(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function lx(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 W_,q_=T(()=>{"use strict";De();Un();W_={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=>sx(t,t.state)}});async function cx(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=Yr(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 Bn({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)):(H_({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}
1459
1485
 
1460
- ${u}`:u;try{let f=await Bn({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)):(H_({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 H_(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=M();e.dal.setRunPausedState(e.run_id,`${Wn}${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(ux({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function ux(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=dx(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:fx(o,3),paused_at:i,created_run_inputs:Xt(e.job.payload)}}function dx(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 fx(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 J_,X_=T(()=>{"use strict";Sn();De();J_={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=>cx(t,t.state)}});async function mx(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=px(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 px(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var G_,V_=T(()=>{"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=>mx(t,t.state)}});import{createHash as _x}from"node:crypto";import{existsSync as hx,mkdirSync as gx,readFileSync as wx,writeFileSync as yx}from"node:fs";import{dirname as Ex,isAbsolute as Y_,normalize as bx,resolve as qn}from"node:path";import{Document as Tx,ExternalHyperlink as Sx,HeadingLevel as zr,LevelFormat as kx,Packer as vx,Paragraph as st,Table as Ix,TableCell as Nx,TableRow as $x,TextRun as ot,WidthType as jx}from"docx";import{marked as xx}from"marked";async function Ax(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 Rx(t,e,n),i=await Ox(t,e),a=await Cx(t,e.title),l=await Fx(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return gx(Ex(i),{recursive:!0}),yx(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:_x("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 Rx(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?Px(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=Mx(t.project.local_path,o);if(i!==null){if(!hx(i))throw new Error(`markdown_source file not found: ${i}`);return Yo(wx(i,"utf8"))}return Yo(o)}async function Ox(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=Lx(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function Cx(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 Lx(t,e){let r=qn(t);return bx(Y_(e)?qn(e):qn(r,e))}function Mx(t,e){return Dx(e)?Y_(e)?qn(e):qn(t,e):null}function Dx(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function Px(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 Yo(s);let o=t.dal.query(`SELECT sa.content
1486
+ ${u}`:u;try{let f=await Bn({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)):(H_({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 H_(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=M();e.dal.setRunPausedState(e.run_id,`${Wn}${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(ux({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function ux(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=dx(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:fx(o,3),paused_at:i,created_run_inputs:Jt(e.job.payload)}}function dx(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 fx(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 J_,X_=T(()=>{"use strict";Sn();De();J_={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=>cx(t,t.state)}});async function mx(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=px(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 px(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var G_,V_=T(()=>{"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=>mx(t,t.state)}});import{createHash as _x}from"node:crypto";import{existsSync as hx,mkdirSync as gx,readFileSync as wx,writeFileSync as yx}from"node:fs";import{dirname as Ex,isAbsolute as Y_,normalize as bx,resolve as qn}from"node:path";import{Document as Tx,ExternalHyperlink as Sx,HeadingLevel as zr,LevelFormat as kx,Packer as vx,Paragraph as st,Table as Ix,TableCell as Nx,TableRow as $x,TextRun as ot,WidthType as jx}from"docx";import{marked as xx}from"marked";async function Ax(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 Rx(t,e,n),i=await Ox(t,e),a=await Cx(t,e.title),l=await Fx(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return gx(Ex(i),{recursive:!0}),yx(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:_x("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 Rx(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?Px(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=Mx(t.project.local_path,o);if(i!==null){if(!hx(i))throw new Error(`markdown_source file not found: ${i}`);return zo(wx(i,"utf8"))}return zo(o)}async function Ox(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=Lx(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function Cx(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 Lx(t,e){let r=qn(t);return bx(Y_(e)?qn(e):qn(r,e))}function Mx(t,e){return Dx(e)?Y_(e)?qn(e):qn(t,e):null}function Dx(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function Px(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 zo(s);let o=t.dal.query(`SELECT sa.content
1461
1487
  FROM step_artifact sa
1462
1488
  JOIN step s ON s.id = sa.step_id
1463
1489
  WHERE s.run_id = ?
1464
1490
  AND s.state_name LIKE ?
1465
1491
  AND sa.content IS NOT NULL
1466
1492
  ORDER BY sa.id DESC
1467
- LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Yo(o[0].content)}function Yo(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function Fx(t,e){let r=Z_(xx.lexer(t,{gfm:!0})),n=new Tx({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:kx.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new st("")]:r}]});return vx.toBuffer(n)}function Z_(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new st({heading:Xx(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(...Z_(Gt(r)).map(n=>n instanceof st?n:new st({children:[new ot(r.text)]})));break;case"list":qx(r)&&e.push(...Ux(r));break;case"table":Hx(r)&&e.push(Wx(r));break;case"code":Jx(r)&&e.push(...Bx(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,...gc(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,...gc({...e,code:!0})}));break;case"link":r.push(new Sx({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,...gc(e)}));break}return r.length===0?[new ot("")]:r}function gc(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function Ux(t){return t.items.map(e=>new st({children:Vt(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:K_(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:K_(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function K_(t){return t.task?`[${t.checked?"x":" "}] `:""}function Wx(t){let e=[t.header,...t.rows].map(r=>new $x({children:r.map(n=>new Nx({children:[new st({children:Vt(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new Ix({width:{size:100,type:jx.PERCENTAGE},rows:e})}function Bx(t){return t.text.split(`
1468
- `).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 qx(t){return t.type==="list"&&Array.isArray(t.items)}function Hx(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Jx(t){return t.type==="code"&&typeof t.text=="string"}function Xx(t){switch(t){case 1:return zr.HEADING_1;case 2:return zr.HEADING_2;case 3:return zr.HEADING_3;case 4:return zr.HEADING_4;case 5:return zr.HEADING_5;default:return zr.HEADING_6}}var z_,Q_=T(()=>{"use strict";De();z_={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=>Ax(t,t.state)}});import{createHash as Gx}from"node:crypto";import{existsSync as Vx,mkdirSync as Kx,readFileSync as eh,statSync as Yx}from"node:fs";import{dirname as zx,isAbsolute as th,normalize as Zx,resolve as Hn}from"node:path";import Qx from"exceljs";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),i=nA(e.input_format),a=await sA(t,e),l=await oA(t,e.title),c=i==="markdown"?pA(o):cA(o);await _A({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=Yx(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=Gx("sha256").update(eh(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 rA(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(!Vx(n))throw new Error(`source file not found: ${n}`);return eh(n,"utf8")}return r}function nA(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function sA(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=iA(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function oA(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 iA(t,e){let r=Hn(t);return Zx(th(e)?Hn(e):Hn(r,e))}function aA(t,e){return lA(e)?th(e)?Hn(e):Hn(t,e):null}function lA(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function cA(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(!zo(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>uA(r,n))}function uA(t,e){if(!zo(t))throw new Error(`sheets[${e}] must be an object`);let r=dA(t.headers,`sheets[${e}].headers`),n=fA(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:mA(t.styles)}}function dA(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 fA(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 mA(t){if(!zo(t)||!zo(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=eA.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(EA(s)){n=s.text;continue}bA(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 _A(t){Kx(zx(t.outputPath),{recursive:!0});let e=new Qx.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(gA(n.name,r));if(n.headers.length>0){let o=s.addRow(n.headers);o.font={bold:n.headerStyle?.bold??!0};let i=yA(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);hA(s,n)}await e.xlsx.writeFile(t.outputPath)}function hA(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 gA(t,e){let r=wA(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 wA(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function yA(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 EA(t){return t.type==="heading"&&typeof t.text=="string"}function bA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function zo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var rh,nh=T(()=>{"use strict";De();rh={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=>tA(t,t.state)}});import{spawnSync as TA}from"node:child_process";async function kA(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(TA("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=Yr(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 Kr(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1493
+ LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:zo(o[0].content)}function zo(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function Fx(t,e){let r=Z_(xx.lexer(t,{gfm:!0})),n=new Tx({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:kx.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new st("")]:r}]});return vx.toBuffer(n)}function Z_(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new st({heading:Xx(r.depth),children:Gt(Xt(r))}));break;case"paragraph":e.push(new st({children:Gt(Xt(r))}));break;case"text":e.push(new st({children:Xt(r).length===0?[new ot(r.text)]:Gt(Xt(r))}));break;case"blockquote":e.push(...Z_(Xt(r)).map(n=>n instanceof st?n:new st({children:[new ot(r.text)]})));break;case"list":qx(r)&&e.push(...Ux(r));break;case"table":Hx(r)&&e.push(Wx(r));break;case"code":Jx(r)&&e.push(...Bx(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 Gt(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new ot({text:n.text,...gc(e)}));break;case"strong":r.push(...Gt(Xt(n),{...e,bold:!0}));break;case"em":r.push(...Gt(Xt(n),{...e,italics:!0}));break;case"codespan":r.push(new ot({text:n.text,...gc({...e,code:!0})}));break;case"link":r.push(new Sx({link:n.href,children:Gt(Xt(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,...gc(e)}));break}return r.length===0?[new ot("")]:r}function gc(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function Ux(t){return t.items.map(e=>new st({children:Gt(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:K_(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:K_(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function K_(t){return t.task?`[${t.checked?"x":" "}] `:""}function Wx(t){let e=[t.header,...t.rows].map(r=>new $x({children:r.map(n=>new Nx({children:[new st({children:Gt(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new Ix({width:{size:100,type:jx.PERCENTAGE},rows:e})}function Bx(t){return t.text.split(`
1494
+ `).map(r=>new st({children:[new ot({text:r.length===0?" ":r,font:"Courier New"})]}))}function Xt(t){let e=t.tokens;return Array.isArray(e)?e:[]}function qx(t){return t.type==="list"&&Array.isArray(t.items)}function Hx(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Jx(t){return t.type==="code"&&typeof t.text=="string"}function Xx(t){switch(t){case 1:return zr.HEADING_1;case 2:return zr.HEADING_2;case 3:return zr.HEADING_3;case 4:return zr.HEADING_4;case 5:return zr.HEADING_5;default:return zr.HEADING_6}}var z_,Q_=T(()=>{"use strict";De();z_={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=>Ax(t,t.state)}});import{createHash as Gx}from"node:crypto";import{existsSync as Vx,mkdirSync as Kx,readFileSync as eh,statSync as Yx}from"node:fs";import{dirname as zx,isAbsolute as th,normalize as Zx,resolve as Hn}from"node:path";import Qx from"exceljs";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),i=nA(e.input_format),a=await sA(t,e),l=await oA(t,e.title),c=i==="markdown"?pA(o):cA(o);await _A({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=Yx(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=Gx("sha256").update(eh(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 rA(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(!Vx(n))throw new Error(`source file not found: ${n}`);return eh(n,"utf8")}return r}function nA(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function sA(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=iA(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function oA(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 iA(t,e){let r=Hn(t);return Zx(th(e)?Hn(e):Hn(r,e))}function aA(t,e){return lA(e)?th(e)?Hn(e):Hn(t,e):null}function lA(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function cA(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(!Zo(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>uA(r,n))}function uA(t,e){if(!Zo(t))throw new Error(`sheets[${e}] must be an object`);let r=dA(t.headers,`sheets[${e}].headers`),n=fA(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:mA(t.styles)}}function dA(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 fA(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 mA(t){if(!Zo(t)||!Zo(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=eA.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(EA(s)){n=s.text;continue}bA(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 _A(t){Kx(zx(t.outputPath),{recursive:!0});let e=new Qx.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(gA(n.name,r));if(n.headers.length>0){let o=s.addRow(n.headers);o.font={bold:n.headerStyle?.bold??!0};let i=yA(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);hA(s,n)}await e.xlsx.writeFile(t.outputPath)}function hA(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 gA(t,e){let r=wA(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 wA(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function yA(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 EA(t){return t.type==="heading"&&typeof t.text=="string"}function bA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Zo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var rh,nh=T(()=>{"use strict";De();rh={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=>tA(t,t.state)}});import{spawnSync as TA}from"node:child_process";async function kA(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(TA("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=Yr(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 Kr(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1469
1495
  ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=b_(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 y=Object.keys(e.outcomes_from_stance),k=Fn(p.text,y);if(k.outcome===null){let $=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep($.id,null,`unhandled_stance:${k.reason}`),{kind:"escalate",token:"",reason:`no_stance:${k.reason}`}}let v=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,k.outcome,"outcomes_from_stance"),K(t,r,n,k.outcome),V(t.workflow,e.outcomes_from_stance[k.outcome])}let g=Fn(p.text,SA);if(g.outcome!==null){let y=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(y.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 y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await Nt(t,n,y,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>Kr(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1470
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(`
1471
1497
 
1472
- `),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 SA,sh,oh=T(()=>{"use strict";dc();De();SA=["blocked","failed","aborted"],sh={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=>kA(t,t.state)}});import{spawnSync as vA}from"node:child_process";async function IA(t,e){let r=t.stateId,n=t.displayName,s=await We(e.command,t,n),o=_c(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=vA("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&&hc(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 ih,ah=T(()=>{"use strict";De();ih={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=>IA(t,t.state)}});async function NA(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 $A(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,jA(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 $A(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await I_(s,t);r[n]=o===s?await Go(s,t):o}return r}function jA(t,e,r){let n={};for(let s of r)n[s.name]=xA(t,e,s);return n}function xA(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=AA(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 AA(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 lh,ch=T(()=>{"use strict";Xr();De();Un();lh={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=>NA(t,t.state)}});function RA(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 uh,dh=T(()=>{"use strict";De();uh={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=>RA(t,t.state)}});async function OA(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=CA(t.cursor),a=o.filter(LA).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 CA(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function LA(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 fh,mh=T(()=>{"use strict";fh={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=>OA(t)}});async function MA(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 ph,_h=T(()=>{"use strict";ph={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=>MA(t)}});function hh(t){t.register(L_),t.register(sh),t.register(F_),t.register(J_),t.register(G_),t.register(z_),t.register(rh),t.register(ih),t.register(D_),t.register(W_),t.register(lh),t.register(uh),t.register(ph),t.register(fh)}var gh=T(()=>{"use strict";M_();P_();U_();q_();X_();V_();Q_();nh();oh();ah();ch();dh();mh();_h()});function Qo(){return Zo===null&&(Zo=new wc,hh(Zo)),Zo}var DA,wc,Zo,yc=T(()=>{"use strict";gh();DA={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"},wc=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:DA[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Zo=null});async function Eh(t){vh(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=FA(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Jn(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=p_(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Jn(n)){let m=Ec({dal:t.dal,workflow:ti(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 Th(n,m,i.current_state??n.entry_step_id);return yh(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Ec({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 bh(d,i.current_state??n.start_at);return yh(t.dal,r.id,i.id,n.name,f),f}function yh(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 Ec(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 bc(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{vh(n);let o=Jn(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=Ec({dal:t.dal,workflow:Jn(n)?ti(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Jn(n)?Th(n,a,i.current_state??n.entry_step_id):bh(a,i.current_state??n.start_at)}};return e}async function bh(t,e){let r=e;if(r.startsWith(Wn))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 $t(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=ei(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 $t(t,l.terminal);r=l.state;continue}let i,a=kh(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===mn)return $t(t,ua);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 bc(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=ei(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 $t(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=ei(t,z(t.workflow));return n.kind==="terminal"?$t(t,n.terminal):$t(t,z(t.workflow))}async function Th(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=kh(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===mn)return $t(e,ua);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 PA(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=ti(t,a);try{let p=ei(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 $t(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(kr(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})}),$t(e,"aborted")}async function PA(t,e,r){let n=Sh(e,r),s=t.workflow;t.workflow=ti(e,r);try{return await bc(t,r.id,n,r.name)}finally{t.workflow=s}}function Sh(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 bc(t,e,r,n){let s=Qo().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?BA(t,s):void 0,t.progress_step_id=null;try{return await s.execute(A_(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function FA(t,e){try{let r=JSON.parse(t);if(WA(r)&&r.definition_schema_version===3)return dt.parse(r)}catch{return e}return e}function Jn(t){return t.definition_schema_version===3}function ti(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]=Sh(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:UA(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 UA(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function WA(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function BA(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 $t(t,e){t.dal.setRunTerminalState(t.run_id,e);try{u_(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 kh(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 ei(t,e){if(!qA(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&&HA(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function qA(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function HA(t,e,r){let n=JA(t),s=r.capture_evidence&&n!==null?XA(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 JA(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 XA(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 vh(t){if(!wh.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${wh.join(", ")}`)}var wh,Ih=T(()=>{"use strict";Hr();d_();__();De();yc();pn();wh=[1,2,3]});import{readFileSync as GA,readdirSync as VA}from"node:fs";import{basename as KA,join as YA,resolve as zA}from"node:path";function jh(t={}){let e=zA(t.workflowsDir??"workflows"),r=VA(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=>ZA(YA(e,n)))}}function ZA(t){let e=KA(t);try{let r=GA(t,"utf8"),n=Re(r);return Rh(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:Oh(r)}}}function xh(t,e){try{let r=Re(e);return Rh(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:Oh(r)}}}function Ah(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 SA,sh,oh=T(()=>{"use strict";dc();De();SA=["blocked","failed","aborted"],sh={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=>kA(t,t.state)}});import{spawnSync as vA}from"node:child_process";async function IA(t,e){let r=t.stateId,n=t.displayName,s=await We(e.command,t,n),o=_c(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=vA("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&&hc(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 ih,ah=T(()=>{"use strict";De();ih={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=>IA(t,t.state)}});async function NA(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 $A(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,jA(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 $A(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await I_(s,t);r[n]=o===s?await Vo(s,t):o}return r}function jA(t,e,r){let n={};for(let s of r)n[s.name]=xA(t,e,s);return n}function xA(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=AA(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 AA(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 lh,ch=T(()=>{"use strict";Xr();De();Un();lh={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=>NA(t,t.state)}});function RA(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 uh,dh=T(()=>{"use strict";De();uh={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=>RA(t,t.state)}});async function OA(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=CA(t.cursor),a=o.filter(LA).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 CA(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function LA(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 fh,mh=T(()=>{"use strict";fh={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=>OA(t)}});async function MA(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 ph,_h=T(()=>{"use strict";ph={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=>MA(t)}});function hh(t){t.register(L_),t.register(sh),t.register(F_),t.register(J_),t.register(G_),t.register(z_),t.register(rh),t.register(ih),t.register(D_),t.register(W_),t.register(lh),t.register(uh),t.register(ph),t.register(fh)}var gh=T(()=>{"use strict";M_();P_();U_();q_();X_();V_();Q_();nh();oh();ah();ch();dh();mh();_h()});function ei(){return Qo===null&&(Qo=new wc,hh(Qo)),Qo}var DA,wc,Qo,yc=T(()=>{"use strict";gh();DA={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"},wc=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:DA[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Qo=null});async function Eh(t){vh(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=FA(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Jn(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=p_(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Jn(n)){let m=Ec({dal:t.dal,workflow:ri(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:Jt(t.job.payload)??{},team_id:t.team.id}),p=await Th(n,m,i.current_state??n.entry_step_id);return yh(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Ec({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:Jt(t.job.payload)??{},team_id:t.team.id}),f=await bh(d,i.current_state??n.start_at);return yh(t.dal,r.id,i.id,n.name,f),f}function yh(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 Ec(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 bc(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{vh(n);let o=Jn(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=Ec({dal:t.dal,workflow:Jn(n)?ri(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Jn(n)?Th(n,a,i.current_state??n.entry_step_id):bh(a,i.current_state??n.start_at)}};return e}async function bh(t,e){let r=e;if(r.startsWith(Wn))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 $t(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=ti(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 $t(t,l.terminal);r=l.state;continue}let i,a=kh(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===mn)return $t(t,ua);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 bc(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=ti(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 $t(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=ti(t,z(t.workflow));return n.kind==="terminal"?$t(t,n.terminal):$t(t,z(t.workflow))}async function Th(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=kh(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===mn)return $t(e,ua);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 PA(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=ri(t,a);try{let p=ti(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 $t(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(kr(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})}),$t(e,"aborted")}async function PA(t,e,r){let n=Sh(e,r),s=t.workflow;t.workflow=ri(e,r);try{return await bc(t,r.id,n,r.name)}finally{t.workflow=s}}function Sh(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 bc(t,e,r,n){let s=ei().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?BA(t,s):void 0,t.progress_step_id=null;try{return await s.execute(A_(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function FA(t,e){try{let r=JSON.parse(t);if(WA(r)&&r.definition_schema_version===3)return ut.parse(r)}catch{return e}return e}function Jn(t){return t.definition_schema_version===3}function ri(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]=Sh(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:UA(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 UA(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function WA(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function BA(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 $t(t,e){t.dal.setRunTerminalState(t.run_id,e);try{u_(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 kh(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 ti(t,e){if(!qA(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&&HA(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function qA(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function HA(t,e,r){let n=JA(t),s=r.capture_evidence&&n!==null?XA(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 JA(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 XA(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 vh(t){if(!wh.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${wh.join(", ")}`)}var wh,Ih=T(()=>{"use strict";Hr();d_();__();De();yc();pn();wh=[1,2,3]});import{readFileSync as GA,readdirSync as VA}from"node:fs";import{basename as KA,join as YA,resolve as zA}from"node:path";function jh(t={}){let e=zA(t.workflowsDir??"workflows"),r=VA(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=>ZA(YA(e,n)))}}function ZA(t){let e=KA(t);try{let r=GA(t,"utf8"),n=Re(r);return Rh(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:Oh(r)}}}function xh(t,e){try{let r=Re(e);return Rh(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:Oh(r)}}}function Ah(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(`
1473
1499
  `)}
1474
- `}function Rh(t,e){let r=eR(e),n=tR(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=QA(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 QA(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function eR(t){return Tc(t)?t.entry_step_id:t.start_at}function tR(t){return Tc(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Tc(t){return t.definition_schema_version===3}function Oh(t){return t instanceof It?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 Ch(t){let e=new Set;if(Tc(t))for(let r of t.steps){let n=r.members??{};Nh(n,e)}else for(let r of Object.values(t.states))Nh(r,e);return[...e].sort()}function Nh(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=$h(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=$h(i);a!==null&&e.add(a)}}}function $h(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var ri=T(()=>{"use strict";Xr()});function rR({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,ni)[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}=nR(t,r,i);if(a<20)continue;let c=i??"initial",u=`${Xn}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:ni,source_ref:Xn,payload:JSON.stringify({kind:Xn,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function nR(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1500
+ `}function Rh(t,e){let r=eR(e),n=tR(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=QA(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 QA(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function eR(t){return Tc(t)?t.entry_step_id:t.start_at}function tR(t){return Tc(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Tc(t){return t.definition_schema_version===3}function Oh(t){return t instanceof It?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 Ch(t){let e=new Set;if(Tc(t))for(let r of t.steps){let n=r.members??{};Nh(n,e)}else for(let r of Object.values(t.states))Nh(r,e);return[...e].sort()}function Nh(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=$h(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=$h(i);a!==null&&e.add(a)}}}function $h(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var ni=T(()=>{"use strict";Xr()});function rR({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,si)[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}=nR(t,r,i);if(a<20)continue;let c=i??"initial",u=`${Xn}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:si,source_ref:Xn,payload:JSON.stringify({kind:Xn,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function nR(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1475
1501
  FROM run r
1476
1502
  JOIN job j ON j.id = r.job_id
1477
1503
  WHERE j.project_id = ?
1478
1504
  AND r.terminal_state IS NOT NULL
1479
- ${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 Lh(t){for(let e of sR)try{e(t)}catch{}}var ni,Xn,sR,Sc=T(()=>{"use strict";ni="memory_policy",Xn="memory_consolidation_request";sR=[rR]});var Wh={};ie(Wh,{getOrInsertConsolidationWorkflow:()=>Dh,runJobById:()=>si,runOnce:()=>gr,startWorker:()=>cR});import{createHash as oR}from"node:crypto";import{readFileSync as iR}from"node:fs";import{pathToFileURL as aR}from"node:url";function Dh(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Eo({swallow:!0});let n=bo(e);if(n===null)return null;let s=iR(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:oR("sha256").update(s).digest("hex")})}catch{return null}}async function gr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??Mh,evaluator:n=>Fh(t.dal,n)}),r===null?null:await Ph(t.dal,r,e)}catch(n){if(r!==null)return Kt(t.dal,r,"worker_run_failed",hr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:oi(hr(n))})})}catch{}return null}finally{t.max_concurrent}}async function si(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??Mh,evaluator:s=>Fh(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Ph(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...Kt(t.dal,r,"worker_run_failed",hr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:oi(hr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function Ph(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===ni&&e.source_ref===Xn,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=Dh(t):i=Uh(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",hr(d),r,n)}let u=uR(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 Eh({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",hr(d),r,n,a)}}function Fh(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=Uh(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 Mo({workflow:s,job:e,project:r})}function Uh(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function cR(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await gr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:oi(hr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??lR))}};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=oi(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function hr(t){return t instanceof Error?t.message:String(t)}function oi(t){return t.length>4096?t.slice(0,4096):t}function uR(t,e){let r=Ch(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Mh,lR,Gn=T(()=>{"use strict";To();Ih();Xr();ri();Xl();Sc();Mh=6e5,lR=5e3});import{existsSync as dR,readFileSync as fR}from"node:fs";import{marked as mR}from"marked";function Jh(t,e){t.get("/layman",r=>r.html(Ne("Layman Home",pR(e.dal)))),t.get("/api/layman",r=>r.json(Kh(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Hh(r);return n===null?r.notFound():r.html(Ne(`Start ${Zr(n)}`,gR(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Hh(r);return n===null?r.notFound():n==="newspaper"?Bh(r,e.dal):wR(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=cr(e.dal,ii(r,"id"));return n===null?r.notFound():r.html(Ne(`Run ${n.id}`,bR(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=cr(e.dal,ii(r,"id"));return n===null?r.notFound():r.json(RR(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>SR(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Ne("Newspaper Subscriptions",xR(e.dal)))),t.post("/layman/newspaper",r=>Bh(r,e.dal)),t.delete("/layman/newspaper/:id",r=>qh(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>qh(r,e.dal))}function pR(t){let e=Kh(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 Lh(t){for(let e of sR)try{e(t)}catch{}}var si,Xn,sR,Sc=T(()=>{"use strict";si="memory_policy",Xn="memory_consolidation_request";sR=[rR]});var Wh={};ie(Wh,{getOrInsertConsolidationWorkflow:()=>Dh,runJobById:()=>oi,runOnce:()=>hr,startWorker:()=>cR});import{createHash as oR}from"node:crypto";import{readFileSync as iR}from"node:fs";import{pathToFileURL as aR}from"node:url";function Dh(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{bo({swallow:!0});let n=To(e);if(n===null)return null;let s=iR(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:oR("sha256").update(s).digest("hex")})}catch{return null}}async function hr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??Mh,evaluator:n=>Fh(t.dal,n)}),r===null?null:await Ph(t.dal,r,e)}catch(n){if(r!==null)return Vt(t.dal,r,"worker_run_failed",_r(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:ii(_r(n))})})}catch{}return null}finally{t.max_concurrent}}async function oi(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??Mh,evaluator:s=>Fh(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Ph(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...Vt(t.dal,r,"worker_run_failed",_r(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:ii(_r(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function Ph(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return Vt(t,e,"worker_project_missing","project_not_found",r);let s=e.source===si&&e.source_ref===Xn,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=Dh(t):i=Uh(t,e,n),i===null)return Vt(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 Vt(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Re(i.definition)}catch(d){return Vt(t,e,"worker_workflow_invalid",_r(d),r,n)}let u=uR(c,l);if(u.length>0)return Vt(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await Eh({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 Vt(t,e,"worker_run_failed",_r(d),r,n,a)}}function Fh(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=Uh(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 Do({workflow:s,job:e,project:r})}function Uh(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function cR(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await hr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:ii(_r(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??lR))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function Vt(t,e,r,n,s,o,i){let a=ii(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 _r(t){return t instanceof Error?t.message:String(t)}function ii(t){return t.length>4096?t.slice(0,4096):t}function uR(t,e){let r=Ch(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Mh,lR,Gn=T(()=>{"use strict";So();Ih();Xr();ni();Xl();Sc();Mh=6e5,lR=5e3});import{existsSync as dR,readFileSync as fR}from"node:fs";import{marked as mR}from"marked";function Jh(t,e){t.get("/layman",r=>r.html(Ne("Layman Home",pR(e.dal)))),t.get("/api/layman",r=>r.json(Kh(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Hh(r);return n===null?r.notFound():r.html(Ne(`Start ${Zr(n)}`,gR(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Hh(r);return n===null?r.notFound():n==="newspaper"?Bh(r,e.dal):wR(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=lr(e.dal,ai(r,"id"));return n===null?r.notFound():r.html(Ne(`Run ${n.id}`,bR(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=lr(e.dal,ai(r,"id"));return n===null?r.notFound():r.json(RR(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>SR(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Ne("Newspaper Subscriptions",xR(e.dal)))),t.post("/layman/newspaper",r=>Bh(r,e.dal)),t.delete("/layman/newspaper/:id",r=>qh(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>qh(r,e.dal))}function pR(t){let e=Kh(t);return`<section class="layman-home">
1480
1506
  <h1>Welcome</h1>
1481
1507
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1482
- <div class="grid">${ai.map(_R).join("")}</div>
1508
+ <div class="grid">${li.map(_R).join("")}</div>
1483
1509
  <h2>Recent Activity</h2>
1484
1510
  ${hR(e.recent_runs)}
1485
1511
  <section class="metric">
@@ -1504,7 +1530,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1504
1530
  <label>Slug<input name="slug" placeholder="my-document" required></label>
1505
1531
  <label>Output directory<input name="output_dir" value="drafts"></label>
1506
1532
  <button type="submit">Start Document Wizard</button>
1507
- </form>`:Vh(n,"/layman/start/newspaper")}function Xh(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 wR(t,e,r){let n=await t.req.parseBody(),s=Zh(e,n);if(s===null)return t.html(Ne("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(Ne("Start workflow",`<p class="error">${b(Zr(r))} is not loaded.</p>`),400);let i=r==="info-qa"?yR(n):ER(n);if(typeof i=="string")return t.html(Ne("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 gr({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 yR(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 ER(t){let e=Be(t.task_description).trim(),r=FR(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 bR(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${b(Zr(r))}</h1>
1533
+ </form>`:Vh(n,"/layman/start/newspaper")}function Xh(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 wR(t,e,r){let n=await t.req.parseBody(),s=Zh(e,n);if(s===null)return t.html(Ne("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(Ne("Start workflow",`<p class="error">${b(Zr(r))} is not loaded.</p>`),400);let i=r==="info-qa"?yR(n):ER(n);if(typeof i=="string")return t.html(Ne("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 hr({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 yR(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 ER(t){let e=Be(t.task_description).trim(),r=FR(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 bR(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${b(Zr(r))}</h1>
1508
1534
  <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${vR(t,e,r)}`;let s=zh(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${TR(e,s)}`:`${n}<section hx-get="/layman/run/${b(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1509
1535
  <h2>Running</h2>
1510
1536
  <p class="muted">Current stage: <strong>${b(e.current_state??"starting")}</strong></p>
@@ -1520,13 +1546,13 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1520
1546
  <button type="submit" name="done" value="false">Send response</button>
1521
1547
  <button type="submit" name="done" value="true">Done with this stage</button>
1522
1548
  </form>
1523
- </section>`}async function SR(t,e){let r=ii(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(Ne("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(kR(e,a.run.id),await gr({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Ne("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function kR(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(!vc(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>vc(i)&&i.name===r.current_state&&typeof i.id=="string");vc(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function vR(t,e,r){let n=MR(e.terminal_state);return`<section class="metric terminal-run">
1549
+ </section>`}async function SR(t,e){let r=ai(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(Ne("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(kR(e,a.run.id),await hr({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Ne("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function kR(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(!vc(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>vc(i)&&i.name===r.current_state&&typeof i.id=="string");vc(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function vR(t,e,r){let n=MR(e.terminal_state);return`<section class="metric terminal-run">
1524
1550
  <h2>${n?"Complete":"Stopped"}</h2>
1525
1551
  <p>Status: <strong>${b(e.terminal_state)}</strong></p>
1526
1552
  ${n?IR(t,e,r):$R(e)}
1527
1553
  <h2>Stage Log</h2>
1528
1554
  ${Gh(e)}
1529
- </section>`}function IR(t,e,r){if(r==="info-qa"){let n=Nc(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${$c(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return NR(t,e);if(r==="newspaper"){let n=Nc(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${$c(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function NR(t,e){let r=ur(t,e.id),n=kc(r,["render_docx"]),s=kc(r,["render_xlsx"]),o=Nc(e,["review:coder[0]_transcript","chat_output_md"])??jR(kc(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>
1555
+ </section>`}function IR(t,e,r){if(r==="info-qa"){let n=Nc(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${$c(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return NR(t,e);if(r==="newspaper"){let n=Nc(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${$c(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function NR(t,e){let r=cr(t,e.id),n=kc(r,["render_docx"]),s=kc(r,["render_xlsx"]),o=Nc(e,["review:coder[0]_transcript","chat_output_md"])??jR(kc(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>
1530
1556
  <pre>${b(PR(DR(o??"No preview available."),30))}</pre>
1531
1557
  <h3>Downloads</h3>
1532
1558
  ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function $R(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 Nc(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 kc(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function jR(t){if(t===null||!dR(t)||!t.endsWith(".md"))return null;try{return fR(t,"utf8")}catch{return null}}function xR(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
@@ -1543,7 +1569,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1543
1569
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1544
1570
  <label>Output directory<input name="output_dir" value="digests"></label>
1545
1571
  <button type="submit">Create subscription</button>
1546
- </form>`}async function Bh(t,e){let r=await t.req.parseBody(),n=Zh(e,r);if(n===null)return t.html(Ne("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Ne("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(Ne("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Be(r.output_dir).trim()||"digests",schedule:CR(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 qh(t,e){let r=ii(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function AR(t){return ue(["id","project","topics","status","action"],t.map(e=>{let r=UR(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 Kh(t){let e=Yh(t);return{workflows:ai,recent_runs:OR(t),newspaper_subscriptions:e.length}}function RR(t,e){let r=zh(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 OR(t){return t.query(`SELECT r.*, w.name AS workflow_name
1572
+ </form>`}async function Bh(t,e){let r=await t.req.parseBody(),n=Zh(e,r);if(n===null)return t.html(Ne("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Ne("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(Ne("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Be(r.output_dir).trim()||"digests",schedule:CR(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 qh(t,e){let r=ai(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function AR(t){return ue(["id","project","topics","status","action"],t.map(e=>{let r=UR(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 Kh(t){let e=Yh(t);return{workflows:li,recent_runs:OR(t),newspaper_subscriptions:e.length}}function RR(t,e){let r=zh(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 OR(t){return t.query(`SELECT r.*, w.name AS workflow_name
1547
1573
  FROM run r
1548
1574
  JOIN workflow w ON w.id = r.workflow_id
1549
1575
  WHERE w.name IN (${Ic.map(()=>"?").join(",")})
@@ -1553,21 +1579,21 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1553
1579
  JOIN workflow w ON w.id = pw.workflow_id
1554
1580
  JOIN project p ON p.id = pw.project_id
1555
1581
  WHERE w.name = ?
1556
- ORDER BY pw.id DESC`,"newspaper")}function zh(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Zh(t,e){let r=Number(Be(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function CR(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 Hh(t){let e=t.req.param("workflow");return Ic.includes(e)?e:null}function Zr(t){return ai.find(e=>e.name===t)?.title??t}function LR(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function $c(t){return mR.parse(t,{async:!1})}function MR(t){return t==="done"||t==="pr_ready"||t==="merged"}function DR(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function PR(t,e){return t.split(`
1582
+ ORDER BY pw.id DESC`,"newspaper")}function zh(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Zh(t,e){let r=Number(Be(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function CR(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 Hh(t){let e=t.req.param("workflow");return Ic.includes(e)?e:null}function Zr(t){return li.find(e=>e.name===t)?.title??t}function LR(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function $c(t){return mR.parse(t,{async:!1})}function MR(t){return t==="done"||t==="pr_ready"||t==="merged"}function DR(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function PR(t,e){return t.split(`
1557
1583
  `).slice(0,e).join(`
1558
- `)}function FR(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Be(t){return typeof t=="string"?t:""}function UR(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 vc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ii(t,e){return Number(t.req.param(e))}var ai,Ic,Qh=T(()=>{"use strict";Gn();St();ic();ai=[{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."}],Ic=ai.map(t=>t.name)});function BR(t){return t.replace(/^\/+/,"")}function eg(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Qr(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=BR(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 eg(t.userId)&&eg(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${WR}/${t.identityId}/`}function HR(t){return String(Math.max(0,Math.floor(t))).padStart(qR,"0")}function jc(t,e,r){return`${t}${e}${HR(r)}.json`}function li(t,e){return`${t}${e}`}function ci(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 WR,qR,ui=T(()=>{"use strict";WR="mailbox";qR=12});function jt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=di[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=di[a&15]+i,a=a>>4;let l=di[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=di[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 di,fi=T(()=>{"use strict";di="0123456789abcdef"});function Ac(t,e){return!Number.isFinite(t)||t<=0?e:t}function Rc(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 og(t){return t.conversation_id===sg&&GR(t.payload)}function GR(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function VR(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:og(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var tg,rg,ng,JR,sg,XR,xc,wr,mi=T(()=>{"use strict";ui();fi();tg=3e3,rg=1e4,ng=12e3,JR=1e3,sg="__lmctl_heartbeat__",XR={kind:"heartbeat"},xc={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},wr=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=Qr({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=Ac(e.readIntervalMs??e.pollIntervalMs??tg,tg),this.heartbeatIdleMs=Ac(e.heartbeatIdleMs??rg,rg),this.backoffReadIntervalMs=Ac(e.backoffReadIntervalMs??e.pollIntervalMs??ng,ng)}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??xc;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=li(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:JR,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=ci(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=jc(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??xc;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=jc(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(Rc(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),og(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=VR(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??xc;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(sg,XR)}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 KR}from"@hono/node-server/conninfo";function ig(t,e){let r=e.bucket??YR,n=e.remoteAddressOf??(o=>ZR(o)),s=o=>{let i=n(o);return QR(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=Oc(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 Rc(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Cc(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Oc(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:Cc(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=Oc(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=zR(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:Cc(d)},500)}})}function Oc(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 zR(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function ZR(t){try{return KR(t).remote.address}catch{return}}function QR(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Cc(t){return t instanceof Error?t.message:String(t)}var YR,ag=T(()=>{"use strict";mi();YR="local"});function lg(t,e){t.get("/mailbox/workspace",r=>rO(r,e)),t.get("/mailbox/projects",r=>nO(r,e)),t.get("/mailbox/projects/:id",r=>sO(r,e)),t.post("/mailbox/projects",r=>oO(r,e)),t.patch("/mailbox/projects/:id",r=>iO(r,e)),t.delete("/mailbox/projects/:id",r=>aO(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>lO(r,e)),t.get("/mailbox/prompts/:id",r=>cO(r,e))}function rO(t,e){e.dal.ensureWorkspace({id:tn,name:Lc});let r=cg(e.dal),n={id:tn,name:Lc,created_at:tO,projects:r};return t.json({workspace:n})}function nO(t,e){return t.json({projects:cg(e.dal)})}function sO(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(en)){let s=Mc(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:hi(s)})}let n=dg(e.dal,r);return n===null?t.json({project:null},404):t.json({project:ug(n)})}async function oO(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:tn,name:Lc});let s=e.dal.insertWebProject({workspace_id:tn,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:hi(s)},201)}async function iO(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(en)){let o=Mc(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:hi(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(en)){let n=Mc(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 lO(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=`${eO}${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 uO({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:`${_i}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function cO(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=dO(e.dal,r);return t.json({result:n})}function cg(t){let e=t.listProjects().map(ug),r=t.listWebProjectsActive(tn).map(hi);return[...e,...r].sort(bO)}function ug(t){return{id:`${_i}${t.id}`,workspace_id:tn,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 hi(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:`${en}${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 Mc(t,e){if(!e.startsWith(en))return null;let r=e.slice(en.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function dg(t,e){if(e.startsWith(_i)){let n=e.slice(_i.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 uO(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Vl(),Pp));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function dO(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=wO(t,o?.team_id??null),a=gO(s),l=yO(n,a,i.length>0),c=EO(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:fO(t,o.workflow_name),d=u.totalEstimatedMs,f=fg(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:mO(t,s.id),g=pO(s,a,h,u.perStep,i),_=_O(h,u.perStep),y=hO(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,...pi(d,f),...y},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,...pi(d,f),...y},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,...pi(d,f),...y},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,...pi(d,f),...y},errors_json:null,duration_ms:c}}function fO(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 mO(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=fg(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 _O(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 hO(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 fg(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function pi(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function gO(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 wO(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 yO(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 EO(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 bO(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 _i,en,eO,tn,Lc,tO,mg=T(()=>{"use strict";_i="project:",en="web_project:",eO="prompt:",tn="default",Lc="Default workspace",tO=new Date(0).toISOString()});import{Buffer as pg}from"node:buffer";function _g(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 hg(t){return kO[t]}function gg(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 TO,SO,gi,kO,Dc=T(()=>{"use strict";TO=1e4,SO=256*1024,gi=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=_g(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,TO),this.pushByteCap=_g(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,SO),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 FR(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Be(t){return typeof t=="string"?t:""}function UR(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 vc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ai(t,e){return Number(t.req.param(e))}var li,Ic,Qh=T(()=>{"use strict";Gn();St();ic();li=[{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."}],Ic=li.map(t=>t.name)});function BR(t){return t.replace(/^\/+/,"")}function eg(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Qr(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=BR(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 eg(t.userId)&&eg(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${WR}/${t.identityId}/`}function HR(t){return String(Math.max(0,Math.floor(t))).padStart(qR,"0")}function jc(t,e,r){return`${t}${e}${HR(r)}.json`}function ci(t,e){return`${t}${e}`}function ui(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 WR,qR,di=T(()=>{"use strict";WR="mailbox";qR=12});function jt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=fi[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=fi[a&15]+i,a=a>>4;let l=fi[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=fi[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 fi,mi=T(()=>{"use strict";fi="0123456789abcdef"});function Ac(t,e){return!Number.isFinite(t)||t<=0?e:t}function Rc(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 og(t){return t.conversation_id===sg&&GR(t.payload)}function GR(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function VR(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:og(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var tg,rg,ng,JR,sg,XR,xc,gr,pi=T(()=>{"use strict";di();mi();tg=3e3,rg=1e4,ng=12e3,JR=1e3,sg="__lmctl_heartbeat__",XR={kind:"heartbeat"},xc={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},gr=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=Qr({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=Ac(e.readIntervalMs??e.pollIntervalMs??tg,tg),this.heartbeatIdleMs=Ac(e.heartbeatIdleMs??rg,rg),this.backoffReadIntervalMs=Ac(e.backoffReadIntervalMs??e.pollIntervalMs??ng,ng)}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??xc;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=ci(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:JR,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=ui(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=jc(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??xc;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=jc(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(Rc(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),og(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=VR(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??xc;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(sg,XR)}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 KR}from"@hono/node-server/conninfo";function ig(t,e){let r=e.bucket??YR,n=e.remoteAddressOf??(o=>ZR(o)),s=o=>{let i=n(o);return QR(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=Oc(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 Rc(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Cc(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Oc(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:Cc(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=Oc(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=zR(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:Cc(d)},500)}})}function Oc(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 zR(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function ZR(t){try{return KR(t).remote.address}catch{return}}function QR(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Cc(t){return t instanceof Error?t.message:String(t)}var YR,ag=T(()=>{"use strict";pi();YR="local"});function lg(t,e){t.get("/mailbox/workspace",r=>rO(r,e)),t.get("/mailbox/projects",r=>nO(r,e)),t.get("/mailbox/projects/:id",r=>sO(r,e)),t.post("/mailbox/projects",r=>oO(r,e)),t.patch("/mailbox/projects/:id",r=>iO(r,e)),t.delete("/mailbox/projects/:id",r=>aO(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>lO(r,e)),t.get("/mailbox/prompts/:id",r=>cO(r,e))}function rO(t,e){e.dal.ensureWorkspace({id:tn,name:Lc});let r=cg(e.dal),n={id:tn,name:Lc,created_at:tO,projects:r};return t.json({workspace:n})}function nO(t,e){return t.json({projects:cg(e.dal)})}function sO(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(en)){let s=Mc(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:gi(s)})}let n=dg(e.dal,r);return n===null?t.json({project:null},404):t.json({project:ug(n)})}async function oO(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:tn,name:Lc});let s=e.dal.insertWebProject({workspace_id:tn,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:gi(s)},201)}async function iO(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(en)){let o=Mc(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:gi(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(en)){let n=Mc(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 lO(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=`${eO}${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 uO({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:`${hi}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function cO(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=dO(e.dal,r);return t.json({result:n})}function cg(t){let e=t.listProjects().map(ug),r=t.listWebProjectsActive(tn).map(gi);return[...e,...r].sort(bO)}function ug(t){return{id:`${hi}${t.id}`,workspace_id:tn,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 gi(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:`${en}${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 Mc(t,e){if(!e.startsWith(en))return null;let r=e.slice(en.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function dg(t,e){if(e.startsWith(hi)){let n=e.slice(hi.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 uO(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Vl(),Pp));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function dO(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=wO(t,o?.team_id??null),a=gO(s),l=yO(n,a,i.length>0),c=EO(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:fO(t,o.workflow_name),d=u.totalEstimatedMs,f=fg(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:mO(t,s.id),g=pO(s,a,h,u.perStep,i),_=_O(h,u.perStep),y=hO(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,..._i(d,f),...y},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,..._i(d,f),...y},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,..._i(d,f),...y},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,..._i(d,f),...y},errors_json:null,duration_ms:c}}function fO(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 mO(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=fg(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 _O(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 hO(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 fg(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function _i(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function gO(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 wO(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 yO(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 EO(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 bO(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 hi,en,eO,tn,Lc,tO,mg=T(()=>{"use strict";hi="project:",en="web_project:",eO="prompt:",tn="default",Lc="Default workspace",tO=new Date(0).toISOString()});import{Buffer as pg}from"node:buffer";function _g(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 hg(t){return kO[t]}function gg(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 TO,SO,wi,kO,Dc=T(()=>{"use strict";TO=1e4,SO=256*1024,wi=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=_g(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,TO),this.pushByteCap=_g(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,SO),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
1559
1585
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1560
- `,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)}};kO={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 yg(t,e){t.post("/mailbox/terminal/launch",r=>vO(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>IO(r,e)),t.get("/mailbox/terminal/sessions",r=>NO(r,e))}async function vO(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"||!wg.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=hg(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 IO(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||!wg.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 NO(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 wg,Eg=T(()=>{"use strict";Dc();wg=/^[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 $O}from"node:buffer";function AO(t){try{return $O.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function bg(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 Tg(t){return RO[t]}function Sg(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 jO,xO,wi,RO,Pc=T(()=>{"use strict";jO=2e3,xO=64*1024,wi=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=bg(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,jO),this.pushByteCap=bg(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,xO),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=AO(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")))})}};RO={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 vg(t,e){t.post("/mailbox/chat/launch",r=>OO(r,e)),t.post("/mailbox/chat/end/:session_id",r=>CO(r,e)),t.get("/mailbox/chat/sessions",r=>LO(r,e))}async function OO(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"||!kg.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=Sg(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Tg(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 CO(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||!kg.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 LO(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 kg,Ig=T(()=>{"use strict";Pc();kg=/^[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 MO}from"node:fs";function $g(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Ng(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=MO(e.path,{encoding:"utf8"});return Ng(r)}catch{return[]}}function Ng(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 jg=T(()=>{"use strict"});function xg(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 yi(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)}};kO={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 yg(t,e){t.post("/mailbox/terminal/launch",r=>vO(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>IO(r,e)),t.get("/mailbox/terminal/sessions",r=>NO(r,e))}async function vO(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"||!wg.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=hg(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 IO(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||!wg.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 NO(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 wg,Eg=T(()=>{"use strict";Dc();wg=/^[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 $O}from"node:buffer";function AO(t){try{return $O.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function bg(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 Tg(t){return RO[t]}function Sg(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 jO,xO,yi,RO,Pc=T(()=>{"use strict";jO=2e3,xO=64*1024,yi=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=bg(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,jO),this.pushByteCap=bg(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,xO),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=AO(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")))})}};RO={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 vg(t,e){t.post("/mailbox/chat/launch",r=>OO(r,e)),t.post("/mailbox/chat/end/:session_id",r=>CO(r,e)),t.get("/mailbox/chat/sessions",r=>LO(r,e))}async function OO(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"||!kg.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=Sg(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Tg(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 CO(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||!kg.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 LO(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 kg,Ig=T(()=>{"use strict";Pc();kg=/^[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 MO}from"node:fs";function $g(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Ng(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=MO(e.path,{encoding:"utf8"});return Ng(r)}catch{return[]}}function Ng(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 jg=T(()=>{"use strict"});function xg(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 Ei(t,e){let r=t.query(`SELECT id, kind FROM attention
1561
1587
  WHERE run_id = ?
1562
1588
  AND acknowledged_at IS NULL
1563
1589
  AND requires_user = 1
1564
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Ei=T(()=>{"use strict"});function Ug(t,e){t.all("/runtime/*",r=>DO(r.req.raw,e))}async function DO(t,e){try{return Response.json(await PO(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 PO(t,e){let r=new URL(t.url),n=JO(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Fc(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return bi(t,n.id,s[2]),FO(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){bi(t,n.id,s[2]);let o=Rg(e.dal,s[4]);return Ag(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Fc(t),e.dal.listTeams().map(o=>HO(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=Og(e.dal,Cg(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 Mg(t,n.id,i.context),Lg(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=Og(e.dal,Cg(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");Mg(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 Lg(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){bi(t,n.id,s[2]);let o=Rg(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 BO(e.dal,o,a),Ag(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Vn(t,n.id),e.dal.listWorkflows().map(o=>XO(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Vn(t,n.id);let o=VO(e.dal,s[2]);return GO(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Vn(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 KO(e.dal,o,i).map(l=>Pg(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Vn(t,n.id);let o=Dg(e.dal,s[2]);return Pg(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Vn(t,n.id);let o=Dg(e.dal,s[2]),i=zO(e.dal,o);return{runId:Hc(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function FO(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>Wg(t,e,r))}}function Ag(t,e,r){let n=Wg(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:UO(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:WO(t,r)}}function Wg(t,e,r){let n=Bg(t,r.id),s=Wc(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 UO(t,e){let r=Bg(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:Wc(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 WO(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 BO(t,e,r){let n=qO(t,e.id);if(n!==null){let s=yi(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=ut(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 Bg(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 qO(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 Wc(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 Rg(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function Og(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 Cg(t){return t.startsWith("team:")?t.slice(5):t}function HO(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function Lg(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??Fg}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function JO(t){let e=t.workspaceName??un()??er.default;return{id:e,name:e}}function Fc(t){if(t.headers.get("x-lmctl-workspace-id")!==Fg)throw new se(400,"runtime request requires global-admin workspace identity")}function bi(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 Vn(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 Mg(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");bi(t,e,r.workspaceId);return}Fc(t)}function Bc(t){return`${rn}${qc(t.name)}`}function qc(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Hc(t){return`${Uc}${t.id}`}function XO(t){let e=Ti(t.definition);return{id:Bc(t),name:t.name,...e.description===null?{}:{description:e.description}}}function GO(t){let e=Ti(t.definition);return{id:Bc(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Ti(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 VO(t,e){if(!e.startsWith(rn))throw new se(404,`template not found: ${e}`);let r=e.slice(rn.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 Dg(t,e){if(!e.startsWith(Uc))throw new se(404,`run not found: ${e}`);let r=e.slice(Uc.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 KO(t,e,r){if(r!==null){if(!r.startsWith(rn))return[];let s=r.slice(rn.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 Pg(t,e){let r=t.getWorkflow(e.workflow_id),n=Wc(e),s=YO(r,e);return{id:Hc(e),templateId:r===null?`${rn}unknown`:Bc(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 YO(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]:[Ti(t.definition).nameToId.get(r)??r]}function zO(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Ti(r.definition),s=c=>n.nameToId.get(c)??c,o=Hc(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=ZO(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 ZO(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 Fg,rn,Uc,se,qg=T(()=>{"use strict";qe();Ei();St();Fg="global-admin";rn="template:",Uc="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as QO,writeFileSync as eC}from"node:fs";import{randomUUID as Hg}from"node:crypto";import{dirname as tC,resolve as Si,sep as Jg}from"node:path";async function Gg(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(!iC(n))return t.text("missing image file",400);if(n.size>rC)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=aC(s);if(o===null||!(o in Xg))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=nC(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Si(oC()):Si(i.local_path),l=Si(a,"uploads",Hg()),c=Si(l,`${Hg()}${Xg[o]}`);if(!sC(c,a))return t.text("invalid upload path",400);QO(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);eC(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function nC(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function sC(t,e){let r=e.endsWith(Jg)?e:`${e}${Jg}`;return t.startsWith(r)}function oC(){return tC(de())}function iC(t){return typeof File<"u"&&t instanceof File}function aC(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 rC,Xg,Vg=T(()=>{"use strict";qe();rC=10*1024*1024,Xg={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ki}from"node:fs";import{basename as lC,dirname as cC,extname as uC,isAbsolute as dC,join as fC,relative as mC}from"node:path";import{fileURLToPath as pC}from"node:url";import{Hono as _C}from"hono";import{serveStatic as ft}from"@hono/node-server/serve-static";function tw(t){let e=new _C,r=[],n=t.localWebui!==void 0?Xc(t.localWebui.webuiDir):hC();if(t.localWebui!==void 0&&ig(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=gC();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,ft({root:n})),e.use("/vendor/*",s,ft({root:n})),e.use("/src/*",s,ft({root:n})),e.get("/",s,ft({root:n,path:"index.html"})),e.get("/admin",s,ft({root:n,path:"index.html"})),e.get("/admin/*",s,ft({root:n,path:"index.html"})),e.get("/terminal",s,ft({root:n,path:"index.html"})),e.get("/terminal/*",s,ft({root:n,path:"index.html"})),e.get("/chat",s,ft({root:n,path:"index.html"})),e.get("/chat/*",s,ft({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("*",Jp()),e.get("/login",s=>s.html(Ne("Login",`
1590
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var bi=T(()=>{"use strict"});function Ug(t,e){t.all("/runtime/*",r=>DO(r.req.raw,e))}async function DO(t,e){try{return Response.json(await PO(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 PO(t,e){let r=new URL(t.url),n=JO(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Fc(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Ti(t,n.id,s[2]),FO(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Ti(t,n.id,s[2]);let o=Rg(e.dal,s[4]);return Ag(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Fc(t),e.dal.listTeams().map(o=>HO(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=Og(e.dal,Cg(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 Mg(t,n.id,i.context),Lg(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=Og(e.dal,Cg(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");Mg(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 Lg(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Ti(t,n.id,s[2]);let o=Rg(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 BO(e.dal,o,a),Ag(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Vn(t,n.id),e.dal.listWorkflows().map(o=>XO(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Vn(t,n.id);let o=VO(e.dal,s[2]);return GO(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Vn(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 KO(e.dal,o,i).map(l=>Pg(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Vn(t,n.id);let o=Dg(e.dal,s[2]);return Pg(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Vn(t,n.id);let o=Dg(e.dal,s[2]),i=zO(e.dal,o);return{runId:Hc(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function FO(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>Wg(t,e,r))}}function Ag(t,e,r){let n=Wg(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:UO(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:WO(t,r)}}function Wg(t,e,r){let n=Bg(t,r.id),s=Wc(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 UO(t,e){let r=Bg(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:Wc(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 WO(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 BO(t,e,r){let n=qO(t,e.id);if(n!==null){let s=Ei(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 Bg(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 qO(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 Wc(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 Rg(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function Og(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 Cg(t){return t.startsWith("team:")?t.slice(5):t}function HO(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function Lg(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??Fg}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function JO(t){let e=t.workspaceName??un()??Qt.default;return{id:e,name:e}}function Fc(t){if(t.headers.get("x-lmctl-workspace-id")!==Fg)throw new se(400,"runtime request requires global-admin workspace identity")}function Ti(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 Vn(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 Mg(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Ti(t,e,r.workspaceId);return}Fc(t)}function Bc(t){return`${rn}${qc(t.name)}`}function qc(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Hc(t){return`${Uc}${t.id}`}function XO(t){let e=Si(t.definition);return{id:Bc(t),name:t.name,...e.description===null?{}:{description:e.description}}}function GO(t){let e=Si(t.definition);return{id:Bc(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Si(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 VO(t,e){if(!e.startsWith(rn))throw new se(404,`template not found: ${e}`);let r=e.slice(rn.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 Dg(t,e){if(!e.startsWith(Uc))throw new se(404,`run not found: ${e}`);let r=e.slice(Uc.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 KO(t,e,r){if(r!==null){if(!r.startsWith(rn))return[];let s=r.slice(rn.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 Pg(t,e){let r=t.getWorkflow(e.workflow_id),n=Wc(e),s=YO(r,e);return{id:Hc(e),templateId:r===null?`${rn}unknown`:Bc(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 YO(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]:[Si(t.definition).nameToId.get(r)??r]}function zO(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Si(r.definition),s=c=>n.nameToId.get(c)??c,o=Hc(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=ZO(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 ZO(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 Fg,rn,Uc,se,qg=T(()=>{"use strict";qe();bi();St();Fg="global-admin";rn="template:",Uc="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as QO,writeFileSync as eC}from"node:fs";import{randomUUID as Hg}from"node:crypto";import{dirname as tC,resolve as ki,sep as Jg}from"node:path";async function Gg(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(!iC(n))return t.text("missing image file",400);if(n.size>rC)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=aC(s);if(o===null||!(o in Xg))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=nC(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?ki(oC()):ki(i.local_path),l=ki(a,"uploads",Hg()),c=ki(l,`${Hg()}${Xg[o]}`);if(!sC(c,a))return t.text("invalid upload path",400);QO(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);eC(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function nC(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function sC(t,e){let r=e.endsWith(Jg)?e:`${e}${Jg}`;return t.startsWith(r)}function oC(){return tC(de())}function iC(t){return typeof File<"u"&&t instanceof File}function aC(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 rC,Xg,Vg=T(()=>{"use strict";qe();rC=10*1024*1024,Xg={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as vi}from"node:fs";import{basename as lC,dirname as cC,extname as uC,isAbsolute as dC,join as fC,relative as mC}from"node:path";import{fileURLToPath as pC}from"node:url";import{Hono as _C}from"hono";import{serveStatic as dt}from"@hono/node-server/serve-static";function tw(t){let e=new _C,r=[],n=t.localWebui!==void 0?Xc(t.localWebui.webuiDir):hC();if(t.localWebui!==void 0&&ig(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=gC();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("*",Jp()),e.get("/login",s=>s.html(Ne("Login",`
1565
1591
  <h1>Login</h1>
1566
1592
  <form method="post" action="/login">
1567
1593
  <label>Token <input name="token" type="password"></label>
1568
1594
  <button type="submit">Login</button>
1569
1595
  </form>
1570
- `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return Gp(i)?(ec(s,i),s.redirect("/",302)):s.html(Ne("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Vp(s),s.redirect("/login",302))),Jh(e,{dal:t.dal}),Ug(e,{dal:t.dal}),lg(e,{dal:t.dal}),yg(e,{terminalSessionManager:t.terminalSessionManager}),vg(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=vn(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 il(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>`)}),t_(e,{dal:t.dal}),l_(e,{dal:t.dal}),e.get("/api/status",s=>U(s,Zs(t.dal),kC)),e.get("/api/projects",s=>U(s,Qs(t.dal),vC)),e.get("/api/teams",s=>U(s,hm(t.dal),$C)),e.get("/api/workflows",s=>U(s,eo(t.dal),jC)),e.get("/api/workflows/verify",s=>{let o=jh();return s.req.header("accept")?.includes("text/plain")?s.text(Ah(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,gm(t.dal,{status:s.req.query("status")}),xC)),e.post("/api/uploads",s=>Gg(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=to(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(()=>(Gn(),Wh)),i=to(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),IC)}),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 nn(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=EC(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=Yg(s.req.query("status"),bC);if(typeof i=="string")return s.text(i,400);let a=Yg(s.req.query("severity"),nw);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")}:{}}),NC)}),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 nn(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=TC(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=SC(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 nn(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 nn(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 nn(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 nn(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=ur(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=ur(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=wC(l.path);if(yC(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=lC(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,Cr(t.dal,{limit:Jc(s,"limit")??100}),AC)),e.get("/api/runs/:id",s=>{let o=cr(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,RC)}),e.get("/api/runs/:id/where",s=>{let o=Lr(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(no(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=so(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(oo(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?(vi(t.daemon),U(s,i,zg)):U(s,i,zg,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?(vi(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=>Kg(s,t.dal,o=>U(s,o,CC))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=bm(t.dal,Q(s,"id"),Q(s,"step_id"));return o===null?s.notFound():rw(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=>Kg(s,t.dal,o=>{let i=$g(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,Tm(t.dal,{type:s.req.query("type")}),LC)),e.get("/api/external-signals",s=>U(s,Sm(t.dal,{unhandled:s.req.query("unhandled")==="true"}),MC)),e.get("/api/attentions",s=>U(s,Bt(t.dal,{unacked:s.req.query("unacked")==="true"}),DC)),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=ro(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=ut(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=ut(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);vi(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 vi(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=wm(t.dal,{status:i,pr_url:o});return U(s,a,PC)}),e.get("/api/submitted-prs/:id",s=>{let o=Q(s,"id"),i=ym(t.dal,o);return i===null?s.notFound():U(s,i,FC)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),Zg)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=vn(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),Zg)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=vn(s.req.param("team_name"));try{let i=await cm(t.dal,o,s.req.param("alias"));return U(s,i,a=>Qg("compacted",a.row))}catch(i){if(i instanceof kn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=vn(s.req.param("team_name")),i=await il(t.dal,o,s.req.param("alias"));return U(s,i,a=>Qg(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,ew)),e.post("/api/intake/scan",async s=>(r=await Gr(t.dal),U(s,r,ew))),e.get("/api/stats/run-throughput",s=>U(s,Im(t.dal),UC)),e.get("/api/daemon/state",s=>U(s,t.daemon?.state??null,WC)),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=ml(t.dal,o),l=pl(t.dal,{project_id:o});return s.html(Ne(`Metrics \u2014 ${i.name}`,BC(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=Jc(s,"since_days");return s.json(ml(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=Jc(s,"since_days");return s.json(pl(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 Kg(t,e,r){let n=fl(e,Q(t,"id"),Q(t,"step_id"));return n===null?t.notFound():r(n)}function vi(t){t!==void 0&&t.runCycle().catch(()=>{})}function U(t,e,r,n=200){return rw(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 rw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function hC(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ki(`${t}/index.html`)?Xc(t):null;let e="src/serve/webui-dist";if(ki(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(ki(`${r}/index.html`))return r;let n=fC(cC(pC(import.meta.url)),"webui-dist");return ki(`${n}/index.html`)?Xc(n):null}function Xc(t){if(!dC(t))return t;let e=mC(process.cwd(),t);return e.length===0?".":e}function gC(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function Q(t,e){return Number(t.req.param(e))}function Jc(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 wC(t){switch(uC(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 yC(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function nn(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 EC(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 Yg(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 TC(t){if(t!=null)return typeof t=="string"&&nw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function SC(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 kC(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 Gp(i)?(ec(s,i),s.redirect("/",302)):s.html(Ne("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Vp(s),s.redirect("/login",302))),Jh(e,{dal:t.dal}),Ug(e,{dal:t.dal}),lg(e,{dal:t.dal}),yg(e,{terminalSessionManager:t.terminalSessionManager}),vg(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=vn(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 il(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>`)}),t_(e,{dal:t.dal}),l_(e,{dal:t.dal}),e.get("/api/status",s=>U(s,Qs(t.dal),kC)),e.get("/api/projects",s=>U(s,eo(t.dal),vC)),e.get("/api/teams",s=>U(s,hm(t.dal),$C)),e.get("/api/workflows",s=>U(s,to(t.dal),jC)),e.get("/api/workflows/verify",s=>{let o=jh();return s.req.header("accept")?.includes("text/plain")?s.text(Ah(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,gm(t.dal,{status:s.req.query("status")}),xC)),e.post("/api/uploads",s=>Gg(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=ro(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(()=>(Gn(),Wh)),i=ro(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),IC)}),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 nn(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{qt(u)}catch{return s.text("invalid condition",400)}let d=EC(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=Yg(s.req.query("status"),bC);if(typeof i=="string")return s.text(i,400);let a=Yg(s.req.query("severity"),nw);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")}:{}}),NC)}),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 nn(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=TC(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=SC(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 nn(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 nn(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 nn(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 nn(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=cr(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=cr(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=wC(l.path);if(yC(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=lC(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,Cr(t.dal,{limit:Jc(s,"limit")??100}),AC)),e.get("/api/runs/:id",s=>{let o=lr(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,RC)}),e.get("/api/runs/:id/where",s=>{let o=Lr(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(so(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=oo(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(io(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?(Ii(t.daemon),U(s,i,zg)):U(s,i,zg,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?(Ii(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=>Kg(s,t.dal,o=>U(s,o,CC))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=bm(t.dal,Q(s,"id"),Q(s,"step_id"));return o===null?s.notFound():rw(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=>Kg(s,t.dal,o=>{let i=$g(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,Tm(t.dal,{type:s.req.query("type")}),LC)),e.get("/api/external-signals",s=>U(s,Sm(t.dal,{unhandled:s.req.query("unhandled")==="true"}),MC)),e.get("/api/attentions",s=>U(s,Wt(t.dal,{unacked:s.req.query("unacked")==="true"}),DC)),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=no(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=Wt(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);Ii(t.daemon);let p=Wt(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 Ii(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=wm(t.dal,{status:i,pr_url:o});return U(s,a,PC)}),e.get("/api/submitted-prs/:id",s=>{let o=Q(s,"id"),i=ym(t.dal,o);return i===null?s.notFound():U(s,i,FC)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),Zg)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=vn(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),Zg)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=vn(s.req.param("team_name"));try{let i=await cm(t.dal,o,s.req.param("alias"));return U(s,i,a=>Qg("compacted",a.row))}catch(i){if(i instanceof kn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=vn(s.req.param("team_name")),i=await il(t.dal,o,s.req.param("alias"));return U(s,i,a=>Qg(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,ew)),e.post("/api/intake/scan",async s=>(r=await Gr(t.dal),U(s,r,ew))),e.get("/api/stats/run-throughput",s=>U(s,Im(t.dal),UC)),e.get("/api/daemon/state",s=>U(s,t.daemon?.state??null,WC)),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=ml(t.dal,o),l=pl(t.dal,{project_id:o});return s.html(Ne(`Metrics \u2014 ${i.name}`,BC(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=Jc(s,"since_days");return s.json(ml(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=Jc(s,"since_days");return s.json(pl(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 Kg(t,e,r){let n=fl(e,Q(t,"id"),Q(t,"step_id"));return n===null?t.notFound():r(n)}function Ii(t){t!==void 0&&t.runCycle().catch(()=>{})}function U(t,e,r,n=200){return rw(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 rw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function hC(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return vi(`${t}/index.html`)?Xc(t):null;let e="src/serve/webui-dist";if(vi(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(vi(`${r}/index.html`))return r;let n=fC(cC(pC(import.meta.url)),"webui-dist");return vi(`${n}/index.html`)?Xc(n):null}function Xc(t){if(!dC(t))return t;let e=mC(process.cwd(),t);return e.length===0?".":e}function gC(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function Q(t,e){return Number(t.req.param(e))}function Jc(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 wC(t){switch(uC(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 yC(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function nn(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 EC(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 Yg(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 TC(t){if(t!=null)return typeof t=="string"&&nw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function SC(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 kC(t){return`<h1>Status</h1><div class="grid">
1571
1597
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
1572
1598
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
1573
1599
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
@@ -1601,7 +1627,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1601
1627
  <dt>submitted_at</dt><dd>${b(t.submitted_at)}</dd>
1602
1628
  <dt>last_scanned_at</dt><dd>${b(t.last_scanned_at??"\u2014")}</dd>
1603
1629
  <dt>last_known_state</dt><dd>${b(t.last_known_state??"\u2014")}</dd>
1604
- </dl>`}function Zg(t){return`<h1>Sessions</h1>${ue(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=Gs(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 Qg(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 ew(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 WC(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 BC(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 Zg(t){return`<h1>Sessions</h1>${ue(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=Vs(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 Qg(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 ew(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 WC(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 BC(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>
1605
1631
  <h2>Request-changes rate</h2>
1606
1632
  <p>Total: ${b(n.request_changes)} of ${b(n.total)} steps (${b(n.rate_pct)})</p>
1607
1633
  ${ue(["state","total steps","request_changes","rate"],s)}
@@ -1610,32 +1636,32 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1610
1636
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
1611
1637
  ${ue(["state","retried runs","avg attempts"],i)}
1612
1638
  <h2>Tool efficacy</h2>
1613
- ${ue(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var bC,nw,sw=T(()=>{"use strict";Fo();Br();Yp();r_();c_();St();ic();Qh();ag();mg();Eg();Ig();jg();qg();Vs();Vg();ri();bC=["open","assigned","closed","reopened"],nw=["low","medium","high","critical"]});function qC(t){return Math.floor(t/6e4)*6e4}function HC(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)JC(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function JC(t,e){let r=Date.now(),n=qC(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 ow(t,e=250){let r=setInterval(()=>{try{HC(t)}catch{}},e);return{stop(){clearInterval(r)}}}var iw=T(()=>{"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 bC,nw,sw=T(()=>{"use strict";Uo();Br();Yp();r_();c_();St();ic();Qh();ag();mg();Eg();Ig();jg();qg();Ks();Vg();ni();bC=["open","assigned","closed","reopened"],nw=["low","medium","high","critical"]});function qC(t){return Math.floor(t/6e4)*6e4}function HC(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)JC(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function JC(t,e){let r=Date.now(),n=qC(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 ow(t,e=250){let r=setInterval(()=>{try{HC(t)}catch{}},e);return{stop(){clearInterval(r)}}}var iw=T(()=>{"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
1614
1640
  FROM run r
1615
1641
  JOIN job j ON j.id = r.job_id
1616
1642
  WHERE j.project_id = ?
1617
1643
  AND r.terminal_state IS NOT NULL
1618
1644
  ORDER BY r.id DESC
1619
- 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,XC).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 lw(t){for(let e of VC)try{e(t)}catch{}}var XC,aw,VC,cw=T(()=>{"use strict";XC="request_changes",aw="reviewer_rejection_rate_high";VC=[GC]});function Kn(){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 uw(t){let e=t.intervalMs??Kn(),r=t.runOnceFn??gr,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??ow)(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??al,e,n).finally(()=>{a=null})),a.finally(()=>u(ll(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=KC(t.dal,r,t.collectSessionSizesFn??lm,t.scanIntakeFn??Gr,t.monitorSessionActivityFn??al,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 KC(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(Lh({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=ll(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 Gc=T(()=>{"use strict";Fo();Gn();Sc();Vs();iw();cw();cl()});function fw(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var mw=T(()=>{"use strict"});import{mkdirSync as YC,readFileSync as zC,readdirSync as ZC,statSync as QC,writeFileSync as eL}from"node:fs";import{dirname as tL,join as _w,sep as pw}from"node:path";function Ii(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case hw:return rL(t,s.input);case gw:return nL(t,s.input);case ww:return sL(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Yc,GetObjectCommand:Kc,PutObjectCommand:Vc}}}function rL(t,e){let r=yw(t,e.Key);return YC(tL(r),{recursive:!0}),eL(r,e.Body),{}}function nL(t,e){let r=yw(t,e.Key),n;try{n=zC(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 sL(t,e){let r=e.Prefix??"";Ew(r);let s=oL(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 yw(t,e){return Ew(e),_w(t,e)}function Ew(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function oL(t){let e=[],r=(n,s)=>{let o;try{o=ZC(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=_w(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:QC(l).mtime})}}};return r(t,""),e}var hw,gw,ww,Vc,Kc,Yc,zc=T(()=>{"use strict";hw="localfs-put",gw="localfs-get",ww="localfs-list",Vc=class{input;_localfsTag=hw;constructor(e){this.input=e}},Kc=class{input;_localfsTag=gw;constructor(e){this.input=e}},Yc=class{input;_localfsTag=ww;constructor(e){this.input=e}}});function bw(){return{put:0,get:0,list:0}}function Zc(t,e=iL){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Qc(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var iL,Ni,eu=T(()=>{"use strict";iL={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Ni=class{counts=bw();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=bw(),e}estimateCostUsd(e){return Zc(this.counts,e)}}});function Tw(t){let e=t.now??Date.now,r=t.timers??aL,n=null,s=null;async function o(){let l=e(),c=Qc(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=Zc(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===Qc(e())}}}var aL,Sw=T(()=>{"use strict";eu();aL={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var tu=T(()=>{"use strict";ui();fi();fi()});function lL(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 cL(t){return t.reply_to!==void 0&&t.response!==void 0}function uL(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function kw(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 $i,Yn,vw=T(()=>{"use strict";tu();$i=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Yn=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 $i("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(kw(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(kw(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 $i;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=lL(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(cL(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??uL(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 ru(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 Iw=T(()=>{"use strict"});function nu(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 Nw=T(()=>{"use strict"});function ou(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 su,$w=T(()=>{"use strict";su="daemon:events"});function xw(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 iu(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 jw,au=T(()=>{"use strict";tu();jw="prompt:root"});function zn(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Rw(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function dL(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Rw(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function Aw(t,e=60){if(typeof t!="string"||t==="")return!0;let r=dL(t);return r===null?!0:Date.now()/1e3>=r-e}function Rw(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 lu=T(()=>{"use strict"});async function ji(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":fL},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 fL,cu=T(()=>{"use strict";fL="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Ow,mkdirSync as Cw,readFileSync as Lw,writeFileSync as Mw}from"node:fs";import{homedir as Dw}from"node:os";import{dirname as Pw,join as Fw}from"node:path";function Zn(){return process.env.LMCTL_DEVICE_AUTH_PATH??Fw(Dw(),".lmctl","device-auth.json")}function Uw(){return process.env.LMCTL_TOKEN_PATH??Fw(Dw(),".lmctl","cli-tokens.json")}function uu(t=Zn()){try{let e=JSON.parse(Lw(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 Ww(t,e=Zn()){Cw(Pw(e),{recursive:!0,mode:448}),Mw(e,JSON.stringify(t,null,2));try{Ow(e,384)}catch{}}function du(t,e=Uw()){let r={};try{r=JSON.parse(Lw(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};Cw(Pw(e),{recursive:!0,mode:448}),Mw(e,JSON.stringify(s,null,2));try{Ow(e,384)}catch{}}async function Bw(t){let e=t.deviceAuthPath??Zn(),r=uu(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await ji({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return du({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??Uw()),{idToken:n.idToken,userId:r.userId}}var fu=T(()=>{"use strict";cu()});function qw(t){if(t.length===0||!t.startsWith("---"))throw new mt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1620
- `);if(e[0]!=="---")throw new mt("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 mt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!mL.has(c))throw new mt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${xi.join(", ")}`);r[c]=u}if(n===-1)throw new mt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of xi)if(r[i]===void 0)throw new mt(`missing required frontmatter key "${i}" \u2014 required: ${xi.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 xi,mL,mt,Hw=T(()=>{"use strict";xi=["title","description","members"],mL=new Set(xi),mt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as pL,writeFileSync as d3,renameSync as f3,existsSync as Vw,realpathSync as Kw,statSync as _L}from"node:fs";import{basename as Yw,resolve as yr,dirname as mu}from"node:path";function wL(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 yL(t){return/^\s*_MEMBER_\s+\S/.test(t)}function EL(t){return/^\s*_SESSION_\s+\S/.test(t)}function bL(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function _u(t){let e=Yw(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function $e(t){let e=pL(t,"utf-8"),r=mu(yr(t)),n=hu(e,_u(t),{baseDir:r});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=yr(r,s.sessiondir));return n}function TL(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(!Xw.includes(c)){n.push(`line ${e}: unknown key "${c}" on _CONNECT_ line: ${t.trim()}
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,XC).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 lw(t){for(let e of VC)try{e(t)}catch{}}var XC,aw,VC,cw=T(()=>{"use strict";XC="request_changes",aw="reviewer_rejection_rate_high";VC=[GC]});function Kn(){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 uw(t){let e=t.intervalMs??Kn(),r=t.runOnceFn??hr,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??ow)(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??al,e,n).finally(()=>{a=null})),a.finally(()=>u(ll(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=KC(t.dal,r,t.collectSessionSizesFn??lm,t.scanIntakeFn??Gr,t.monitorSessionActivityFn??al,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 KC(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(Lh({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=ll(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 Gc=T(()=>{"use strict";Uo();Gn();Sc();Ks();iw();cw();cl()});function fw(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var mw=T(()=>{"use strict"});import{mkdirSync as YC,readFileSync as zC,readdirSync as ZC,statSync as QC,writeFileSync as eL}from"node:fs";import{dirname as tL,join as _w,sep as pw}from"node:path";function Ni(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case hw:return rL(t,s.input);case gw:return nL(t,s.input);case ww:return sL(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Yc,GetObjectCommand:Kc,PutObjectCommand:Vc}}}function rL(t,e){let r=yw(t,e.Key);return YC(tL(r),{recursive:!0}),eL(r,e.Body),{}}function nL(t,e){let r=yw(t,e.Key),n;try{n=zC(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 sL(t,e){let r=e.Prefix??"";Ew(r);let s=oL(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 yw(t,e){return Ew(e),_w(t,e)}function Ew(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function oL(t){let e=[],r=(n,s)=>{let o;try{o=ZC(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=_w(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:QC(l).mtime})}}};return r(t,""),e}var hw,gw,ww,Vc,Kc,Yc,zc=T(()=>{"use strict";hw="localfs-put",gw="localfs-get",ww="localfs-list",Vc=class{input;_localfsTag=hw;constructor(e){this.input=e}},Kc=class{input;_localfsTag=gw;constructor(e){this.input=e}},Yc=class{input;_localfsTag=ww;constructor(e){this.input=e}}});function bw(){return{put:0,get:0,list:0}}function Zc(t,e=iL){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Qc(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var iL,$i,eu=T(()=>{"use strict";iL={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};$i=class{counts=bw();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=bw(),e}estimateCostUsd(e){return Zc(this.counts,e)}}});function Tw(t){let e=t.now??Date.now,r=t.timers??aL,n=null,s=null;async function o(){let l=e(),c=Qc(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=Zc(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===Qc(e())}}}var aL,Sw=T(()=>{"use strict";eu();aL={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var tu=T(()=>{"use strict";di();mi();mi()});function lL(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 cL(t){return t.reply_to!==void 0&&t.response!==void 0}function uL(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function kw(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 ji,Yn,vw=T(()=>{"use strict";tu();ji=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Yn=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 ji("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(kw(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(kw(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 ji;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=lL(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(cL(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??uL(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 ru(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 Iw=T(()=>{"use strict"});function nu(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 Nw=T(()=>{"use strict"});function ou(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 su,$w=T(()=>{"use strict";su="daemon:events"});function xw(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 iu(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 jw,au=T(()=>{"use strict";tu();jw="prompt:root"});function zn(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Rw(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function dL(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Rw(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function Aw(t,e=60){if(typeof t!="string"||t==="")return!0;let r=dL(t);return r===null?!0:Date.now()/1e3>=r-e}function Rw(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 lu=T(()=>{"use strict"});async function xi(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":fL},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 fL,cu=T(()=>{"use strict";fL="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Ow,mkdirSync as Cw,readFileSync as Lw,writeFileSync as Mw}from"node:fs";import{homedir as Dw}from"node:os";import{dirname as Pw,join as Fw}from"node:path";function Zn(){return process.env.LMCTL_DEVICE_AUTH_PATH??Fw(Dw(),".lmctl","device-auth.json")}function Uw(){return process.env.LMCTL_TOKEN_PATH??Fw(Dw(),".lmctl","cli-tokens.json")}function uu(t=Zn()){try{let e=JSON.parse(Lw(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 Ww(t,e=Zn()){Cw(Pw(e),{recursive:!0,mode:448}),Mw(e,JSON.stringify(t,null,2));try{Ow(e,384)}catch{}}function du(t,e=Uw()){let r={};try{r=JSON.parse(Lw(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};Cw(Pw(e),{recursive:!0,mode:448}),Mw(e,JSON.stringify(s,null,2));try{Ow(e,384)}catch{}}async function Bw(t){let e=t.deviceAuthPath??Zn(),r=uu(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await xi({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return du({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??Uw()),{idToken:n.idToken,userId:r.userId}}var fu=T(()=>{"use strict";cu()});function qw(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(!mL.has(c))throw new ft(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Ai.join(", ")}`);r[c]=u}if(n===-1)throw new ft("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Ai)if(r[i]===void 0)throw new ft(`missing required frontmatter key "${i}" \u2014 required: ${Ai.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 Ai,mL,ft,Hw=T(()=>{"use strict";Ai=["title","description","members"],mL=new Set(Ai),ft=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as pL,writeFileSync as f3,renameSync as m3,existsSync as Vw,realpathSync as Kw,statSync as _L}from"node:fs";import{basename as Yw,resolve as wr,dirname as mu}from"node:path";function wL(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 yL(t){return/^\s*_MEMBER_\s+\S/.test(t)}function EL(t){return/^\s*_SESSION_\s+\S/.test(t)}function bL(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function _u(t){let e=Yw(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function $e(t){let e=pL(t,"utf-8"),r=mu(wr(t)),n=hu(e,_u(t),{baseDir:r});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=wr(r,s.sessiondir));return n}function TL(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(!Xw.includes(c)){n.push(`line ${e}: unknown key "${c}" on _CONNECT_ line: ${t.trim()}
1621
1647
  allowed keys: ${Xw.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 hu(t,e,r={}){let n=[],s=[],o=[],i=new Set,a=r.baseDir??gL,l=t;if(l.startsWith("#teamfile:")){let d=l.indexOf(`
1622
- `);l=d>=0?l.slice(d+1):""}let c=null;if(l.startsWith("---"))try{c=qw(l)}catch(d){if(d instanceof mt)o.push(`frontmatter: ${d.message}`);else throw d}let u=t.split(`
1623
- `);for(let d=0;d<u.length;d++){let f=u[d],m=d+1;if(EL(f))throw new Error(`line ${m}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${f.trim()})`);if(bL(f)){let{kvs:_,errors:y}=TL(f,m);if(o.push(...y),y.length>0)continue;let k=_.team,v=_.teamfile;if(k||o.push(`line ${m}: _CONNECT_ missing team: ${f.trim()}`),v||o.push(`line ${m}: _CONNECT_ missing teamfile: ${f.trim()}`),!k||!v)continue;if(i.has(k)){o.push(`line ${m}: duplicate _CONNECT_ team "${k}"`);continue}i.add(k);let $=yr(a,v);try{s.push({team:k,teamfile:Kw($)})}catch(S){o.push(`line ${m}: _CONNECT_ teamfile missing/unreadable: ${$}: ${S instanceof Error?S.message:String(S)}`)}continue}if(!yL(f))continue;let p=wL(f);for(let _ of Object.keys(p))if(!Jw.includes(_))throw new Error(`line ${m}: unknown key "${_}" on _MEMBER_ line: ${f.trim()}
1624
- allowed keys: ${Jw.join(", ")}`);if(!p.provider&&!p.teamfile){o.push(`line ${m}: member line missing provider (or teamfile): ${f.trim()}`);continue}let g={alias:p.alias||`member${n.length+1}`,provider:p.provider||"",extra:{}};p.sessionid&&(g.session=p.sessionid),p.sessiondir&&(g.sessiondir=p.sessiondir),p.teamfile&&(g.teamfile=p.teamfile),p.model&&(g.model=p.model),n.push(g)}return{name:e,members:n,connections:s,rawText:t,parseErrors:o,frontmatter:c}}function gu(t,e){let r=[];for(let o of t.parseErrors)r.push({field:o.includes("_CONNECT_")?"connect":"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===pu.toLowerCase());n.length>1&&r.push({field:pu,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?yr(e,o.teamfile):yr(o.teamfile);if(!Vw(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=$e(a),c=it(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 hL.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 it(t){return t.members.find(e=>e.alias.toLowerCase()===pu.toLowerCase())}function wu(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=yr(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),!Vw(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=$e(o),l=it(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return wu(l,mu(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||mu(o),alias:t.alias,resolvedFrom:o,model:l.model}}function Gw(t){let e;try{e=Kw(t)}catch(n){throw new Error(`connect target missing/unreadable: ${t}: ${n instanceof Error?n.message:String(n)}`)}let r=_L(e);return{path:e,key:`${r.dev}:${r.ino}`}}function SL(t){return t.map(e=>Yw(e)).join(" -> ")}function kL(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 Er(t){let e=Gw(yr(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=$e(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=Gw(d.teamfile),m;try{m=$e(f.path)}catch(p){throw new Error(`connect target missing/unreadable: ${d.team} -> ${f.path}: ${p instanceof Error?p.message:String(p)}`)}if(m.parseErrors.length>0)throw new Error(`connect target invalid: ${d.team} -> ${f.path}: ${m.parseErrors.join("; ")}`);if(it(m)===void 0)throw new Error(`connect target has no Lead: ${d.team} -> ${f.path}`);s.push({from:a,to:f,team:d.team}),u.push({target_name:d.team,target_teamfile:f.path}),!l.has(f.key)&&o(f,new Set([...l,f.key]))}}o(e,new Set([e.key]));let i=kL(s);if(i!==null)throw new Error(`connect cycle: ${SL(i)}`);return{root_teamfile:e.path,snapshots:[...n.values()],edges:s}}function Ai(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var pu,hL,gL,Jw,Xw,xt=T(()=>{"use strict";Hw();pu="Lead",hL=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]),gL=process.cwd();Jw=["alias","provider","sessionid","sessiondir","teamfile","model"],Xw=["team","teamfile"]});import{existsSync as vL,realpathSync as IL}from"node:fs";import{dirname as NL}from"node:path";function yu(t){$L(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function $L(t){let e=t.payload.root_teamfile;try{e=IL(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await sn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=jL(e);if("error"in r)return await sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-RL(t.env??process.env)).toISOString()});if(!s.acquired){let o=AL(r.alias,s.current);return await sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??ar)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function jL(t){if(!vL(t))return{error:`prompt root missing/unreadable: ${t}`};let e=$e(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=it(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??NL(t)}}async function sn(t,e){let r=Qw(e.message),n=e.response===null?null:Qw(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 Qw(t){return t.length<=zw?{text:t,truncated:!1}:{text:t.slice(0,zw),truncated:!0}}function xL(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function AL(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:xL(t,e)}function RL(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Zw;let r=Number(e);return!Number.isFinite(r)||r<=0?Zw:r}var zw,Zw,ey=T(()=>{"use strict";Tt();xt();zw=256*1024,Zw=30*60*1e3});import{chmodSync as iy,existsSync as OL,mkdirSync as ay,readFileSync as Li,writeFileSync as ly}from"node:fs";import{dirname as Eu,resolve as Ri,join as cy}from"node:path";import{fileURLToPath as CL}from"node:url";import{homedir as uy}from"node:os";import{CognitoIdentityClient as LL,GetIdCommand as ML}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as ty}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as DL,ListObjectsV2Command as PL,PutObjectCommand as FL,S3Client as ry}from"@aws-sdk/client-s3";function es(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:HL(t.selfUrl),n={},s;for(let $ of r)if(OL($)){n=qL($),s=$;break}let o=(...$)=>{for(let S of $)if(typeof S=="string"&&S!=="")return S},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??UL,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??WL,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??BL,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)??Mi,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=Ci(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Ci(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Ci(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=Ci(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),k=o(e.LMCTL_MAILBOX_KEY),v=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...k!==void 0?{mailboxKey:k}:{},...v!==void 0?{tokenPath:v}:{}},f}function qL(t){try{let e=Li(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 HL(t){let e=Eu(CL(t??import.meta.url));return[Ri(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ri(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ri(e,"..","..","..","infra","terraform","terraform.tfstate"),Ri(e,"..","..","infra","terraform","terraform.tfstate")]}function Ci(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function JL(t){let e=XL(t.intervalMs)??dy,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 XL(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function fy(t){let e=t.tokenPath??cy(uy(),".lmctl","cli-tokens.json"),r=sy(t.tokenPath);if(Aw(r.cognito?.idToken)&&uu()!==null)try{await Bw({region:t.region,clientId:t.cognitoClientId??Mi,cliTokensPath:e}),r=sy(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(j){let H=j instanceof Error?j.message:String(j);t.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await oy({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=ty({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ry({region:t.region,credentials:a}),c={ListObjectsV2Command:PL,GetObjectCommand:DL,PutObjectCommand:FL},u=zn(n),d=u??o,f=t.deviceId,m=Qr({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let j=p.loadMailboxCursor(d,m);if(j!==null)h=j.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let H=!1,me=0;for(;!H&&me<2;){me+=1;try{let I=li(m,"web"),N=0,O;do{let B=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of B.Contents??[]){let C=ci(F.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}O=B.IsTruncated===!0?B.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(I){let N=I instanceof Error?I.message:String(I);if(i&&me===1&&KL(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),VL(e),i=!1,o=await oy({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=ty({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ry({region:t.region,credentials:a}),m=Qr({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,y=t.persistentSessionManager,k=t.promptTriggerStore,v=new Ni,$=new wr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:j=>v.record(j),onMessage:async j=>{if(_!==void 0&&ru(j.payload)){_.onInbound(j.payload);return}if(y!==void 0&&nu(j.payload)){await y.onInbound(j.payload);return}if(!ou(j.payload)){if(k!==void 0&&iu(j.payload)){yu({store:k,payload:j.payload,log:t.log});return}g!==null&&await g.handleIncoming(j.payload,j)}},...p!==void 0?{onCursorAdvance:j=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:j,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Yn({client:$,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async j=>$.putMessage({conversation_id:`terminal:${j.session_id}`,payload:j})),y!==void 0&&y.setPublish(async j=>$.putMessage({conversation_id:`provider:${j.session_id}`,payload:j}));let S=j=>$.putMessage({conversation_id:su,payload:j});$.start();let R=t.chatLogTailStore===void 0?void 0:JL({store:t.chatLogTailStore,publishDaemonEvent:S,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??dy,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let L=t.deviceId??o,q=`${d}/usage/`,ee;return ee=t.usageStore===void 0?void 0:Tw({meter:v,store:t.usageStore,userId:d,deviceId:L,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:j,costUsd:H,ceilingUsd:me})=>{t.log?.(`[usage] month ${j} cost $${H.toFixed(4)} >= ceiling $${me} \u2014 blocking mailbox`),$.stop().catch(()=>{}),ee?.stop()},publishOwnRollup:async(j,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${q}${L}-${j}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async j=>{let H={put:0,get:0,list:0},me;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:q,MaxKeys:1e3,...me!==void 0?{ContinuationToken:me}:{}}));for(let N of I.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${j}.json`))try{let B=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(B.Body===void 0)continue;let F=JSON.parse(await B.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}me=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(me!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:$,fetchClient:g,publishDaemonEvent:S,async stop(){R?.stop(),ee!==void 0&&(await ee.flushNow().catch(()=>{}),ee.stop()),await g.stop().catch(()=>{}),await $.stop().catch(()=>{})}}}async function my(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Ii(t.rootDir),r=Qr({identityId:Qn,userId:Qn,deviceId:ny}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new wr({bucket:"local",identityId:Qn,userId:Qn,deviceId:ny,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&ru(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&nu(c.payload)){await o.onInbound(c.payload);return}if(!ou(c.payload)){if(i!==void 0&&iu(c.payload)){yu({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Oi,readIntervalMs:t.readIntervalMs??Oi,heartbeatIdleMs:t.heartbeatIdleMs??Oi,backoffReadIntervalMs:t.backoffReadIntervalMs??Oi});n=new Yn({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:su,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Qn,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function sy(t){let e=t??cy(uy(),".lmctl","cli-tokens.json");try{let r=Li(e,"utf8");return JSON.parse(r)}catch{return{}}}function GL(t,e){if(e===void 0||e==="")return;let r={};try{let s=Li(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};ay(Eu(t),{recursive:!0,mode:448}),ly(t,JSON.stringify(n,null,2));try{iy(t,384)}catch{}}function VL(t){let e={};try{let n=Li(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,ay(Eu(t),{recursive:!0,mode:448}),ly(t,JSON.stringify(r,null,2));try{iy(t,384)}catch{}}async function oy(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new LL({region:t.region}).send(new ML({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{GL(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 KL(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 dy,Oi,Mi,UL,WL,BL,Qn,ny,bu=T(()=>{"use strict";mi();zc();eu();Sw();vw();Iw();Nw();$w();au();ui();lu();fu();ey();dy=3e3,Oi=1e3,Mi="79u5jhkk46qofog661c9i0bdcs",UL="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",WL="us-east-1_4iUdFggDn",BL="lmctl-next-preview-mailbox-254332045686";Qn="local",ny="local"});import{spawn as vu}from"node:child_process";import{createInterface as py}from"node:readline";var Tu,Su,ku,_y,hy=T(()=>{"use strict";ba();Je();Tu=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=vu(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=py({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+`
1648
+ `);l=d>=0?l.slice(d+1):""}let c=null;if(l.startsWith("---"))try{c=qw(l)}catch(d){if(d instanceof ft)o.push(`frontmatter: ${d.message}`);else throw d}let u=t.split(`
1649
+ `);for(let d=0;d<u.length;d++){let f=u[d],m=d+1;if(EL(f))throw new Error(`line ${m}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${f.trim()})`);if(bL(f)){let{kvs:_,errors:y}=TL(f,m);if(o.push(...y),y.length>0)continue;let k=_.alias,v=_.teamfile;if(k||o.push(`line ${m}: _CONNECT_ missing alias: ${f.trim()}`),v||o.push(`line ${m}: _CONNECT_ missing teamfile: ${f.trim()}`),!k||!v)continue;let $=wr(a,v);try{let S=Kw($),R=`${k}\0${S}`;if(i.has(R)){o.push(`line ${m}: duplicate _CONNECT_ alias "${k}" for teamfile "${v}"`);continue}i.add(R),s.push({alias:k,teamfile:S})}catch(S){o.push(`line ${m}: _CONNECT_ teamfile missing/unreadable: ${$}: ${S instanceof Error?S.message:String(S)}`)}continue}if(!yL(f))continue;let p=wL(f);for(let _ of Object.keys(p))if(!Jw.includes(_))throw new Error(`line ${m}: unknown key "${_}" on _MEMBER_ line: ${f.trim()}
1650
+ allowed keys: ${Jw.join(", ")}`);if(!p.provider&&!p.teamfile){o.push(`line ${m}: member line missing provider (or teamfile): ${f.trim()}`);continue}let g={alias:p.alias||`member${n.length+1}`,provider:p.provider||"",extra:{}};p.sessionid&&(g.session=p.sessionid),p.sessiondir&&(g.sessiondir=p.sessiondir),p.teamfile&&(g.teamfile=p.teamfile),p.model&&(g.model=p.model),n.push(g)}return{name:e,members:n,connections:s,rawText:t,parseErrors:o,frontmatter:c}}function gu(t,e){let r=[];for(let o of t.parseErrors)r.push({field:o.includes("_CONNECT_")?"connect":"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===pu.toLowerCase());n.length>1&&r.push({field:pu,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?wr(e,o.teamfile):wr(o.teamfile);if(!Vw(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=$e(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 hL.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()===pu.toLowerCase())}function wu(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=wr(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),!Vw(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=$e(o),l=mt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return wu(l,mu(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||mu(o),alias:t.alias,resolvedFrom:o,model:l.model}}function Gw(t){let e;try{e=Kw(t)}catch(n){throw new Error(`connect target missing/unreadable: ${t}: ${n instanceof Error?n.message:String(n)}`)}let r=_L(e);return{path:e,key:`${r.dev}:${r.ino}`}}function SL(t){return t.map(e=>Yw(e)).join(" -> ")}function kL(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 yr(t){let e=Gw(wr(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=$e(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=Gw(d.teamfile),m;try{m=$e(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(Qn(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=kL(s);if(i!==null)throw new Error(`connect cycle: ${SL(i)}`);return{root_teamfile:e.path,snapshots:[...n.values()],edges:s}}function Qn(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var pu,hL,gL,Jw,Xw,xt=T(()=>{"use strict";Hw();pu="Lead",hL=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]),gL=process.cwd();Jw=["alias","provider","sessionid","sessiondir","teamfile","model"],Xw=["alias","teamfile"]});import{existsSync as vL,realpathSync as IL}from"node:fs";import{dirname as NL}from"node:path";function yu(t){$L(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function $L(t){let e=t.payload.root_teamfile;try{e=IL(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await sn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=jL(e);if("error"in r)return await sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-RL(t.env??process.env)).toISOString()});if(!s.acquired){let o=AL(r.alias,s.current);return await sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??ir)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await sn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function jL(t){if(!vL(t))return{error:`prompt root missing/unreadable: ${t}`};let e=$e(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let 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??NL(t)}}async function sn(t,e){let r=Qw(e.message),n=e.response===null?null:Qw(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 Qw(t){return t.length<=zw?{text:t,truncated:!1}:{text:t.slice(0,zw),truncated:!0}}function xL(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function AL(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:xL(t,e)}function RL(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Zw;let r=Number(e);return!Number.isFinite(r)||r<=0?Zw:r}var zw,Zw,ey=T(()=>{"use strict";Tt();xt();zw=256*1024,Zw=30*60*1e3});import{chmodSync as iy,existsSync as OL,mkdirSync as ay,readFileSync as Li,writeFileSync as ly}from"node:fs";import{dirname as Eu,resolve as Ri,join as cy}from"node:path";import{fileURLToPath as CL}from"node:url";import{homedir as uy}from"node:os";import{CognitoIdentityClient as LL,GetIdCommand as ML}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as ty}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as DL,ListObjectsV2Command as PL,PutObjectCommand as FL,S3Client as ry}from"@aws-sdk/client-s3";function ts(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:HL(t.selfUrl),n={},s;for(let $ of r)if(OL($)){n=qL($),s=$;break}let o=(...$)=>{for(let S of $)if(typeof S=="string"&&S!=="")return S},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??UL,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??WL,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??BL,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)??Mi,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=Ci(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Ci(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Ci(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=Ci(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),k=o(e.LMCTL_MAILBOX_KEY),v=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...k!==void 0?{mailboxKey:k}:{},...v!==void 0?{tokenPath:v}:{}},f}function qL(t){try{let e=Li(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 HL(t){let e=Eu(CL(t??import.meta.url));return[Ri(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ri(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ri(e,"..","..","..","infra","terraform","terraform.tfstate"),Ri(e,"..","..","infra","terraform","terraform.tfstate")]}function Ci(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function JL(t){let e=XL(t.intervalMs)??dy,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 XL(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function fy(t){let e=t.tokenPath??cy(uy(),".lmctl","cli-tokens.json"),r=sy(t.tokenPath);if(Aw(r.cognito?.idToken)&&uu()!==null)try{await Bw({region:t.region,clientId:t.cognitoClientId??Mi,cliTokensPath:e}),r=sy(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(j){let H=j instanceof Error?j.message:String(j);t.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await oy({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=ty({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ry({region:t.region,credentials:a}),c={ListObjectsV2Command:PL,GetObjectCommand:DL,PutObjectCommand:FL},u=zn(n),d=u??o,f=t.deviceId,m=Qr({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let j=p.loadMailboxCursor(d,m);if(j!==null)h=j.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let H=!1,me=0;for(;!H&&me<2;){me+=1;try{let I=ci(m,"web"),N=0,O;do{let B=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of B.Contents??[]){let C=ui(F.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}O=B.IsTruncated===!0?B.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(I){let N=I instanceof Error?I.message:String(I);if(i&&me===1&&KL(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),VL(e),i=!1,o=await oy({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=ty({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ry({region:t.region,credentials:a}),m=Qr({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,y=t.persistentSessionManager,k=t.promptTriggerStore,v=new $i,$=new gr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:j=>v.record(j),onMessage:async j=>{if(_!==void 0&&ru(j.payload)){_.onInbound(j.payload);return}if(y!==void 0&&nu(j.payload)){await y.onInbound(j.payload);return}if(!ou(j.payload)){if(k!==void 0&&iu(j.payload)){yu({store:k,payload:j.payload,log:t.log});return}g!==null&&await g.handleIncoming(j.payload,j)}},...p!==void 0?{onCursorAdvance:j=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:j,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Yn({client:$,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async j=>$.putMessage({conversation_id:`terminal:${j.session_id}`,payload:j})),y!==void 0&&y.setPublish(async j=>$.putMessage({conversation_id:`provider:${j.session_id}`,payload:j}));let S=j=>$.putMessage({conversation_id:su,payload:j});$.start();let R=t.chatLogTailStore===void 0?void 0:JL({store:t.chatLogTailStore,publishDaemonEvent:S,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??dy,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let L=t.deviceId??o,q=`${d}/usage/`,ee;return ee=t.usageStore===void 0?void 0:Tw({meter:v,store:t.usageStore,userId:d,deviceId:L,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:j,costUsd:H,ceilingUsd:me})=>{t.log?.(`[usage] month ${j} cost $${H.toFixed(4)} >= ceiling $${me} \u2014 blocking mailbox`),$.stop().catch(()=>{}),ee?.stop()},publishOwnRollup:async(j,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${q}${L}-${j}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async j=>{let H={put:0,get:0,list:0},me;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:q,MaxKeys:1e3,...me!==void 0?{ContinuationToken:me}:{}}));for(let N of I.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${j}.json`))try{let B=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(B.Body===void 0)continue;let F=JSON.parse(await B.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}me=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(me!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:$,fetchClient:g,publishDaemonEvent:S,async stop(){R?.stop(),ee!==void 0&&(await ee.flushNow().catch(()=>{}),ee.stop()),await g.stop().catch(()=>{}),await $.stop().catch(()=>{})}}}async function my(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Ni(t.rootDir),r=Qr({identityId:es,userId:es,deviceId:ny}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new gr({bucket:"local",identityId:es,userId:es,deviceId:ny,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&ru(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&nu(c.payload)){await o.onInbound(c.payload);return}if(!ou(c.payload)){if(i!==void 0&&iu(c.payload)){yu({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Oi,readIntervalMs:t.readIntervalMs??Oi,heartbeatIdleMs:t.heartbeatIdleMs??Oi,backoffReadIntervalMs:t.backoffReadIntervalMs??Oi});n=new Yn({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:su,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:es,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function sy(t){let e=t??cy(uy(),".lmctl","cli-tokens.json");try{let r=Li(e,"utf8");return JSON.parse(r)}catch{return{}}}function GL(t,e){if(e===void 0||e==="")return;let r={};try{let s=Li(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};ay(Eu(t),{recursive:!0,mode:448}),ly(t,JSON.stringify(n,null,2));try{iy(t,384)}catch{}}function VL(t){let e={};try{let n=Li(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,ay(Eu(t),{recursive:!0,mode:448}),ly(t,JSON.stringify(r,null,2));try{iy(t,384)}catch{}}async function oy(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new LL({region:t.region}).send(new ML({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{GL(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 KL(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 dy,Oi,Mi,UL,WL,BL,es,ny,bu=T(()=>{"use strict";pi();zc();eu();Sw();vw();Iw();Nw();$w();au();di();lu();fu();ey();dy=3e3,Oi=1e3,Mi="79u5jhkk46qofog661c9i0bdcs",UL="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",WL="us-east-1_4iUdFggDn",BL="lmctl-next-preview-mailbox-254332045686";es="local",ny="local"});import{spawn as vu}from"node:child_process";import{createInterface as py}from"node:readline";var Tu,Su,ku,_y,hy=T(()=>{"use strict";ba();Je();Tu=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=vu(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=py({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+`
1625
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+`
1626
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}}}},Su=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=vu(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(`
1627
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+`
1628
- `)}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}})}},ku=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{js(n)}catch(a){te({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=vu(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=py({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}})}},ku=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{xs(n)}catch(a){te({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=vu(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=py({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+`
1629
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+`
1630
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+`
1631
- `)}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}})}}},_y=t=>{switch(t){case"codex":return new Tu;case"claude":case"qwen":return new Su;case"gemini":case"copilot":case"opencode":return new ku;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as YL}from"node:crypto";import{existsSync as K3,mkdirSync as zL,readFileSync as ZL,writeFileSync as QL}from"node:fs";import{homedir as eM}from"node:os";import{dirname as tM,join as rM}from"node:path";function Di(){return process.env.LMCTL_DEVICE_FILE??rM(eM(),".lmctl","device.json")}function br(t=Di()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(ZL(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 Iu(t=Di()){let e=br(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:YL(),created_at:new Date().toISOString()};return zL(tM(t),{recursive:!0}),QL(t,`${JSON.stringify(r,null,2)}
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}})}}},_y=t=>{switch(t){case"codex":return new Tu;case"claude":case"qwen":return new Su;case"gemini":case"copilot":case"opencode":return new ku;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as YL}from"node:crypto";import{existsSync as Y3,mkdirSync as zL,readFileSync as ZL,writeFileSync as QL}from"node:fs";import{homedir as eM}from"node:os";import{dirname as tM,join as rM}from"node:path";function Di(){return process.env.LMCTL_DEVICE_FILE??rM(eM(),".lmctl","device.json")}function Er(t=Di()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(ZL(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 Iu(t=Di()){let e=Er(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:YL(),created_at:new Date().toISOString()};return zL(tM(t),{recursive:!0}),QL(t,`${JSON.stringify(r,null,2)}
1632
1658
  `,{encoding:"utf8",mode:384}),r}var Nu=T(()=>{"use strict"});import*as gy from"node:child_process";function sM(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 $u(t,e={}){let r=e.spawnSync===void 0&&process.env[oM]==="1",n=e.spawnSync??gy.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Pi[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=sM(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(Pi).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 Pi,nM,oM,yy=T(()=>{"use strict";Pi={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"};oM="LMCTL_SKIP_BINARY_CHECK"});var jy={};ie(jy,{ProviderBinaryPreflightError:()=>Fi,__setProviderBinaryCheckForTest:()=>_M,bootstrapAgentRestMailbox:()=>Ty,publishRegisteredWorkflowsOnStart:()=>by,resolveLocalMailboxDir:()=>Ny,resolveLocalWebuiDir:()=>Iy,resolveServeConfig:()=>Sy,runProviderBinaryPreflight:()=>vy,runServe:()=>dM,validateServeArgs:()=>$y});import{randomBytes as iM}from"node:crypto";import{existsSync as aM}from"node:fs";import{homedir as lM}from"node:os";import{isAbsolute as Ey,resolve as ju}from"node:path";import{serve as cM}from"@hono/node-server";async function dM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(uM),0;let r=$y(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1633
1659
  `),2;try{vy(e)}catch(y){return 1}let n=pe({path:de()}),s={portCli:hM(t)},o;try{o=Sy({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(y){return n.close(),e.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
1634
- `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),fw(n);let i;if(r.localWebui!==void 0){let y=Iy(r.localWebui.dir,process.env);if(y===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=Ny(process.env),{s3:v,commands:$}=Ii(k);i={webuiDir:y,rootDir:k,s3:v,commands:$},e.stdout.write(`local webui: serving SPA from ${y}; mailbox store ${k}
1635
- `)}let a=r.noDaemon?void 0:uw({dal:n,intervalMs:Kn()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:es({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)`)+`
1660
+ `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),fw(n);let i;if(r.localWebui!==void 0){let y=Iy(r.localWebui.dir,process.env);if(y===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=Ny(process.env),{s3:v,commands:$}=Ni(k);i={webuiDir:y,rootDir:k,s3:v,commands:$},e.stdout.write(`local webui: serving SPA from ${y}; mailbox store ${k}
1661
+ `)}let a=r.noDaemon?void 0:uw({dal:n,intervalMs:Kn()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:ts({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)`)+`
1636
1662
  `);let c=await pM({log:y=>e.stderr.write(`${y}
1637
- `)}),u=new wi({adapterFactory:_y,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:y=>e.stderr.write(`${y}
1638
- `)}),d=br()?.device_id,f=tw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:fM(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 Ty({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 by({dal:n,mailbox:g.mailbox,io:e});let _=cM({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1663
+ `)}),u=new yi({adapterFactory:_y,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:y=>e.stderr.write(`${y}
1664
+ `)}),d=Er()?.device_id,f=tw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:fM(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 Ty({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 by({dal:n,mailbox:g.mailbox,io:e});let _=cM({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1639
1665
  `),await new Promise(y=>{let k=()=>{(async()=>(a!==void 0&&await a.stop(),_.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),y()))()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function fM(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 by(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)}
1640
1666
  `)}}async function Ty(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}
1641
1667
  `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await fy({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
@@ -1643,7 +1669,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1643
1669
  `)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
1644
1670
  `)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
1645
1671
  `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function Sy(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=iM(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: ${mM(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
1646
- `);return{port:a,apiUrl:d,apiToken:c}}function mM(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 pM(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 gi({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 _M(t){ky=t??$u}function vy(t){let e=Object.keys(Pi),r=ky(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${wy(o)}
1672
+ `);return{port:a,apiUrl:d,apiToken:c}}function mM(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 pM(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 wi({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 _M(t){ky=t??$u}function vy(t){let e=Object.keys(Pi),r=ky(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${wy(o)}
1647
1673
  `);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
1648
1674
  `),new Fi(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
1649
1675
  `)}function Iy(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=Ey(r)?r:ju(process.cwd(),r);return aM(`${n}/index.html`)?n:null}function Ny(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?Ey(e)?e:ju(process.cwd(),e):ju(lM(),".lmctl","local-mailbox")}function hM(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 $y(t,e=process.env){let r=gM(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 gM(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 uM,Fi,ky,xy=T(()=>{"use strict";Le();sw();Gc();mw();Zl();bu();zc();Dc();Pc();hy();Nu();yy();qe();uM=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
@@ -1657,30 +1683,30 @@ services. Help exits before any port binding or daemon startup.
1657
1683
  local identity. Mailbox store defaults to
1658
1684
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
1659
1685
  `;Fi=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=$u});var Ay={};ie(Ay,{runIntake:()=>yM});async function yM(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(wM),0):r==="scan"?EM(n,e):r==="config"?bM(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1660
- `),1)}async function EM(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=x(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 Yl({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await Gr(s)),0})}async function bM(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=x(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=x(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=x(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 wM,Ry=T(()=>{"use strict";Fo();Se();wM=`usage: lmctl intake <scan|config> ...
1686
+ `),1)}async function EM(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=x(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 Yl({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await Gr(s)),0})}async function bM(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=x(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=x(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=x(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 wM,Ry=T(()=>{"use strict";Uo();Se();wM=`usage: lmctl intake <scan|config> ...
1661
1687
 
1662
1688
  Scan configured project GitHub issues into lmctl, or update per-project
1663
1689
  intake settings such as enabled state, labels, and issue state filters.
1664
- `});import{createHash as TM}from"node:crypto";import{existsSync as ts,mkdirSync as SM,readFileSync as Cy,realpathSync as kM,writeFileSync as vM}from"node:fs";import{dirname as Ly,resolve as My}from"node:path";function Tr(t){let e=My(t);return ts(e)?kM(e):e}function Oy(t,e){let r=Ly(e),n=hu(t,_u(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=My(r,s.sessiondir));return n}function rs(t,e){let r=Tr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!ts(r)&&"upsertRootTeam"in e&&(SM(Ly(r),{recursive:!0}),vM(r,n.raw_text,"utf8")),Oy(n.raw_text,r);if(ts(r)){let s=Cy(r,"utf8"),o=Oy(s,r);return"upsertRootTeam"in e&&NM(o)&&$M(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!ts(r))throw new Error(`teamfile not found: ${t}`);return $e(r)}function Dy(t,e,r){let n=Tr(t),s=e.getRootTeam(n);s===null||!ts(n)||Cy(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 NM(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=IM)}function $M(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:TM("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o);try{let i=Er(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 IM,Ui=T(()=>{"use strict";xt();IM=5});import{existsSync as jM}from"node:fs";import{dirname as Py}from"node:path";function RM(t){return xM.test(t)||AM.test(t)}function Fy(t){return Wi.test(t)}function xu(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Wi.test(n)?null:{teamfile:r,alias:n}}function At(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!Fy(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Wi.source}).`);let n=Tr(t);if(r===void 0&&!jM(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=rs(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=Ai(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}.
1690
+ `});import{createHash as TM}from"node:crypto";import{existsSync as rs,mkdirSync as SM,readFileSync as Cy,realpathSync as kM,writeFileSync as vM}from"node:fs";import{dirname as Ly,resolve as My}from"node:path";function br(t){let e=My(t);return rs(e)?kM(e):e}function Oy(t,e){let r=Ly(e),n=hu(t,_u(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=My(r,s.sessiondir));return n}function ns(t,e){let r=br(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!rs(r)&&"upsertRootTeam"in e&&(SM(Ly(r),{recursive:!0}),vM(r,n.raw_text,"utf8")),Oy(n.raw_text,r);if(rs(r)){let s=Cy(r,"utf8"),o=Oy(s,r);return"upsertRootTeam"in e&&NM(o)&&$M(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!rs(r))throw new Error(`teamfile not found: ${t}`);return $e(r)}function Dy(t,e,r){let n=br(t),s=e.getRootTeam(n);s===null||!rs(n)||Cy(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 NM(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=IM)}function $M(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:TM("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o);try{let i=yr(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 IM,Ui=T(()=>{"use strict";xt();IM=5});import{existsSync as jM}from"node:fs";import{dirname as Py}from"node:path";function RM(t){return xM.test(t)||AM.test(t)}function Fy(t){return Wi.test(t)}function xu(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Wi.test(n)?null:{teamfile:r,alias:n}}function At(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!Fy(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Wi.source}).`);let n=br(t);if(r===void 0&&!jM(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=ns(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=Qn(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}.
1665
1691
  Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=wu(o,Py(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.
1666
- Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??Py(n),...o.model!==void 0?{model:o.model}:{}}}function Yt(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=xu(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?Fy(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Wi.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1692
+ Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??Py(n),...o.model!==void 0?{model:o.model}:{}}}function Kt(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=xu(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?Fy(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Wi.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1667
1693
  Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(RM(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.
1668
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}".
1669
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.
1670
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,xM,AM,Wi,ns=T(()=>{"use strict";xt();Ui();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},xM=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,AM=/^ses_[A-Za-z0-9_-]+$/,Wi=/^[A-Za-z][A-Za-z0-9_-]*$/});function By(t){let e=Uy(t.registry,t.fromTeamfile);if(e===void 0)return Rt(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Wy(e,t.fromAlias))return Rt(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=Uy(t.registry,t.toTeamfile);if(r===void 0)return Rt(`target team is not registered in policy graph: ${t.toTeamfile}`);if(!Wy(r,t.toAlias))return Rt(`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 Rt(`sender team has no Lead: ${t.fromTeamfile}`);if(t.fromAlias!==e.leadAlias)return Rt(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`);if(r.leadAlias===null)return Rt(`target team has no Lead: ${t.toTeamfile}`);if(t.toAlias!==r.leadAlias)return Rt(`cross-team sends may only target Lead; got "${t.toAlias}" in ${t.toTeamfile}`);let n=t.registry.connections.find(s=>s.sourceTeamfile===t.fromTeamfile&&s.targetTeamfile===t.toTeamfile);return n===void 0?Rt(`target team is not connected from sender team: ${t.fromTeamfile} -> ${t.toTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:`connected team ${n.targetName} Lead`}}function Uy(t,e){return t.teams.find(r=>r.teamfile===e)}function Wy(t,e){return t.aliases.some(r=>r===e)}function Rt(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var qy=T(()=>{"use strict"});var Yy={};ie(Yy,{agentInflightTtlMsFromEnv:()=>Vy,parseIdleTimeoutMs:()=>Ky,runChat:()=>CM});async function CM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Xy}
1696
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,xM,AM,Wi,ss=T(()=>{"use strict";xt();Ui();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},xM=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,AM=/^ses_[A-Za-z0-9_-]+$/,Wi=/^[A-Za-z][A-Za-z0-9_-]*$/});function By(t){let e=Uy(t.registry,t.fromTeamfile);if(e===void 0)return Tr(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Wy(e,t.fromAlias))return Tr(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=Uy(t.registry,t.toTeamfile);if(r===void 0)return Tr(`target team is not registered in policy graph: ${t.toTeamfile}`);if(!Wy(r,t.toAlias))return Tr(`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 Tr(`sender team has no Lead: ${t.fromTeamfile}`);if(t.fromAlias!==e.leadAlias)return Tr(`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?Tr(`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 Uy(t,e){return t.teams.find(r=>r.teamfile===e)}function Wy(t,e){return t.aliases.some(r=>r===e)}function Tr(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var qy=T(()=>{"use strict"});var Yy={};ie(Yy,{agentInflightTtlMsFromEnv:()=>Vy,parseIdleTimeoutMs:()=>Ky,runChat:()=>CM});async function CM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Xy}
1671
1697
  `),t.length===0?2:0;let r=LM(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1672
1698
  ${Xy}
1673
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)
1674
1700
  `),2):await J(e,async c=>{let u=c.getRun(l);if(u===null)return e.stderr.write(`error: run ${l}: not found
1675
- `),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=yi(c,l);if(d===null)return e.stderr.write(`error: run ${l}: no pending operator-answerable attention (chat --run only resumes paused runs)
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=Ei(c,l);if(d===null)return e.stderr.write(`error: run ${l}: no pending operator-answerable attention (chat --run only resumes paused runs)
1676
1702
  `),1;if(d.kind==="workflow_escalation"){if(r.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
1677
1703
  `),2;let f=c.resumeEscalation(d.attention_id,r.prompt);return f.resumed===!0?(e.stdout.write(`run ${l}: escalation resumed (decision: ${r.prompt})
1678
1704
  `),0):(e.stderr.write(`error: run ${l}: resumeEscalation failed (${f.reason})
1679
- `),1)}if(d.kind==="interactive_waiting_operator"){let f=ut(c,d.attention_id);if(f===null||f.step_id===null)return e.stderr.write(`error: run ${l}: pending interactive_waiting_operator attention has no associated interactive step
1705
+ `),1)}if(d.kind==="interactive_waiting_operator"){let f=ct(c,d.attention_id);if(f===null||f.step_id===null)return e.stderr.write(`error: run ${l}: pending interactive_waiting_operator attention has no associated interactive step
1680
1706
  `),1;let m=c.resumeInteractive(f.step_id,r.prompt,r.done===!0);return m.resumed===!0?(e.stdout.write(`run ${l}: interactive resumed (step ${f.step_id}${r.done===!0?", done":""})
1681
1707
  `),0):(e.stderr.write(`error: run ${l}: resumeInteractive failed (${m.reason})
1682
1708
  `),1)}return e.stderr.write(`error: run ${l}: pending attention kind "${d.kind}" is not operator-answerable
1683
- `),1})}let n=Yt(OM,{target:r.target,alias:r.alias,flags:{session:r.sessionFlag,provider:r.providerFlag}});if(n.mode==="error")return e.stderr.write(`error: ${n.message}
1709
+ `),1})}let n=Kt(OM,{target:r.target,alias:r.alias,flags:{session:r.sessionFlag,provider:r.providerFlag}});if(n.mode==="error")return e.stderr.write(`error: ${n.message}
1684
1710
  `),2;if(n.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
1685
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)
1686
1712
  `),2;let l=n.alias;try{let c=await J(e,h=>At(n.teamfile,l,h)),u=c.teamfile,d=await J(e,h=>MM(r.fromFlag,u,h)),f=await DM(e,{explicitRoot:r.rootFlag,sender:d,receiverTeamfile:u,operatorOrigin:r.fromFlag===void 0}),m=r.fromFlag===void 0?null:await WM(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}
@@ -1688,17 +1714,17 @@ ${Xy}
1688
1714
  `),1}i=p.lease}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: ${u}
1689
1715
  `),c instanceof ge,1}}else{if(r.force===!0)return e.stderr.write(`error: --force is only valid for AI-team chat
1690
1716
  `),2;if(n.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
1691
- `),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=>GM(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 ar(l),u=c.status==="stalled";return o!==null&&await Au(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=>GM(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 ir(l),u=c.status==="stalled";return o!==null&&await Au(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(`
1692
1718
  `)||e.stdout.write(`
1693
1719
  `):e.stdout.write(`${c.text}${c.text.endsWith(`
1694
1720
  `)?"":`
1695
1721
  `}`),c.status==="stalled"?1:0}catch(l){let c=l instanceof Error?l.message:String(l);return o!==null&&await Au(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}
1696
- `),1}finally{i!==null&&await JM(e,i)}}function LM(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 y=Ky(_);if(typeof y=="string")return y;n=y;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 MM(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=xu(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Tr(n.teamfile),o=rs(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=Ai(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 DM(t,e){return e.explicitRoot!==void 0?Tr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await J(t,r=>PM(r,e.sender.teamfile)??e.receiverTeamfile)}function PM(t,e){let r=t.listRootTeams().slice().sort(FM);for(let n of r)if(UM(t,n.teamfile_path,e))return n.teamfile_path;return null}function FM(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 UM(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 WM(t,e){return await J(t,r=>By({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:BM(r,e.sender.teamfile,e.receiverTeamfile)}))}function BM(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=>qM(o,t)),connections:s.map(o=>({sourceTeamfile:o.source_teamfile,targetTeamfile:o.target_teamfile,targetName:o.target_name}))}}function qM(t,e){let r=rs(t,e),n=it(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function HM(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-Vy()).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 JM(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)}
1722
+ `),1}finally{i!==null&&await JM(e,i)}}function LM(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 y=Ky(_);if(typeof y=="string")return y;n=y;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 MM(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=xu(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=br(n.teamfile),o=ns(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=Qn(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 DM(t,e){return e.explicitRoot!==void 0?br(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await J(t,r=>PM(r,e.sender.teamfile)??e.receiverTeamfile)}function PM(t,e){let r=t.listRootTeams().slice().sort(FM);for(let n of r)if(UM(t,n.teamfile_path,e))return n.teamfile_path;return null}function FM(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 UM(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 WM(t,e){return await J(t,r=>By({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:BM(r,e.sender.teamfile,e.receiverTeamfile)}))}function BM(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=>qM(o,t)),connections:s.map(o=>({sourceTeamfile:o.source_teamfile,targetTeamfile:o.target_teamfile,targetName:o.target_name}))}}function qM(t,e){let r=ns(t,e),n=mt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function HM(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-Vy()).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 JM(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)}
1697
1723
  `)}}function XM(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function Vy(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Jy;let r=Number(e);return!Number.isFinite(r)||r<=0?Jy:r}async function Au(t,e){let r=Gy(e.message),n=e.response===null?null:Gy(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)}
1698
1724
  `)}}function Gy(t){return t.length<=Hy?{text:t,truncated:!1}:{text:t.slice(0,Hy),truncated:!0}}function Ky(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 GM(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1699
1725
  `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
1700
1726
  `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
1701
- `)}var OM,Hy,Jy,Xy,zy=T(()=>{"use strict";Tt();Se();ns();xt();qy();Ui();Ei();St();OM={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Hy=256*1024,Jy=30*60*1e3,Xy=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1727
+ `)}var OM,Hy,Jy,Xy,zy=T(()=>{"use strict";Tt();Se();ss();xt();qy();Ui();bi();St();OM={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Hy=256*1024,Jy=30*60*1e3,Xy=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1702
1728
  lmctl chat <teamfile> <alias> "<prompt>"
1703
1729
  lmctl chat <sessionid> "<prompt>" --provider <name>
1704
1730
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -1706,7 +1732,7 @@ ${Xy}
1706
1732
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
1707
1733
  [--from <teamfile>:<alias>] [--root <teamfile>] [--force]
1708
1734
 
1709
- Send a prompt to a team member or raw provider session, or answer a paused run.`});var ss,FV,Ru=T(()=>{"use strict";ss=[{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}],FV=ss.length});import{spawn as VM}from"node:child_process";async function Zy(t,e,r){let n=YM.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 zM(n.name,s)}function zM(t,e){return t==="lmctl_chat"?ZM(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function ZM(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),QM(c,u)}function QM(t,e){return new Promise(r=>{let n=!1,s=l=>{n||(n=!0,r(l))},o=VM("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 Qy(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:KM),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 KM,YM,Ou=T(()=>{"use strict";Ru();KM="http://127.0.0.1:8787",YM=new Map(ss.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(Cu({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:eD,capabilities:{tools:{listChanged:!1}},serverInfo:{name:tD,version:rD}}}};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:ss.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 Zy(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 Cu(t){return`${JSON.stringify(t)}
1735
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});var os,UV,Ru=T(()=>{"use strict";os=[{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}],UV=os.length});import{spawn as VM}from"node:child_process";async function Zy(t,e,r){let n=YM.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 zM(n.name,s)}function zM(t,e){return t==="lmctl_chat"?ZM(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function ZM(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),QM(c,u)}function QM(t,e){return new Promise(r=>{let n=!1,s=l=>{n||(n=!0,r(l))},o=VM("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 Qy(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:KM),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 KM,YM,Ou=T(()=>{"use strict";Ru();KM="http://127.0.0.1:8787",YM=new Map(os.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(Cu({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:eD,capabilities:{tools:{listChanged:!1}},serverInfo:{name:tD,version:rD}}}};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:os.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 Zy(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 Cu(t){return`${JSON.stringify(t)}
1710
1736
  `}async function eE(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(Cu({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(Cu(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(`
1711
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(`
1712
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}
@@ -1715,7 +1741,7 @@ Send a prompt to a team member or raw provider session, or answer a paused run.`
1715
1741
 
1716
1742
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
1717
1743
  local config, then uses stdin/stdout for JSON-RPC frames.
1718
- `});function os(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 sE=T(()=>{"use strict"});function iD(t){return{stale_run_minutes:as(t,"monitor.stale_run_minutes",is.stale_run_minutes),old_attention_days:as(t,"monitor.old_attention_days",is.old_attention_days),old_issue_days:as(t,"monitor.old_issue_days",is.old_issue_days),stuck_job_minutes:as(t,"monitor.stuck_job_minutes",is.stuck_job_minutes),dedupe_window_hours:as(t,"monitor.dedupe_window_hours",is.dedupe_window_hours)}}function as(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 oE(t,e={}){let r=e.now??new Date,n=iD(t),s=[];for(let o of aD(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);for(let o of uD(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function aD(t,e,r){let n=iE(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
1744
+ `});function is(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 sE=T(()=>{"use strict"});function iD(t){return{stale_run_minutes:ls(t,"monitor.stale_run_minutes",as.stale_run_minutes),old_attention_days:ls(t,"monitor.old_attention_days",as.old_attention_days),old_issue_days:ls(t,"monitor.old_issue_days",as.old_issue_days),stuck_job_minutes:ls(t,"monitor.stuck_job_minutes",as.stuck_job_minutes),dedupe_window_hours:ls(t,"monitor.dedupe_window_hours",as.dedupe_window_hours)}}function ls(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function oE(t,e={}){let r=e.now??new Date,n=iD(t),s=[];for(let o of aD(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);for(let o of uD(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function aD(t,e,r){let n=iE(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
1719
1745
  SELECT r.id AS id,
1720
1746
  r.job_id AS job_id,
1721
1747
  w.name AS workflow_name,
@@ -1726,12 +1752,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1726
1752
  WHERE r.terminal_state IS NULL
1727
1753
  AND r.paused_at IS NULL
1728
1754
  AND r.started_at <= ?
1729
- `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=os(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(Bi(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 lD(t,e,r){let n=iE(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=is(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(Bi(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 lD(t,e,r){let n=iE(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
1730
1756
  SELECT id, project_id, source, source_ref, status, enqueued_at
1731
1757
  FROM job
1732
1758
  WHERE status NOT IN ('done', 'failed')
1733
1759
  AND enqueued_at <= ?
1734
- `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=os(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(Bi(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 cD(t,e,r){let n=aE(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=is(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(Bi(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 cD(t,e,r){let n=aE(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
1735
1761
  SELECT project_id,
1736
1762
  COUNT(*) AS count,
1737
1763
  (SELECT kind FROM attention a2
@@ -1746,7 +1772,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1746
1772
  AND kind NOT IN ('attentions_overdue', 'issues_overdue')
1747
1773
  AND created_at <= ?
1748
1774
  GROUP BY project_id
1749
- `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=os(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(Bi(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 uD(t,e,r){let n=aE(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=is(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(Bi(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 uD(t,e,r){let n=aE(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
1750
1776
  SELECT project_id,
1751
1777
  COUNT(*) AS count,
1752
1778
  (SELECT title FROM project_issue i2
@@ -1759,34 +1785,34 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1759
1785
  WHERE status IN ('open', 'reopened')
1760
1786
  AND created_at <= ?
1761
1787
  GROUP BY project_id
1762
- `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=os(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${mD(i.oldest_title,40)})`;o.push(Bi(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function Bi(t,e){let r=dD(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function dD(t,e,r,n){let s=fD(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
1788
+ `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=is(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${mD(i.oldest_title,40)})`;o.push(Bi(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function Bi(t,e){let r=dD(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function dD(t,e,r,n){let s=fD(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
1763
1789
  SELECT * FROM attention
1764
1790
  WHERE acknowledged_at IS NULL
1765
1791
  AND created_at >= ?
1766
1792
  AND payload LIKE ?
1767
1793
  ORDER BY id DESC
1768
1794
  LIMIT 1
1769
- `).get(s,o)??null}function iE(t,e){return new Date(t.getTime()-e*60*1e3)}function fD(t,e){return new Date(t.getTime()-e*60*60*1e3)}function aE(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function mD(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var is,lE=T(()=>{"use strict";sE();is={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var uE={};ie(uE,{renderSummary:()=>cE,runMonitor:()=>_D});async function _D(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(pD),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=D(r,"--json"),s=D(r,"--quiet");try{return await J(e,o=>{let i=oE(o);return n?W(e,i):s||e.stdout.write(`${cE(i.findings)}
1795
+ `).get(s,o)??null}function iE(t,e){return new Date(t.getTime()-e*60*1e3)}function fD(t,e){return new Date(t.getTime()-e*60*60*1e3)}function aE(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function mD(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var as,lE=T(()=>{"use strict";sE();as={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var uE={};ie(uE,{renderSummary:()=>cE,runMonitor:()=>_D});async function _D(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(pD),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=D(r,"--json"),s=D(r,"--quiet");try{return await J(e,o=>{let i=oE(o);return n?W(e,i):s||e.stdout.write(`${cE(i.findings)}
1770
1796
  `),0})}catch(o){return fe(e,o)}}function cE(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} ${hD(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function hD(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 pD,dE=T(()=>{"use strict";Se();lE();pD=`usage: lmctl monitor [--json] [--quiet]
1771
1797
 
1772
1798
  Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
1773
1799
  issues; emit findings as attentions for the operator/master to handle.
1774
1800
  `});var fE={};ie(fE,{runDevice:()=>ND});import{readFileSync as gD}from"node:fs";import{homedir as wD}from"node:os";import{join as yD}from"node:path";import{CognitoIdentityClient as ED,GetIdCommand as bD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as TD}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as SD,ListObjectsV2Command as kD,PutObjectCommand as vD,S3Client as ID}from"@aws-sdk/client-s3";async function ND(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(Lu),0;if(r==="init"){let n=Iu();return e.stdout.write(`${n.device_id}
1775
- `),0}if(r==="id"){let n=br();return n===null?(e.stderr.write(`error: no device id initialized at ${Di()}; run 'lmctl device init'
1801
+ `),0}if(r==="id"){let n=Er();return n===null?(e.stderr.write(`error: no device id initialized at ${Di()}; run 'lmctl device init'
1776
1802
  `),1):(e.stdout.write(`${n.device_id}
1777
1803
  `),0)}return r==="login"?await $D(t.slice(1),e):r==="prompt"?await xD(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
1778
1804
  `),1)}async function $D(t,e){let r=jD(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1779
- ${Lu}`),2;let n=es();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1780
- `),1;Ww({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await ji({region:n.config.region,clientId:n.config.cognitoClientId??Mi,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
+ ${Lu}`),2;let n=ts();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1806
+ `),1;Ww({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await xi({region:n.config.region,clientId:n.config.cognitoClientId??Mi,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}
1781
1807
  `),1}let a=zn(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
1782
- `),1;du({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=br()??Iu();return e.stdout.write(`logged in as ${r.userId}
1808
+ `),1;du({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Er()??Iu();return e.stdout.write(`logged in as ${r.userId}
1783
1809
  device id: ${l.device_id}
1784
1810
  mailbox prefix: ${r.userId}/${l.device_id}/
1785
1811
  access key stored at ${Zn()}
1786
1812
  `),0}function jD(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 xD(t,e){let r=AD(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1787
- ${Lu}`),2;let n=es();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1788
- `),1;let s=OD();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 RD({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=TD({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??br()?.device_id,u=zn(o)??void 0,d=new wr({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 ID({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:kD,GetObjectCommand:SD,PutObjectCommand:vD},selfRole:"browser",onMessage:async()=>{}}),f=xw({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:jw,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
1789
- `),0}function AD(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 RD(t){let r=await new ED({region:t.region}).send(new bD({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 OD(t=process.env.LMCTL_TOKEN_PATH??yD(wD(),".lmctl","cli-tokens.json")){try{return JSON.parse(gD(t,"utf8"))}catch{return null}}var Lu,mE=T(()=>{"use strict";Nu();bu();mi();au();lu();fu();cu();Lu=`usage: lmctl device <id|init>
1813
+ ${Lu}`),2;let n=ts();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1814
+ `),1;let s=OD();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 RD({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=TD({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Er()?.device_id,u=zn(o)??void 0,d=new gr({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 ID({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:kD,GetObjectCommand:SD,PutObjectCommand:vD},selfRole:"browser",onMessage:async()=>{}}),f=xw({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:jw,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 AD(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 RD(t){let r=await new ED({region:t.region}).send(new bD({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 OD(t=process.env.LMCTL_TOKEN_PATH??yD(wD(),".lmctl","cli-tokens.json")){try{return JSON.parse(gD(t,"utf8"))}catch{return null}}var Lu,mE=T(()=>{"use strict";Nu();bu();pi();au();lu();fu();cu();Lu=`usage: lmctl device <id|init>
1790
1816
  lmctl device login --user-id <sub> --access-key <refreshToken>
1791
1817
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
1792
1818
 
@@ -1803,15 +1829,15 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
1803
1829
  `)}${s.length>0?`
1804
1830
  `:""}`),0}function UD(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(D(n,"--json"))W(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
1805
1831
  `);for(let a of i)e.stdout.write(`- ${a.alias} ${ke(a)} ${a.sessionid??"(unseeded)"}
1806
- `)}return 0}function WD(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=x(n,"--alias"),a=x(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:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??CD(Zt(),"sessions",o.name,i)});return D(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1807
- `),0}async function pE(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=x(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=BD(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=xh(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))uo(f,r),mo(f);let u=[],d=!1;for(let f of l){let m=await Or({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1832
+ `)}return 0}function WD(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=x(n,"--alias"),a=x(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:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??CD(zt(),"sessions",o.name,i)});return D(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1833
+ `),0}async function pE(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=x(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=BD(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=xh(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))fo(f,r),po(f);let u=[],d=!1;for(let f of l){let m=await Or({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1808
1834
 
1809
1835
  ${Dr}`:Dr;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=Pr(ke(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
1810
1836
  ${_}
1811
- `);try{await ko({dal:r,member:p,stderr:e.stderr})}catch(y){d=!0,e.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
1837
+ `);try{await vo({dal:r,member:p,stderr:e.stderr})}catch(y){d=!0,e.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
1812
1838
  `)}}}return D(s,"--json")?W(e,u):e.stdout.write(`seeded ${u.length} member(s)
1813
1839
  `),d?1:0}function BD(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function qD(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=x(n,"--interpreter"),a=x(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)
1814
- `),0}var LD,hE=T(()=>{"use strict";qe();Xs();jn();wl();Le();Fr();Al();ri();Se();yl();LD=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1840
+ `),0}var LD,hE=T(()=>{"use strict";qe();Gs();jn();wl();Le();Fr();Al();ni();Se();yl();LD=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1815
1841
 
1816
1842
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
1817
1843
  refresh to create/update native provider sessions for team members.
@@ -1819,8 +1845,8 @@ refresh to create/update native provider sessions for team members.
1819
1845
  Root team registry:
1820
1846
  list-roots [--json] List .lmctl root teams registered by lmctl seed.
1821
1847
  `});var bE={};ie(bE,{renderMessage:()=>yE,runTail:()=>VD});async function VD(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${GD}
1822
- `),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=x(r,"--lines"),s=n===void 0?JD:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=D(r,"--watch"),i=x(r,"--watch-interval"),a=i===void 0?XD: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=x(r,"--run");if(l!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(x(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=>KD(e,m,f,s,o,a))}catch(m){return fe(e,m)}}let c=Yt(HD,{target:r.positionals[0],alias:r.positionals[1],flags:{session:x(r,"--session"),provider:x(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=$e(c.teamfile)}catch(p){return w(e,`tail: ${p instanceof Error?p.message:String(p)}`)}let m=it(f);if(m===void 0)return w(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let p=At(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=At(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 _o(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 gE(e,u.provider,u.sessionId,s,-1);return d<0?1:o?await new Promise(f=>{let m=async()=>{try{let g=await gE(e,u.provider,u.sessionId,s,d);g>=0&&(d=g)}catch(g){e.stderr.write(`tail: ${g instanceof Error?g.message:String(g)}
1823
- `)}},p=setInterval(()=>{m()},a*1e3),h=()=>{clearInterval(p),f(0)};process.once("SIGINT",h),process.once("SIGTERM",h)}):0}async function gE(t,e,r,n,s){let o;try{o=await fr(r,e)}catch(l){return t.stderr.write(`tail: failed to load session: ${l instanceof Error?l.message:String(l)}
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=x(r,"--lines"),s=n===void 0?JD:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=D(r,"--watch"),i=x(r,"--watch-interval"),a=i===void 0?XD: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=x(r,"--run");if(l!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(x(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=>KD(e,m,f,s,o,a))}catch(m){return fe(e,m)}}let c=Kt(HD,{target:r.positionals[0],alias:r.positionals[1],flags:{session:x(r,"--session"),provider:x(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=$e(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=At(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=At(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 ho(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 gE(e,u.provider,u.sessionId,s,-1);return d<0?1:o?await new Promise(f=>{let m=async()=>{try{let g=await gE(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 gE(t,e,r,n,s){let o;try{o=await dr(r,e)}catch(l){return t.stderr.write(`tail: failed to load session: ${l instanceof Error?l.message:String(l)}
1824
1850
  `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
1825
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(`${yE(i[l])}
1826
1852
  `);return i.length-1}function yE(t){let e=EE(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
@@ -1831,13 +1857,13 @@ ${i.map(a=>` ${a}`).join(`
1831
1857
  `)}`}async function KD(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)}
1832
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)}
1833
1859
  `),c=h.id}catch(p){t.stderr.write(`tail: ${p instanceof Error?p.message:String(p)}
1834
- `)}},o*1e3),m=()=>{clearInterval(f),u(0)};process.once("SIGINT",m),process.once("SIGTERM",m)}):0}function wE(t){let e=EE(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 EE(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 HD,JD,XD,GD,TE=T(()=>{"use strict";Fr();Se();ns();xt();HD={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},JD=20,XD=2,GD=`usage: lmctl tail [target] [alias]
1860
+ `)}},o*1e3),m=()=>{clearInterval(f),u(0)};process.once("SIGINT",m),process.once("SIGTERM",m)}):0}function wE(t){let e=EE(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 EE(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 HD,JD,XD,GD,TE=T(()=>{"use strict";Fr();Se();ss();xt();HD={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},JD=20,XD=2,GD=`usage: lmctl tail [target] [alias]
1835
1861
  lmctl tail --session <id> [--provider <name>]
1836
1862
  lmctl tail --run <id> [--watch] [--watch-interval Ns]
1837
1863
  [--lines N] [--watch] [--watch-interval Ns] [--provider <name>]
1838
1864
 
1839
1865
  Print or watch provider session messages, or follow a managed run timeline.`});var SE={};ie(SE,{runInfo:()=>QD});function ZD(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function QD(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${zD}
1840
- `),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=D(r,"--json"),s=x(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(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=>tP(e,u,c,n))}catch(u){return fe(e,u)}}let o=Yt(YD,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:x(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 rP(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=At(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 _o(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 eP(e,i,a,l,n)}async function eP(t,e,r,n,s){let o;try{o=await fr(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}
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=D(r,"--json"),s=x(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(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=>tP(e,u,c,n))}catch(u){return fe(e,u)}}let o=Kt(YD,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:x(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 rP(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=At(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 ho(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 eP(e,i,a,l,n)}async function eP(t,e,r,n,s){let o;try{o=await dr(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}
1841
1867
  `),t.stdout.write(` Provider: ${o.provider}
1842
1868
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
1843
1869
  `),t.stdout.write(` CWD: ${o.cwd}
@@ -1846,7 +1872,7 @@ Print or watch provider session messages, or follow a managed run timeline.`});v
1846
1872
  `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out`),i.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${i.totalCachedInputTokens})`),t.stdout.write(`
1847
1873
  `),t.stdout.write(` Created: ${i.createdAt}
1848
1874
  `),t.stdout.write(` Modified: ${i.modifiedAt}
1849
- `),0)}async function tP(t,e,r,n){let s=cr(e,r);if(s===null)return w(t,`info: run ${r}: not found`);let o=Lr(e,r),i=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(W(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:o?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:i.totalInputTokens,totalOutputTokens:i.totalOutputTokens,agent_call_count:i.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
1875
+ `),0)}async function tP(t,e,r,n){let s=lr(e,r);if(s===null)return w(t,`info: run ${r}: not found`);let o=Lr(e,r),i=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(W(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:o?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:i.totalInputTokens,totalOutputTokens:i.totalOutputTokens,agent_call_count:i.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
1850
1876
  `),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
1851
1877
  `),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
1852
1878
  `),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
@@ -1856,12 +1882,12 @@ Print or watch provider session messages, or follow a managed run timeline.`});v
1856
1882
  `),t.stdout.write(` Steps: ${s.steps.length}
1857
1883
  `),t.stdout.write(` AgentCalls: ${i.agentCallCount}
1858
1884
  `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
1859
- `),0)}async function rP(t,e,r){let n;try{n=$e(e)}catch(u){return w(t,`info: ${u instanceof Error?u.message:String(u)}`)}let s=[],o=0;for(let u of n.members){if(u.teamfile!==void 0||u.session===void 0||u.session.length===0)continue;let d=null;try{d=await fr(u.session,u.provider)}catch(m){t.stderr.write(`warning: failed to load session "${u.session}" for ${u.alias} (${u.provider}): ${m instanceof Error?m.message:String(m)}
1885
+ `),0)}async function rP(t,e,r){let n;try{n=$e(e)}catch(u){return w(t,`info: ${u instanceof Error?u.message:String(u)}`)}let s=[],o=0;for(let u of n.members){if(u.teamfile!==void 0||u.session===void 0||u.session.length===0)continue;let d=null;try{d=await dr(u.session,u.provider)}catch(m){t.stderr.write(`warning: failed to load session "${u.session}" for ${u.alias} (${u.provider}): ${m instanceof Error?m.message:String(m)}
1860
1886
  `)}let f=d?.messageCount??0;s.push({alias:u.alias,provider:u.provider,sessionid:u.session,messageCount:f,model:d?.model??"(unknown)",lastContext:d?.lastInputTokens}),o+=f}if(r)return W(t,{team:n.name,members:s,total:{messageCount:o}}),0;let i=Math.max(7,...s.map(u=>u.sessionid.length)),a=Math.max(5,...s.map(u=>u.alias.length))+1,l=Math.max(8,...s.map(u=>u.provider.length))+1,c=Math.max(5,...s.map(u=>u.model.length))+1;t.stdout.write(`TEAM: ${n.name}
1861
1887
  `),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
1862
1888
  `);for(let u of s){let d=u.lastContext!==void 0?ZD(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)}
1863
1889
  `)}return t.stdout.write(` ${"TOTAL".padEnd(i)} ${"".padEnd(a)}${"".padEnd(l)}${"".padEnd(c)}${String(o).padStart(6)}
1864
- `),0}var YD,zD,kE=T(()=>{"use strict";Fr();Se();ns();xt();St();YD={name:"info",allowsBareTeamfile:!0,supportsRaw:!0},zD=`usage: lmctl info [target] [alias]
1890
+ `),0}var YD,zD,kE=T(()=>{"use strict";Fr();Se();ss();xt();St();YD={name:"info",allowsBareTeamfile:!0,supportsRaw:!0},zD=`usage: lmctl info [target] [alias]
1865
1891
  lmctl info <teamfile> # team rollup
1866
1892
  lmctl info <sessionid> [--provider <name>]
1867
1893
  [--json]
@@ -1878,22 +1904,22 @@ Show provider session details, team rollups, or managed run state/token totals.`
1878
1904
  [--recursive] [--all] [--format table|teamfile|json] [--json]
1879
1905
  lmctl ls --runs [--limit N] [--format table|json] [--json]
1880
1906
 
1881
- List native provider sessions in scope, or list recent managed runs with --runs.`,sP=50,vE=500});import{existsSync as jE,readFileSync as xE}from"node:fs";import{homedir as cP}from"node:os";import{dirname as uP,resolve as AE}from"node:path";import{fileURLToPath as dP}from"node:url";function RE(t,e={}){let r=[],n=pP(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=wP(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: ${$E(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}": `+(Hi??"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: ${$E(i)}`)}return r}function pP(t){if(!t&&ls)return ls;let e=new Map,r,n=t??_P();if(!jE(n))return r=`${n} not found`,t||Du(e),t||(ls=e),t||(Hi=r),e;let s;try{s=xE(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Du(e),t||(ls=e),t||(Hi=r),e}for(let[o,i]of Object.entries(fP)){let a=hP(s,i),l=gP(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Du(e),t||(ls=e),t||(Hi=r),e}function _P(){let t=uP(dP(import.meta.url));return AE(t,"..","..","..","durable-memory","model_selection.md")}function Du(t){for(let[e,r]of Object.entries(mP))t.set(e,r)}function hP(t,e){let n=new RegExp(`^## ${EP(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 gP(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 wP(t){let e=t??AE(cP(),".config","opencode","opencode.json"),r=pf();if(!jE(e))return{available:!0,models:r};let n;try{n=JSON.parse(xE(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([...yP(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function yP(t){if(!Pu(t))return[];let e=qi(t.provider)??qi(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Pu(s))continue;let o=qi(s.models)??qi(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function qi(t){return Pu(t)?t:null}function Pu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function $E(t){return t.length>0?t.join(", "):"(none)"}function EP(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var fP,mP,ls,Hi,OE=T(()=>{"use strict";Ea();fP={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},mP={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"]},ls=null});var Fu={};ie(Fu,{_setTeamfileSeedForTests:()=>IP,buildRootTeamRegistrationRow:()=>BE,persistTeamConnections:()=>HE,registerRootTeam:()=>qE,runLint:()=>NP,runSeed:()=>$P,sha256Text:()=>WE});import{createHash as bP}from"node:crypto";import{existsSync as TP,readFileSync as DE,realpathSync as CE,writeFileSync as Xi}from"node:fs";import{dirname as PE,join as SP,resolve as FE}from"node:path";function IP(t){UE=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Tt(),el)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}async function NP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(kP),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1907
+ List native provider sessions in scope, or list recent managed runs with --runs.`,sP=50,vE=500});import{existsSync as jE,readFileSync as xE}from"node:fs";import{homedir as cP}from"node:os";import{dirname as uP,resolve as AE}from"node:path";import{fileURLToPath as dP}from"node:url";function RE(t,e={}){let r=[],n=pP(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=wP(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: ${$E(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}": `+(Hi??"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: ${$E(i)}`)}return r}function pP(t){if(!t&&cs)return cs;let e=new Map,r,n=t??_P();if(!jE(n))return r=`${n} not found`,t||Du(e),t||(cs=e),t||(Hi=r),e;let s;try{s=xE(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Du(e),t||(cs=e),t||(Hi=r),e}for(let[o,i]of Object.entries(fP)){let a=hP(s,i),l=gP(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Du(e),t||(cs=e),t||(Hi=r),e}function _P(){let t=uP(dP(import.meta.url));return AE(t,"..","..","..","durable-memory","model_selection.md")}function Du(t){for(let[e,r]of Object.entries(mP))t.set(e,r)}function hP(t,e){let n=new RegExp(`^## ${EP(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 gP(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 wP(t){let e=t??AE(cP(),".config","opencode","opencode.json"),r=pf();if(!jE(e))return{available:!0,models:r};let n;try{n=JSON.parse(xE(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([...yP(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function yP(t){if(!Pu(t))return[];let e=qi(t.provider)??qi(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Pu(s))continue;let o=qi(s.models)??qi(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function qi(t){return Pu(t)?t:null}function Pu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function $E(t){return t.length>0?t.join(", "):"(none)"}function EP(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var fP,mP,cs,Hi,OE=T(()=>{"use strict";Ea();fP={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},mP={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},cs=null});var Fu={};ie(Fu,{_setTeamfileSeedForTests:()=>IP,buildRootTeamRegistrationRow:()=>BE,persistTeamConnections:()=>HE,registerRootTeam:()=>qE,runLint:()=>NP,runSeed:()=>$P,sha256Text:()=>WE});import{createHash as bP}from"node:crypto";import{existsSync as TP,readFileSync as DE,realpathSync as CE,writeFileSync as Xi}from"node:fs";import{dirname as PE,join as SP,resolve as FE}from"node:path";function IP(t){UE=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Tt(),el)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}async function NP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(kP),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1882
1908
  `),2;let r=t[0],n;try{n=$e(r)}catch(i){return Ji(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=gu(n,PE(FE(r))),o=RE(n.members);for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1883
- `);if(s.length===0)try{Er(r)}catch(i){return e.stderr.write(`error: connect: ${i instanceof Error?i.message:String(i)}
1884
- `),1}for(let i of n.members)i.teamfile!==void 0&&e.stderr.write(`warning: member "${i.alias}" uses deprecated member-level teamfile=; migrate to team-level _CONNECT_ (team=${i.alias} teamfile=${i.teamfile})
1885
- `),i.session!==void 0&&i.session.length<cs&&o.push(`${i.alias}: sessionid is shorter than ${cs} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1909
+ `);if(s.length===0)try{yr(r)}catch(i){return e.stderr.write(`error: connect: ${i instanceof Error?i.message:String(i)}
1910
+ `),1}for(let i of n.members)i.teamfile!==void 0&&e.stderr.write(`warning: member "${i.alias}" uses deprecated member-level teamfile=; migrate to team-level _CONNECT_ (alias=${i.alias} teamfile=${i.teamfile})
1911
+ `),i.session!==void 0&&i.session.length<us&&o.push(`${i.alias}: sessionid is shorter than ${us} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1886
1912
  `);return await J(e,i=>{Dy(r,i,a=>e.stderr.write(`${a}
1887
1913
  `))}),s.length>0?1:(e.stdout.write(`ok
1888
1914
  `),0)}async function $P(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(vP),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
1889
1915
  `),2;let r=t[0],n=FE(r),s;try{s=CE(n)}catch(y){return Ji(e,`${r}: ${y instanceof Error?y.message:String(y)}`)}let o=PE(n),i;try{i=$e(n)}catch(y){return Ji(e,`${r}: ${y instanceof Error?y.message:String(y)}`)}let a=gu(i,o);if(a.length>0){for(let y of a)e.stderr.write(`error: ${y.field}: ${y.message}
1890
- `);return 1}let l;try{l=Er(n)}catch(y){return Ji(e,`connect: ${y instanceof Error?y.message:String(y)}`)}let c=DE(n,"utf8"),u=c.split(`
1891
- `),d=xP(u),f=0,m=i.members.filter(y=>y.teamfile!==void 0?!1:y.session===void 0||y.session.length<cs);for(let y of m)if(!MP(y.provider))return e.stderr.write(`error: ${y.alias}: invalid provider "${y.provider}"
1916
+ `);return 1}let l;try{l=yr(n)}catch(y){return Ji(e,`connect: ${y instanceof Error?y.message:String(y)}`)}let c=DE(n,"utf8"),u=c.split(`
1917
+ `),d=xP(u),f=0,m=i.members.filter(y=>y.teamfile!==void 0?!1:y.session===void 0||y.session.length<us);for(let y of m)if(!MP(y.provider))return e.stderr.write(`error: ${y.alias}: invalid provider "${y.provider}"
1892
1918
  `),1;let p=i.members.find(y=>y.alias.toLowerCase()==="lead");if(p!==void 0){$r("lmctl","lmctl_chat",{warn:k=>e.stderr.write(`${k}
1893
1919
  `)});let y=p.sessiondir??o;try{LP(y)&&e.stdout.write(`.mcp.json installed in ${y}
1894
1920
  `)}catch(k){e.stderr.write(`warning: .mcp.json install failed: ${k instanceof Error?k.message:String(k)}
1895
- `)}}for(let y of i.members){if(y.teamfile!==void 0)continue;if(y.session!==void 0&&y.session.length>=cs){e.stderr.write(`warning: ${y.alias}: existing sessionid preserved; skipping
1896
- `);continue}let k=y.sessiondir??o,v=await UE({provider:y.provider,cwd:k,...y.model!==void 0?{model:y.model}:{},...y.alias.toLowerCase()==="lead"?{prompt:jP(n,c,i.members)}:{}});if(v.error!==void 0||v.sessionId===void 0||v.sessionId.length<cs)return e.stderr.write(`error: ${y.alias}: seed failed${v.error!==void 0?`: ${v.error}`:"; provider did not report a sessionid"}
1921
+ `)}}for(let y of i.members){if(y.teamfile!==void 0)continue;if(y.session!==void 0&&y.session.length>=us){e.stderr.write(`warning: ${y.alias}: existing sessionid preserved; skipping
1922
+ `);continue}let k=y.sessiondir??o,v=await UE({provider:y.provider,cwd:k,...y.model!==void 0?{model:y.model}:{},...y.alias.toLowerCase()==="lead"?{prompt:jP(n,c,i.members)}:{}});if(v.error!==void 0||v.sessionId===void 0||v.sessionId.length<us)return e.stderr.write(`error: ${y.alias}: seed failed${v.error!==void 0?`: ${v.error}`:"; provider did not report a sessionid"}
1897
1923
  `),1;let $=d.get(y.alias.toLowerCase());if($===void 0)return e.stderr.write(`error: ${y.alias}: could not find matching _MEMBER_ line to update
1898
1924
  `),1;let S=LE(u[$],"sessionid",v.sessionId);y.sessiondir===void 0&&(S=LE(S,"sessiondir",o)),u[$]=S,f+=1,Xi(n,u.join(`
1899
1925
  `),"utf8"),e.stdout.write(`${y.alias}: seeded ${v.sessionId}
@@ -1909,7 +1935,7 @@ ${t}`:`${r}
1909
1935
  `}function CP(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function LP(t){let e=SP(t,".mcp.json"),r=CP();if(!TP(e))return Xi(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
1910
1936
  `,"utf8"),!0;let n;try{n=JSON.parse(DE(e,"utf8"))}catch{return!1}if(n===null||typeof n!="object"||Array.isArray(n))return!1;let s=ME(n.mcpServers)?{...n.mcpServers}:{},o=ME(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,Xi(e,JSON.stringify(n,null,2)+`
1911
1937
  `,"utf8"),!0)}function ME(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function MP(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Ji(t,e){return t.stderr.write(`error: ${e}
1912
- `),1}var cs,kP,vP,UE,Uu=T(()=>{"use strict";xt();OE();$s();Se();Ui();cs=5,kP=`usage: lmctl lint <teamfile.lmctl>
1938
+ `),1}var us,kP,vP,UE,Uu=T(()=>{"use strict";xt();OE();js();Se();Ui();us=5,kP=`usage: lmctl lint <teamfile.lmctl>
1913
1939
 
1914
1940
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
1915
1941
  `,vP=`usage: lmctl seed <teamfile.lmctl>
@@ -1922,48 +1948,48 @@ member's configured native provider.
1922
1948
  `),2;if(!JE(o))return e.stderr.write(`error: source teamfile not found: ${o}
1923
1949
  `),1;if(!JE(i))return e.stderr.write(`error: target teamfile not found: ${i}
1924
1950
  `),1;try{WP(o,"source")}catch(d){return e.stderr.write(`error: ${d instanceof Error?d.message:String(d)}
1925
- `),1}let a=DP(o,"utf8"),l=BP(o,i),c=`_CONNECT_ team=${s} teamfile=${GP(l)}`;if(HP(a,VE(o),s,Gi(i)))return e.stderr.write(`error: _CONNECT_ team "${s}" to ${Gi(i)} already exists in ${o}
1926
- `),1;let u=qP(a,c);XE(o,u,"utf8");try{Er(o)}catch(d){return XE(o,a,"utf8"),e.stderr.write(`error: connect validation failed; source restored: ${d instanceof Error?d.message:String(d)}
1951
+ `),1}let a=DP(o,"utf8"),l=BP(o,i),c=`_CONNECT_ alias=${s} teamfile=${VP(l)}`;if(JP(a,VE(o),s,Gi(i)))return e.stderr.write(`error: _CONNECT_ alias "${s}" to ${Gi(i)} already exists in ${o}
1952
+ `),1;let u=qP(a,c);XE(o,u,"utf8");try{yr(o)}catch(d){return XE(o,a,"utf8"),e.stderr.write(`error: connect validation failed; source restored: ${d instanceof Error?d.message:String(d)}
1927
1953
  `),1}return e.stdout.write(`Connected ${o} -> ${s} (${Gi(i)})
1928
1954
  `),e.stdout.write(`Run: lmctl lint ${o}
1929
1955
  `),e.stdout.write(`Then run: lmctl seed ${o}
1930
- `),0}function WP(t,e){let r=$e(t);if(r.parseErrors.length>0)throw new Error(`${e} teamfile parse error: ${r.parseErrors.join("; ")}`);if(it(r)===void 0)throw new Error(`${e} teamfile has no Lead: ${t}`)}function BP(t,e){let r=PP(VE(t),e).replace(/\\/g,"/");return r.startsWith(".")?r:`./${r}`}function qP(t,e){let r=t.split(`
1931
- `),n=XP(r);return r.splice(n,0,e),r.join(`
1932
- `)}function HP(t,e,r,n){return t.split(`
1933
- `).some(s=>/^\s*_CONNECT_(?:\s|$)/.test(s)&&KE(s,"team")===r&&JP(e,s)===n)}function JP(t,e){let r=KE(e,"teamfile");if(r===void 0||r.length===0)return null;try{return Gi(Wu(t,r))}catch{return null}}function XP(t){let e=t.length;for(;e>0&&t[e-1]==="";)e-=1;return e}function KE(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function GP(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}var FP,GE,zE=T(()=>{"use strict";xt();FP=`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1956
+ `),0}function WP(t,e){let r=$e(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 BP(t,e){let r=PP(VE(t),e).replace(/\\/g,"/");return r.startsWith(".")?r:`./${r}`}function qP(t,e){let r=t.split(`
1957
+ `),n=HP(r),s=n>=0?n+1:GP(r);return r.splice(s,0,e),r.join(`
1958
+ `)}function HP(t){for(let e=t.length-1;e>=0;e-=1)if(/^\s*(?:_MEMBER_|_CONNECT_)(?:\s|$)/.test(t[e]))return e;return-1}function JP(t,e,r,n){return t.split(`
1959
+ `).some(s=>/^\s*_CONNECT_(?:\s|$)/.test(s)&&KE(s,"alias")===r&&XP(e,s)===n)}function XP(t,e){let r=KE(e,"teamfile");if(r===void 0||r.length===0)return null;try{return Gi(Wu(t,r))}catch{return null}}function GP(t){let e=t.length;for(;e>0&&t[e-1]==="";)e-=1;return e}function KE(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function VP(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}var FP,GE,zE=T(()=>{"use strict";xt();FP=`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1934
1960
 
1935
- Append a named team-level _CONNECT_ edge. The sender is always Lead, and the
1936
- target team's Lead is always the cross-team interface.
1961
+ Append a team-level _CONNECT_ edge to member <name> in the target teamfile.
1962
+ The sender is always the source team's Lead.
1937
1963
 
1938
1964
  After editing, run:
1939
1965
  lmctl lint <from.lmctl>
1940
1966
  lmctl seed <from.lmctl>
1941
- `,GE=/^[A-Za-z][A-Za-z0-9_-]*$/});var tb={};ie(tb,{runClone:()=>e1});import{existsSync as qu,mkdirSync as VP,readFileSync as KP,readdirSync as YP,statSync as QE,writeFileSync as zP}from"node:fs";import{basename as ZE,dirname as Bu,extname as ZP,join as eb,resolve as Vi}from"node:path";async function e1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(QP),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
1942
- `),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=Vi(r);if(!qu(u))throw new Error(`source not found: ${r}`);let f=QE(u).isDirectory()?t1(u):u;s=KP(f,"utf8"),o=Bu(f),i=f}}catch(u){return e.stderr.write(`error: ${u instanceof Error?u.message:String(u)}
1943
- `),1}let a=Vi(n),l=r1(a,i,n);if(qu(l))return e.stderr.write(`error: ${l} already exists.
1944
- `),1;let c=n1(s);return o!==null&&(c=s1(c,o,Bu(l))),VP(Bu(l),{recursive:!0}),zP(l,c,"utf8"),e.stdout.write(`Cloned ${r} -> ${l}
1967
+ `,GE=/^[A-Za-z][A-Za-z0-9_-]*$/});var tb={};ie(tb,{runClone:()=>t1});import{existsSync as qu,mkdirSync as KP,readFileSync as YP,readdirSync as zP,statSync as QE,writeFileSync as ZP}from"node:fs";import{basename as ZE,dirname as Bu,extname as QP,join as eb,resolve as Vi}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(e1),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
1968
+ `),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=Vi(r);if(!qu(u))throw new Error(`source not found: ${r}`);let f=QE(u).isDirectory()?r1(u):u;s=YP(f,"utf8"),o=Bu(f),i=f}}catch(u){return e.stderr.write(`error: ${u instanceof Error?u.message:String(u)}
1969
+ `),1}let a=Vi(n),l=n1(a,i,n);if(qu(l))return e.stderr.write(`error: ${l} already exists.
1970
+ `),1;let c=s1(s);return o!==null&&(c=o1(c,o,Bu(l))),KP(Bu(l),{recursive:!0}),ZP(l,c,"utf8"),e.stdout.write(`Cloned ${r} -> ${l}
1945
1971
  `),e.stdout.write(`Edit ${l}; only _MEMBER_ lines are parsed, everything else is free-form.
1946
1972
  `),e.stdout.write(`After editing, run: lmctl lint ${l}
1947
1973
  `),e.stdout.write(`Then run: lmctl seed ${l}
1948
- `),0}function t1(t){let e=YP(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 eb(t,e[0])}function r1(t,e,r){if(r.endsWith("/")||qu(t)&&QE(t).isDirectory()){let n=ZE(e).endsWith(".lmctl")?ZE(e):"team.lmctl";return eb(t,n)}return ZP(t)?t:`${t}.lmctl`}function n1(t){return t.split(`
1974
+ `),0}function r1(t){let e=zP(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 eb(t,e[0])}function n1(t,e,r){if(r.endsWith("/")||qu(t)&&QE(t).isDirectory()){let n=ZE(e).endsWith(".lmctl")?ZE(e):"team.lmctl";return eb(t,n)}return QP(t)?t:`${t}.lmctl`}function s1(t){return t.split(`
1949
1975
  `).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(`
1950
- `)}function s1(t,e,r){let n=Vi(e),s=Vi(r);return n===s?t:t.split(`
1976
+ `)}function o1(t,e,r){let n=Vi(e),s=Vi(r);return n===s?t:t.split(`
1951
1977
  `).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(`
1952
- `)}var QP,rb=T(()=>{"use strict";QP=`usage: lmctl clone <source> <dest>
1978
+ `)}var e1,rb=T(()=>{"use strict";e1=`usage: lmctl clone <source> <dest>
1953
1979
 
1954
1980
  Copy a teamfile and strip its session ids, producing a static editable template.
1955
1981
 
1956
1982
  Examples:
1957
1983
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
1958
- `});var ob={};ie(ob,{runPlan:()=>d1});import{existsSync as o1,mkdirSync as i1,writeFileSync as a1}from"node:fs";import{basename as nb,extname as sb,join as l1,resolve as c1}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(u1),0;let r=P(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
1984
+ `});var ob={};ie(ob,{runPlan:()=>f1});import{existsSync as i1,mkdirSync as a1,writeFileSync as l1}from"node:fs";import{basename as nb,extname as sb,join as c1,resolve as u1}from"node:path";async function f1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(d1),0;let r=P(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
1959
1985
  `),e.stderr.write(`usage: lmctl plan [options] <directory>
1960
1986
  `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
1961
- `),2;let n=c1(r.positionals[0]);i1(n,{recursive:!0});let s=x(r,"--team")??nb(n),o=x(r,"--provider")??"claude",i=l1(n,f1(s));return o1(i)?(e.stderr.write(`error: ${i} already exists.
1962
- `),1):(a1(i,p1({teamName:m1(s),workdir:n,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
1987
+ `),2;let n=u1(r.positionals[0]);a1(n,{recursive:!0});let s=x(r,"--team")??nb(n),o=x(r,"--provider")??"claude",i=c1(n,m1(s));return i1(i)?(e.stderr.write(`error: ${i} already exists.
1988
+ `),1):(l1(i,_1({teamName:p1(s),workdir:n,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
1963
1989
  `),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
1964
1990
  `),e.stdout.write(`After editing, run: lmctl lint ${i}
1965
1991
  `),e.stdout.write(`Then run: lmctl seed ${i}
1966
- `),0)}function f1(t){return sb(t)?t:`${t}.lmctl`}function m1(t){let e=sb(t);return e?nb(t,e):t}function p1(t){let{teamName:e,workdir:r,leadProvider:n}=t;return`# ${e}
1992
+ `),0)}function m1(t){return sb(t)?t:`${t}.lmctl`}function p1(t){let e=sb(t);return e?nb(t,e):t}function _1(t){let{teamName:e,workdir:r,leadProvider:n}=t;return`# ${e}
1967
1993
 
1968
1994
  # Lead, you take tasks from the operator. Clarify only when needed,
1969
1995
  # delegate implementation to Coder, and send completed work to
@@ -1992,7 +2018,7 @@ _MEMBER_ alias=Reviewer3 provider=agy sessiondir=${r}
1992
2018
  When a task is done, create or update docs in durable-memory/ to
1993
2019
  capture durable project knowledge. Keep durable-memory/index.md current
1994
2020
  so new agents can quickly discover and understand the project.
1995
- `}var u1,ib=T(()=>{"use strict";Se();u1=`usage: lmctl plan [options] <directory>
2021
+ `}var d1,ib=T(()=>{"use strict";Se();d1=`usage: lmctl plan [options] <directory>
1996
2022
 
1997
2023
  Generate a starter lmctl team document template for a directory.
1998
2024
 
@@ -2007,7 +2033,7 @@ Examples:
2007
2033
 
2008
2034
  # Same shape, codex for the Lead and Reviewer2
2009
2035
  lmctl plan ./backend --provider codex
2010
- `});var cb={};ie(cb,{SIZE_WARN_EST_TOKENS:()=>us,estimateTokens:()=>lb,runTerminal:()=>w1});import{spawn as _1}from"node:child_process";import{statSync as h1}from"node:fs";async function w1(t,e){if(t.includes("--help")||t.includes("-h"))return S1(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(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"?D(r,i):x(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await J(e,async i=>{let a=x(r,"--alias"),l=xg(i,s,a);return"err"in l?w(e,l.err):Hu(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"?D(r,l):x(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=Yt(g1,{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=>y1(e,a.teamfile,a.alias,l))}try{return await J(e,async s=>{let o=E1(e,s,r);if(typeof o=="number")return o;let i=x(r,"--alias");return D(r,"--size")?T1(e,s,o,i,D(r,"--json")):b1(e,s,o,i)})}catch(s){return fe(e,s)}}async function y1(t,e,r,n){let s;try{s=At(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):fe(t,o)}return Hu(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir})}async function Hu(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!po(r))return w(t,`no resume incantation for provider "${r}"`);if(!Km.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Tl(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=_1(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 E1(t,e,r){let n=x(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=vo(t,e,x(r,"--project"));return typeof s=="number"?s:Io(t,e,s,void 0)}async function b1(t,e,r,n){let s=No(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`):Hu(t,{provider:ke(s),sessionid:o,sessiondir:s.sessiondir})}function lb(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=h1(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 T1(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;po(c)&&(u=await fr(l,c));let d=lb(u),f=d.est>us;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?Pr(c,l):null})}if(s)return W(t,{estimate:!0,legend:ab,guide_tokens:us,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2036
+ `});var cb={};ie(cb,{SIZE_WARN_EST_TOKENS:()=>ds,estimateTokens:()=>lb,runTerminal:()=>y1});import{spawn as h1}from"node:child_process";import{statSync as g1}from"node:fs";async function y1(t,e){if(t.includes("--help")||t.includes("-h"))return k1(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(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"?D(r,i):x(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await J(e,async i=>{let a=x(r,"--alias"),l=xg(i,s,a);return"err"in l?w(e,l.err):Hu(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"?D(r,l):x(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=Kt(w1,{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=>E1(e,a.teamfile,a.alias,l))}try{return await J(e,async s=>{let o=b1(e,s,r);if(typeof o=="number")return o;let i=x(r,"--alias");return D(r,"--size")?S1(e,s,o,i,D(r,"--json")):T1(e,s,o,i)})}catch(s){return fe(e,s)}}async function E1(t,e,r,n){let s;try{s=At(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):fe(t,o)}return Hu(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir})}async function Hu(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!_o(r))return w(t,`no resume incantation for provider "${r}"`);if(!Km.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Tl(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=h1(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 b1(t,e,r){let n=x(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=Io(t,e,x(r,"--project"));return typeof s=="number"?s:No(t,e,s,void 0)}async function T1(t,e,r,n){let s=$o(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`):Hu(t,{provider:ke(s),sessionid:o,sessiondir:s.sessiondir})}function lb(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=g1(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 S1(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;_o(c)&&(u=await dr(l,c));let d=lb(u),f=d.est>ds;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?Pr(c,l):null})}if(s)return W(t,{estimate:!0,legend:ab,guide_tokens:ds,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2011
2037
  `),t.stdout.write(`${ab}
2012
2038
  `);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)
2013
2039
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2015,7 +2041,7 @@ Examples:
2015
2041
  session yourself:
2016
2042
  ${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
2017
2043
  (or: lmctl terminal --team ${r.name} --alias ${a.alias})
2018
- `)}return 0}function S1(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2044
+ `)}return 0}function k1(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2019
2045
  lmctl terminal <teamfile> <alias>
2020
2046
  lmctl terminal --run <id> [--alias A]
2021
2047
  lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
@@ -2041,101 +2067,101 @@ Examples:
2041
2067
  exact provider count: the messages path slightly
2042
2068
  under-counts code-dense text; the byte fallback
2043
2069
  over-counts (JSONL overhead \u2192 safe over-warn); CJK is
2044
- denser (under-warns). At >${us} est
2070
+ denser (under-warns). At >${ds} est
2045
2071
  tokens it surfaces the resume incantation so YOU can
2046
2072
  open & self-compact. Nothing is ever changed
2047
- automatically; ${us} is a guide, not a gate.
2048
- `),0}var g1,us,ab,ub=T(()=>{"use strict";Le();Fr();Se();Cl();ns();Ei();g1={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},us=2e5,ab="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import k1 from"better-sqlite3";import{resolve as Ju,dirname as pb}from"node:path";function Xu(t,e){let r=Ju(t);for(;;){let n=v1(e,r);if(n!==null)return n;let s=pb(r);if(s===r)return null;r=s}}function v1(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Ki(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Yi(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function _b(t){if(t.io.dal!==void 0){let o=db(t.io.dal,t.cwd,t.projectName);if(o===null)throw new Ye(fb(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(Ki()||Yi()){let o=de(),i=pe({path:o}),a=db(i,t.cwd,t.projectName);if(a===null)throw i.close(),new Ye(fb(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Yi()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Ki()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?gb(t.cwd):I1(t.projectName),r=wb(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 hb(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Ki()||Yi()){let n=de();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Yi()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Ki()?"explicit-db":"explicit-workspace"}}let e;try{e=gb(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=wb(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 db(t,e,r){return r!==void 0?t.findProjectByName(r):Xu(e,t)}function fb(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 I1(t){let e=[];for(let r of ta())for(let n of yb(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 gb(t){let e=N1(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of ta())for(let o of yb(s)){let i=Ju(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 wb(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>
2073
+ automatically; ${ds} is a guide, not a gate.
2074
+ `),0}var w1,ds,ab,ub=T(()=>{"use strict";Le();Fr();Se();Cl();ss();bi();w1={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},ds=2e5,ab="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import v1 from"better-sqlite3";import{resolve as Ju,dirname as pb}from"node:path";function Xu(t,e){let r=Ju(t);for(;;){let n=I1(e,r);if(n!==null)return n;let s=pb(r);if(s===r)return null;r=s}}function I1(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Ki(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Yi(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function _b(t){if(t.io.dal!==void 0){let o=db(t.io.dal,t.cwd,t.projectName);if(o===null)throw new Ye(fb(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(Ki()||Yi()){let o=de(),i=pe({path:o}),a=db(i,t.cwd,t.projectName);if(a===null)throw i.close(),new Ye(fb(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Yi()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Ki()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?gb(t.cwd):N1(t.projectName),r=wb(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 hb(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Ki()||Yi()){let n=de();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Yi()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Ki()?"explicit-db":"explicit-workspace"}}let e;try{e=gb(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=wb(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 db(t,e,r){return r!==void 0?t.findProjectByName(r):Xu(e,t)}function fb(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 N1(t){let e=[];for(let r of ta())for(let n of yb(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 gb(t){let e=$1(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of ta())for(let o of yb(s)){let i=Ju(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 wb(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>
2049
2075
  ${mb(n)}`):new Ye(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2050
2076
  ${mb(n)}`)}function mb(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2051
- `)}function N1(t){let e=[],r=Ju(t);for(;;){e.push(r);let n=pb(r);if(n===r)return e;r=n}}function yb(t){let e=null;try{e=new k1(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>aa)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,Gu=T(()=>{"use strict";ca();Le();qe();Ye=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var vb={};ie(vb,{assertNoCrossWorkflowSubflowCycle:()=>kb,firstUnregisteredArchetype:()=>Sb,runWorkflow:()=>F1});import{createHash as Ku,randomUUID as $1}from"node:crypto";import{existsSync as j1,readFileSync as Yu,readdirSync as x1,writeFileSync as A1}from"node:fs";import{basename as R1,join as O1,resolve as C1}from"node:path";import{pathToFileURL as L1}from"node:url";function zu(t,e){return{source_uri:L1(C1(t)).href,source_sha256:Ku("sha256").update(e).digest("hex")}}async function F1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(P1),0;try{return r==="run"?await U1(n,e):await J(e,s=>{switch(r){case"load":return q1(n,e,s);case"author":return H1(n,e,s);case"list":return J1(n,e,s);case"sync":return X1(n,e,s);case"export":return G1(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 U1(t,e){let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose"]);if(r.error!==void 0)return on(e,r.error);if(r.positionals.length>0)return on(e,"usage: workflow run (--workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]");let n=D(r,"--json"),s=x(r,"--workflow"),o=x(r,"--project"),i=x(r,"--job"),a=x(r,"--inputs"),l=D(r,"--verbose");if(s!==void 0&&i!==void 0)return on(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return on(e,"usage: workflow run (--workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]");if(i!==void 0&&(o!==void 0||a!==void 0))return on(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let d=B1(i);if(d===null)return on(e,`invalid --job: ${i}`);let f=hb({cwd:process.cwd(),io:e});try{let m=await si({dal:f.dal,job_id:d,worker_id:Eb()});return bb(e,m,{json:n,workflowName:null,projectName:null,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}let c=W1(a,e);if(c===Vu)return 2;let u=_b({cwd:process.cwd(),io:e,projectName:o});try{let d=u.dal.getWorkflowByName(s);if(d===null)return w(e,`workflow not found: ${s}`);let f=u.dal.enqueueJob({project_id:u.project.id,workflow_id_override:d.id,source:"cli-workflow-run",payload:JSON.stringify(c),priority:0}),m=await si({dal:u.dal,job_id:f.id,worker_id:Eb()});return bb(e,m,{json:n,workflowName:s,projectName:u.project.name,workspaceName:u.workspaceName,dbPath:u.dbPath,verbose:l})}finally{u.ownsDal&&u.dal.close()}}function on(t,e){return t.stderr.write(`error: ${e}
2052
- `),2}function W1(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)}
2077
+ `)}function $1(t){let e=[],r=Ju(t);for(;;){e.push(r);let n=pb(r);if(n===r)return e;r=n}}function yb(t){let e=null;try{e=new v1(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>aa)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,Gu=T(()=>{"use strict";ca();Le();qe();Ye=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var vb={};ie(vb,{assertNoCrossWorkflowSubflowCycle:()=>kb,firstUnregisteredArchetype:()=>Sb,runWorkflow:()=>U1});import{createHash as Ku,randomUUID as j1}from"node:crypto";import{existsSync as x1,readFileSync as Yu,readdirSync as A1,writeFileSync as R1}from"node:fs";import{basename as O1,join as C1,resolve as L1}from"node:path";import{pathToFileURL as M1}from"node:url";function zu(t,e){return{source_uri:M1(L1(t)).href,source_sha256:Ku("sha256").update(e).digest("hex")}}async function U1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(F1),0;try{return r==="run"?await W1(n,e):await J(e,s=>{switch(r){case"load":return H1(n,e,s);case"author":return J1(n,e,s);case"list":return X1(n,e,s);case"sync":return G1(n,e,s);case"export":return V1(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 W1(t,e){let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose"]);if(r.error!==void 0)return on(e,r.error);if(r.positionals.length>0)return on(e,"usage: workflow run (--workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]");let n=D(r,"--json"),s=x(r,"--workflow"),o=x(r,"--project"),i=x(r,"--job"),a=x(r,"--inputs"),l=D(r,"--verbose");if(s!==void 0&&i!==void 0)return on(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return on(e,"usage: workflow run (--workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]");if(i!==void 0&&(o!==void 0||a!==void 0))return on(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let d=q1(i);if(d===null)return on(e,`invalid --job: ${i}`);let f=hb({cwd:process.cwd(),io:e});try{let m=await oi({dal:f.dal,job_id:d,worker_id:Eb()});return bb(e,m,{json:n,workflowName:null,projectName:null,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}let c=B1(a,e);if(c===Vu)return 2;let u=_b({cwd:process.cwd(),io:e,projectName:o});try{let d=u.dal.getWorkflowByName(s);if(d===null)return w(e,`workflow not found: ${s}`);let f=u.dal.enqueueJob({project_id:u.project.id,workflow_id_override:d.id,source:"cli-workflow-run",payload:JSON.stringify(c),priority:0}),m=await oi({dal:u.dal,job_id:f.id,worker_id:Eb()});return bb(e,m,{json:n,workflowName:s,projectName:u.project.name,workspaceName:u.workspaceName,dbPath:u.dbPath,verbose:l})}finally{u.ownsDal&&u.dal.close()}}function on(t,e){return t.stderr.write(`error: ${e}
2078
+ `),2}function B1(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)}
2053
2079
  `),Vu}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2054
- `),Vu):r}function B1(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Eb(){return`cli-${process.pid}-${$1().slice(0,8)}`}function bb(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})`:""}
2080
+ `),Vu):r}function q1(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Eb(){return`cli-${process.pid}-${j1().slice(0,8)}`}function bb(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})`:""}
2055
2081
  `),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}
2056
2082
  `):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
2057
2083
  `):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
2058
2084
  `),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
2059
- `)),e.status==="failed"?1:0}async function q1(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>>");let o=s;if(mr(s))try{o=await xn(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}let i=Yu(o,"utf8"),a=Re(i),l=r.upsertWorkflow({name:n,definition_schema_version:a.definition_schema_version,definition:i,...mr(s)?{source_uri:s,source_sha256:Ku("sha256").update(i).digest("hex")}:zu(s,i)});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2060
- `),0}function Sb(t){let e=Qo();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function Tb(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 kb(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 H1(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=Yu(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=Sb(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{kb(u,Tb(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return Tb(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,...zu(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:Ku("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)
2061
- `),0}function J1(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return D(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2085
+ `)),e.status==="failed"?1:0}async function H1(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>>");let o=s;if(fr(s))try{o=await xn(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}let i=Yu(o,"utf8"),a=Re(i),l=r.upsertWorkflow({name:n,definition_schema_version:a.definition_schema_version,definition:i,...fr(s)?{source_uri:s,source_sha256:Ku("sha256").update(i).digest("hex")}:zu(s,i)});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2086
+ `),0}function Sb(t){let e=ei();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function Tb(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 kb(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 J1(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=Yu(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=Sb(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{kb(u,Tb(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return Tb(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,...zu(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:Ku("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)
2087
+ `),0}function X1(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return D(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2062
2088
  `)}${s.length>0?`
2063
- `:""}`),0}function X1(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);Eo({swallow:!0});let s=tp(),o=[];try{o=j1(s)?x1(s).filter(c=>M1.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=O1(s,c),d=Yu(u,"utf8"),f;try{f=Re(d)}catch($){return w(e,`compile failed for ${c}: ${$ instanceof Error?$.message:String($)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:R1(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,y=zu(u,d),k=r.getWorkflowByName(p);if(k!==null&&k.source_sha256===y.source_sha256){l+=1;continue}let v=k===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...y}),v?i+=1:a+=1}return D(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
2064
- `),0}function G1(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:D1,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)}
2065
- `,c=x(n,"--out");return c!==void 0?(A1(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2066
- `)):e.stdout.write(l),0}var M1,D1,P1,Vu,Ib=T(()=>{"use strict";yc();Xr();To();Il();Se();Gu();Gn();M1=[".compound.json",".lmctl"],D1="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",P1=`usage: lmctl workflow <load|author|list|sync|export|run>
2089
+ `:""}`),0}function G1(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);bo({swallow:!0});let s=tp(),o=[];try{o=x1(s)?A1(s).filter(c=>D1.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=C1(s,c),d=Yu(u,"utf8"),f;try{f=Re(d)}catch($){return w(e,`compile failed for ${c}: ${$ instanceof Error?$.message:String($)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:O1(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,y=zu(u,d),k=r.getWorkflowByName(p);if(k!==null&&k.source_sha256===y.source_sha256){l+=1;continue}let v=k===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...y}),v?i+=1:a+=1}return D(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
2090
+ `),0}function V1(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:P1,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)}
2091
+ `,c=x(n,"--out");return c!==void 0?(R1(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2092
+ `)):e.stdout.write(l),0}var D1,P1,F1,Vu,Ib=T(()=>{"use strict";yc();Xr();So();Il();Se();Gu();Gn();D1=[".compound.json",".lmctl"],P1="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",F1=`usage: lmctl workflow <load|author|list|sync|export|run>
2067
2093
 
2068
2094
  Load, author, list, synchronize, inspect, or run workflow definitions. The
2069
2095
  run subcommand executes a workflow/job in the current project context.
2070
- `;Vu=Symbol("inputs-error")});var $b={};ie($b,{CANDIDATE_PROVIDERS:()=>zi,parseInitArgs:()=>Nb,probeProvider:()=>ds,probeProviderWithAuth:()=>ed,runInit:()=>Y1});import{spawnSync as V1}from"node:child_process";import{existsSync as K1}from"node:fs";import{homedir as Zu}from"node:os";import{join as Qu}from"node:path";async function Y1(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${sF()}
2096
+ `;Vu=Symbol("inputs-error")});var $b={};ie($b,{CANDIDATE_PROVIDERS:()=>zi,parseInitArgs:()=>Nb,probeProvider:()=>fs,probeProviderWithAuth:()=>ed,runInit:()=>z1});import{spawnSync as K1}from"node:child_process";import{existsSync as Y1}from"node:fs";import{homedir as Zu}from"node:os";import{join as Qu}from"node:path";async function z1(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${oF()}
2071
2097
  `),0;let n=Nb(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
2072
- `),2;let s=r.spawn??tF,o=r.env??rF,i=r.fileExists??K1,a=r.isTty??(!!process.stdin.isTTY&&!n.yes),l=r.promptYesNo??nF;try{return await J(e,async c=>{e.stdout.write(`Detecting providers...
2098
+ `),2;let s=r.spawn??rF,o=r.env??nF,i=r.fileExists??Y1,a=r.isTty??(!!process.stdin.isTTY&&!n.yes),l=r.promptYesNo??sF;try{return await J(e,async c=>{e.stdout.write(`Detecting providers...
2073
2099
  `);let u=await Promise.all(zi.map(f=>ed(f,{spawn:s,env:o,fileExists:i})));if(a)for(let f=0;f<u.length;f+=1){let m=u[f],p=td[m.provider];m.status==="ok"||m.status==="skipped"||p.optional&&m.status==="missing"||p.optional&&m.status==="unauthed"||(e.stderr.write(`
2074
- ${m.provider}: ${eF(m)}
2100
+ ${m.provider}: ${tF(m)}
2075
2101
  `),m.status==="missing"?(e.stderr.write(` install: ${p.install_hint}
2076
2102
  `),e.stderr.write(` fix: ${p.install_remediation}
2077
2103
  `)):m.status==="unauthed"?e.stderr.write(` fix: ${p.auth_remediation}
2078
2104
  `):(e.stderr.write(` install: ${p.install_hint}
2079
2105
  `),e.stderr.write(` after install, run \`${m.provider} login\` (or provider equivalent) to authenticate.
2080
- `)),!await l(" proceed when ready? [Y/n] "))||(u[f]=await ed(m.provider,{spawn:s,env:o,fileExists:i}))}Z1(e,u);let d=u.filter(f=>f.status==="ok"||f.status==="unverified").map(f=>f.provider);return d.length===0?(e.stderr.write(`
2106
+ `)),!await l(" proceed when ready? [Y/n] "))||(u[f]=await ed(m.provider,{spawn:s,env:o,fileExists:i}))}Q1(e,u);let d=u.filter(f=>f.status==="ok"||f.status==="unverified").map(f=>f.provider);return d.length===0?(e.stderr.write(`
2081
2107
  No usable providers detected. See install/auth hints above.
2082
2108
  `),1):(c.setConfig("providers.active",JSON.stringify(d)),e.stdout.write(`
2083
2109
  Setup complete. ${d.length} provider${d.length===1?"":"s"} active: ${d.join(", ")}.
2084
2110
  `),e.stdout.write(`Persisted to lmctl_config[providers.active].
2085
2111
  `),n.json&&e.stdout.write(`${JSON.stringify({active:d,results:u},null,2)}
2086
2112
  `),0)})}catch(c){return e.stderr.write(`init failed: ${c instanceof Error?c.message:String(c)}
2087
- `),1}}function ds(t,e){let r=td[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 ed(t,e){let r=ds(t,e.spawn);if(r.status==="missing"||r.status==="skipped"||r.status==="unverified")return r;let n=td[t],s=z1[t];if(s.kind==="spawn"){let a=e.spawn(s.cmd,s.args),l=(a.stdout??"").toString(),c=(a.stderr??"").toString(),u=`${l}
2088
- ${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 Z1(t,e){let r=Math.max(...zi.map(n=>n.length));for(let n of e){let s=Q1(n.status),o=n.provider.padEnd(r," ");t.stdout.write(` ${o} ${s} ${n.detail}
2089
- `)}}function Q1(t){switch(t){case"ok":return"\u2713";case"unauthed":return"\u26A0";case"unverified":return"?";case"missing":return"\u2717";case"skipped":return"-"}}function eF(t){return t.detail}function tF(t,e){return V1(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function rF(t){return process.env[t]}async function nF(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 Nb(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 sF(){return["usage: lmctl init [options]","","One-time provider lifecycle setup. Detects which provider CLIs",`(${zi.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(`
2090
- `)}var zi,td,z1,rd=T(()=>{"use strict";Se();zi=["claude","codex","gemini","opencode","qwen","copilot","agy"],td={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"}};z1={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:[Qu(Zu(),".gemini","oauth_creds.json")]},copilot:{kind:"env-or-file",envVars:["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"],filePaths:[Qu(Zu(),".copilot","credentials.json")]},agy:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[Qu(Zu(),".gemini","oauth_creds.json")]}}});var Lb={};ie(Lb,{initWorkspace:()=>Ob,runWorkspace:()=>dF,setWorkspaceProvider:()=>Cb});import{copyFileSync as oF,cpSync as iF,existsSync as Ce,mkdirSync as zt,readdirSync as sd,renameSync as aF,rmSync as Zi,statSync as Qi,writeFileSync as lF}from"node:fs";import{spawnSync as cF}from"node:child_process";import{homedir as jb}from"node:os";import{dirname as od,join as fs}from"node:path";async function dF(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(uF),0;switch(r){case"list":return fF(n,e);case"create":return mF(n,e);case"use":return pF(n,e);case"show":return _F(n,e);case"delete":return hF(n,e);case"migrate":return gF(n,e);case"init":return Ob(n,e);case"set-provider":return Cb(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function Ab(){let t=ps(),e=[],r=new Set,n=er.default,s=Ce(cn()),o=Ce(ht(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Ot(n):cn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Ce(Qt())){let i;try{i=sd(Qt())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Pe(a))continue;let l=!1;try{l=Qi(ht(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 fF(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=Ab();if(D(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}
2091
- `)}return 0}function mF(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=ht(n);if(Ce(s))return w(e,`workspace already exists: ${n} (${s})`);let o=x(r,"--docroot")??ra(n);zt(s,{recursive:!0}),zt(o,{recursive:!0});let i=Ot(n);zt(od(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 D(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2092
- `),0}function pF(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!==er.default&&!Ce(ht(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=ms();return zt(od(s),{recursive:!0}),lF(s,`${n}
2113
+ `),1}}function fs(t,e){let r=td[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 ed(t,e){let r=fs(t,e.spawn);if(r.status==="missing"||r.status==="skipped"||r.status==="unverified")return r;let n=td[t],s=Z1[t];if(s.kind==="spawn"){let a=e.spawn(s.cmd,s.args),l=(a.stdout??"").toString(),c=(a.stderr??"").toString(),u=`${l}
2114
+ ${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 Q1(t,e){let r=Math.max(...zi.map(n=>n.length));for(let n of e){let s=eF(n.status),o=n.provider.padEnd(r," ");t.stdout.write(` ${o} ${s} ${n.detail}
2115
+ `)}}function eF(t){switch(t){case"ok":return"\u2713";case"unauthed":return"\u26A0";case"unverified":return"?";case"missing":return"\u2717";case"skipped":return"-"}}function tF(t){return t.detail}function rF(t,e){return K1(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function nF(t){return process.env[t]}async function sF(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 Nb(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 oF(){return["usage: lmctl init [options]","","One-time provider lifecycle setup. Detects which provider CLIs",`(${zi.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(`
2116
+ `)}var zi,td,Z1,rd=T(()=>{"use strict";Se();zi=["claude","codex","gemini","opencode","qwen","copilot","agy"],td={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"}};Z1={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:[Qu(Zu(),".gemini","oauth_creds.json")]},copilot:{kind:"env-or-file",envVars:["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"],filePaths:[Qu(Zu(),".copilot","credentials.json")]},agy:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[Qu(Zu(),".gemini","oauth_creds.json")]}}});var Lb={};ie(Lb,{initWorkspace:()=>Ob,runWorkspace:()=>fF,setWorkspaceProvider:()=>Cb});import{copyFileSync as iF,cpSync as aF,existsSync as Ce,mkdirSync as Yt,readdirSync as sd,renameSync as lF,rmSync as Zi,statSync as Qi,writeFileSync as cF}from"node:fs";import{spawnSync as uF}from"node:child_process";import{homedir as jb}from"node:os";import{dirname as od,join as ms}from"node:path";async function fF(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(dF),0;switch(r){case"list":return mF(n,e);case"create":return pF(n,e);case"use":return _F(n,e);case"show":return hF(n,e);case"delete":return gF(n,e);case"migrate":return wF(n,e);case"init":return Ob(n,e);case"set-provider":return Cb(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function Ab(){let t=_s(),e=[],r=new Set,n=Qt.default,s=Ce(cn()),o=Ce(ht(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Rt(n):cn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Ce(Zt())){let i;try{i=sd(Zt())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Pe(a))continue;let l=!1;try{l=Qi(ht(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Rt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function mF(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=Ab();if(D(r,"--json"))return W(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2117
+ `)}return 0}function pF(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=ht(n);if(Ce(s))return w(e,`workspace already exists: ${n} (${s})`);let o=x(r,"--docroot")??ra(n);Yt(s,{recursive:!0}),Yt(o,{recursive:!0});let i=Rt(n);Yt(od(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 D(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2118
+ `),0}function _F(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!==Qt.default&&!Ce(ht(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=ps();return Yt(od(s),{recursive:!0}),cF(s,`${n}
2093
2119
  `),D(r,"--json")?W(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2094
- `),0}function _F(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=Ab().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=Ce(s.db_path)?Qi(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Ce(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 D(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2095
- `),0}function hF(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(!D(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===er.default&&!D(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(ps()===n&&!D(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=ht(n);return Ce(o)?(Zi(o,{recursive:!0,force:!0}),D(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2096
- `),0):w(e,`workspace not found: ${n}`)}function nd(t,e,r){try{aF(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
2097
- `),Qi(t).isDirectory()?iF(t,e,{recursive:!0}):oF(t,e),!Ce(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);Zi(t,{recursive:!0,force:!0})}function gF(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=D(r,"--json"),s=na(),o=Qt(),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}
2120
+ `),0}function hF(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=Ab().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=Ce(s.db_path)?Qi(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Ce(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 D(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2121
+ `),0}function gF(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(!D(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===Qt.default&&!D(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(_s()===n&&!D(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=ht(n);return Ce(o)?(Zi(o,{recursive:!0,force:!0}),D(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2122
+ `),0):w(e,`workspace not found: ${n}`)}function nd(t,e,r){try{lF(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
2123
+ `),Qi(t).isDirectory()?aF(t,e,{recursive:!0}):iF(t,e),!Ce(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);Zi(t,{recursive:!0,force:!0})}function wF(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=D(r,"--json"),s=na(),o=Zt(),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}
2098
2124
  `);e.stdout.write(f?`migration complete
2099
2125
  `:`${m??"nothing to migrate"}
2100
- `)}return 0};if(!Ce(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=sd(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Qi(fs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Zi(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Ce(o))nd(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Ce(fs(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\`)`);zt(o,{recursive:!0});for(let m of c)nd(fs(s,m),fs(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{sd(s).length===0&&(Zi(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=bd(),d=ms();return Ce(u)&&(Ce(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(nd(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function Rb(t,e){return cF(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function EF(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 xb(t){return t==="~"?jb():t.startsWith("~/")?fs(jb(),t.slice(2)):t}async function Ob(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: ${an.join(", ")}.`].join(`
2126
+ `)}return 0};if(!Ce(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=sd(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Qi(ms(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Zi(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Ce(o))nd(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Ce(ms(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\`)`);Yt(o,{recursive:!0});for(let m of c)nd(ms(s,m),ms(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{sd(s).length===0&&(Zi(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=bd(),d=ps();return Ce(u)&&(Ce(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(nd(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function Rb(t,e){return uF(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function bF(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 xb(t){return t==="~"?jb():t.startsWith("~/")?ms(jb(),t.slice(2)):t}async function Ob(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: ${an.join(", ")}.`].join(`
2101
2127
  `)+`
2102
- `),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??Rb,a=an.map(S=>ds(S,o)).filter(S=>S.status==="ok"||S.status==="unverified").map(S=>S.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${an.join("|")} first (see \`lmctl init\`)
2103
- `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??EF,u=r.promptLine!==void 0||l,d=S=>(e.stderr.write(`error: ${S} is required in non-interactive mode (no TTY); pass it explicitly
2128
+ `),0;let s=P(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return w(e,s.error);if(s.positionals.length!==0)return w(e,n);let o=r.spawn??Rb,a=an.map(S=>fs(S,o)).filter(S=>S.status==="ok"||S.status==="unverified").map(S=>S.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${an.join("|")} first (see \`lmctl init\`)
2129
+ `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??bF,u=r.promptLine!==void 0||l,d=S=>(e.stderr.write(`error: ${S} is required in non-interactive mode (no TTY); pass it explicitly
2104
2130
  `),2),f,m=x(s,"--name");if(m!==void 0){if(!Pe(m))return e.stderr.write(`error: invalid workspace name: ${m}
2105
2131
  `),2;f=m}else{if(!u)return d("--name");for(;;){let S=(await c("Workspace name [default]: ")).trim(),R=S.length===0?"default":S;if(Pe(R)){f=R;break}e.stderr.write(`invalid workspace name: ${R} (letters/digits/.-_, start alnum, \u226464)
2106
2132
  `)}}let p=ht(f);if(Ce(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2107
- `),2;let h,g=x(s,"--basedir"),_=ra(f);if(g!==void 0)h=xb(g);else{if(!u)return d("--basedir");let S=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=S.length===0?_:xb(S)}let y={};for(let S of["provider1","provider2","provider3"]){let R=x(s,`--${S}`),L=wF[S],q=a.includes(L)?L:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${S} ${R} is not an available provider (available: ${a.join(", ")})
2108
- `),2;y[S]=R;continue}if(!u)return d(`--${S}`);for(;;){let ee=(await c(`${S} (${yF[S]}) [${q}]: `)).trim(),j=ee.length===0?q:ee;if(a.includes(j)){y[S]=j;break}e.stderr.write(`not an available provider: ${j} (available: ${a.join(", ")})
2109
- `)}}zt(p,{recursive:!0}),zt(h,{recursive:!0});let k=Ot(f);zt(od(k),{recursive:!0});let v=pe({path:k});try{v.setConfig("project.docroot",h),v.setConfig("workspace.provider1",y.provider1),v.setConfig("workspace.provider2",y.provider2),v.setConfig("workspace.provider3",y.provider3)}finally{v.close()}let $={name:f,dir:p,db_path:k,basedir:h,providers:{...y}};return D(s,"--json")?W(e,$):(e.stdout.write(`created workspace ${f} at ${p}
2133
+ `),2;let h,g=x(s,"--basedir"),_=ra(f);if(g!==void 0)h=xb(g);else{if(!u)return d("--basedir");let S=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=S.length===0?_:xb(S)}let y={};for(let S of["provider1","provider2","provider3"]){let R=x(s,`--${S}`),L=yF[S],q=a.includes(L)?L:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${S} ${R} is not an available provider (available: ${a.join(", ")})
2134
+ `),2;y[S]=R;continue}if(!u)return d(`--${S}`);for(;;){let ee=(await c(`${S} (${EF[S]}) [${q}]: `)).trim(),j=ee.length===0?q:ee;if(a.includes(j)){y[S]=j;break}e.stderr.write(`not an available provider: ${j} (available: ${a.join(", ")})
2135
+ `)}}Yt(p,{recursive:!0}),Yt(h,{recursive:!0});let k=Rt(f);Yt(od(k),{recursive:!0});let v=pe({path:k});try{v.setConfig("project.docroot",h),v.setConfig("workspace.provider1",y.provider1),v.setConfig("workspace.provider2",y.provider2),v.setConfig("workspace.provider3",y.provider3)}finally{v.close()}let $={name:f,dir:p,db_path:k,basedir:h,providers:{...y}};return D(s,"--json")?W(e,$):(e.stdout.write(`created workspace ${f} at ${p}
2110
2136
  `),e.stdout.write(` basedir: ${h}
2111
2137
  `),e.stdout.write(` provider1=${y.provider1} provider2=${y.provider2} provider3=${y.provider3}
2112
2138
  `),e.stdout.write(`activate it with: lmctl workspace use ${f}
2113
2139
  `)),0}async function Cb(t,e,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${an.join(", ")}.`].join(`
2114
2140
  `)+`
2115
2141
  `),0;let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let[o,i,...a]=s.positionals;if(o===void 0||i===void 0||a.length!==0)return w(e,n);let l=/^provider[123]$/.test(o)?o:/^[123]$/.test(o)?`provider${o}`:null;if(l===null)return e.stderr.write(`error: invalid slot: ${o} (expected provider1, provider2, or provider3)
2116
- `),2;let c=r.spawn??Rb,u=an.map(p=>ds(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 ${an.join("|")} first (see \`lmctl init\`)
2142
+ `),2;let c=r.spawn??Rb,u=an.map(p=>fs(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 ${an.join("|")} first (see \`lmctl init\`)
2117
2143
  `),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
2118
- `),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=un()??er.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2119
- `),0}var uF,an,wF,yF,Mb=T(()=>{"use strict";Le();rd();Se();qe();uF=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2144
+ `),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=un()??Qt.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2145
+ `),0}var dF,an,yF,EF,Mb=T(()=>{"use strict";Le();rd();Se();qe();dF=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2120
2146
 
2121
2147
  Manage isolated workspace state directories, active workspace selection,
2122
2148
  legacy profile migration, and configured provider slots.
2123
- `;an=["claude","codex","gemini","qwen"],wF={provider1:"claude",provider2:"codex",provider3:"gemini"},yF={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var Fb={};ie(Fb,{runProject:()=>kF});import{existsSync as bF,statSync as TF}from"node:fs";import{join as Pb}from"node:path";async function kF(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(SF),0;try{return await J(e,s=>{switch(r){case"create":return OF(n,e,s);case"list":return CF(n,e,s);case"show":return AF(n,e,s);case"status":return RF(n,e,s);case"workflow":return vF(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return fe(e,s)}}function vF(t,e,r){let[n,...s]=t;switch(n){case"add":return IF(s,e,r);case"list":return NF(s,e,r);case"show":return $F(s,e,r);case"remove":return jF(s,e,r);case"enable":return Db(s,e,r,!0);case"disable":return Db(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function IF(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=x(n,"--condition")??null;if(l!==null)try{Ht(l)}catch{return w(e,"invalid --condition JEXL")}let c=xF(x(n,"--params"));if(typeof c=="string")return w(e,c);let u=x(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 D(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
2124
- `),0}function NF(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 D(n,"--json")?W(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2149
+ `;an=["claude","codex","gemini","qwen"],yF={provider1:"claude",provider2:"codex",provider3:"gemini"},EF={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var Fb={};ie(Fb,{runProject:()=>vF});import{existsSync as TF,statSync as SF}from"node:fs";import{join as Pb}from"node:path";async function vF(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(kF),0;try{return await J(e,s=>{switch(r){case"create":return CF(n,e,s);case"list":return LF(n,e,s);case"show":return RF(n,e,s);case"status":return OF(n,e,s);case"workflow":return IF(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return fe(e,s)}}function IF(t,e,r){let[n,...s]=t;switch(n){case"add":return NF(s,e,r);case"list":return $F(s,e,r);case"show":return jF(s,e,r);case"remove":return xF(s,e,r);case"enable":return Db(s,e,r,!0);case"disable":return Db(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function NF(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=x(n,"--condition")??null;if(l!==null)try{qt(l)}catch{return w(e,"invalid --condition JEXL")}let c=AF(x(n,"--params"));if(typeof c=="string")return w(e,c);let u=x(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 D(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
2150
+ `),0}function $F(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 D(n,"--json")?W(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2125
2151
  `)}${i.length>0?`
2126
- `:""}`),0}function $F(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=id(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}`):(D(n,"--json")?W(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2127
- `),0)}function jF(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=id(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}
2152
+ `:""}`),0}function jF(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=id(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}`):(D(n,"--json")?W(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2153
+ `),0)}function xF(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=id(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}
2128
2154
  `),0):w(e,`project workflow not found: ${s}`)}function Db(t,e,r,n){let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let o=id(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}`):(D(s,"--json")?W(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2129
- `),0)}function xF(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 id(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function AF(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 D(n,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2130
- `),0}function RF(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 D(n,"--json")?W(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2131
- `),0}function OF(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=x(n,"--owner"),i=x(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=x(n,"--local-path")??(l!==null?Pb(l,u):void 0),f=x(n,"--workflow"),m=x(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=x(n,"--test-argv"),g=null;if(h!==void 0)try{let v=JSON.parse(h);if(!Array.isArray(v)||!v.every($=>typeof $=="string")||v.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(v)}catch{return w(e,"--test-argv must be valid JSON")}let _=x(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let y=_!==void 0?_:LF(d)||$n(d)?"folder":"db",k=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:x(n,"--default-branch")??null,test_argv:g,durable_memory_mode:y});return D(n,"--json")?W(e,k):e.stdout.write(`created project ${k.name}
2132
- `),0}function CF(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return D(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2155
+ `),0)}function AF(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 id(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function RF(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 D(n,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2156
+ `),0}function OF(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 D(n,"--json")?W(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2157
+ `),0}function CF(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=x(n,"--owner"),i=x(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=x(n,"--local-path")??(l!==null?Pb(l,u):void 0),f=x(n,"--workflow"),m=x(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=x(n,"--test-argv"),g=null;if(h!==void 0)try{let v=JSON.parse(h);if(!Array.isArray(v)||!v.every($=>typeof $=="string")||v.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(v)}catch{return w(e,"--test-argv must be valid JSON")}let _=x(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let y=_!==void 0?_:MF(d)||$n(d)?"folder":"db",k=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:x(n,"--default-branch")??null,test_argv:g,durable_memory_mode:y});return D(n,"--json")?W(e,k):e.stdout.write(`created project ${k.name}
2158
+ `),0}function LF(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return D(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2133
2159
  `)}${s.length>0?`
2134
- `:""}`),0}function LF(t){try{let e=Pb(t,"durable-memory");return bF(e)&&TF(e).isDirectory()}catch{return!1}}var SF,Ub=T(()=>{"use strict";Se();Br();jn();SF=`usage: lmctl project <create|list|show|status|workflow>
2160
+ `:""}`),0}function MF(t){try{let e=Pb(t,"durable-memory");return TF(e)&&SF(e).isDirectory()}catch{return!1}}var kF,Ub=T(()=>{"use strict";Se();Br();jn();kF=`usage: lmctl project <create|list|show|status|workflow>
2135
2161
 
2136
2162
  Create, list, inspect, and check projects. The workflow subcommand manages
2137
2163
  per-project workflow bindings and routing conditions.
2138
- `});import{createHash as MF,randomBytes as DF}from"node:crypto";import{readFile as PF}from"node:fs/promises";function Wb(t=new Date,e=DF(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 FF(t){return MF("sha256").update(t).digest("hex")}async function Bb(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await PF(n);return{path:r,sha256:FF(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function qb(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=T(()=>{"use strict"});import{spawnSync as Hb}from"node:child_process";import{mkdir as ld,writeFile as Jb,readFile as UF,rm as Xb}from"node:fs/promises";import{tmpdir as WF}from"node:os";import{dirname as Gb,join as cd}from"node:path";async function Vb(t){let e=t.stagingDir??cd(WF(),`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(Gb(m),{recursive:!0}),typeof f=="string")await Jb(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await Jb(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2164
+ `});import{createHash as DF,randomBytes as PF}from"node:crypto";import{readFile as FF}from"node:fs/promises";function Wb(t=new Date,e=PF(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 UF(t){return DF("sha256").update(t).digest("hex")}async function Bb(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await FF(n);return{path:r,sha256:UF(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function qb(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=T(()=>{"use strict"});import{spawnSync as Hb}from"node:child_process";import{mkdir as ld,writeFile as Jb,readFile as WF,rm as Xb}from"node:fs/promises";import{tmpdir as BF}from"node:os";import{dirname as Gb,join as cd}from"node:path";async function Vb(t){let e=t.stagingDir??cd(BF(),`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(Gb(m),{recursive:!0}),typeof f=="string")await Jb(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await Jb(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2139
2165
  `;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
2140
2166
  `:`${d.pid}
2141
2167
  # source=${d.pid_source} alive=${String(d.pid_alive)}
@@ -2153,29 +2179,29 @@ per-project workflow bindings and routing conditions.
2153
2179
  `:`# source=${f}
2154
2180
  # tail_lines=${d.tail_lines}
2155
2181
  `;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
2156
- `:""}`)}if(await s("README.md",BF(t)),t.sanitized)for(let d of n){let f=await UF(d.absPath);try{Id(d.bundlePath,f.toString("utf8"))}catch(m){throw await Xb(e,{recursive:!0,force:!0}),m instanceof tr,m}}let i=await Bb(n),a=qb({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(Gb(t.outputPath),{recursive:!0});let l=Hb("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=Hb("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await Xb(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function BF(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(`
2157
- `)}var Kb=T(()=>{"use strict";ad();_s()});import{spawnSync as qF}from"node:child_process";import{stat as HF}from"node:fs/promises";async function Yb(t){try{if(!(await HF(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 JF(t);case"hq":return XF(t)}}function JF(t){let r=qF("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 XF(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 zb=T(()=>{"use strict"});var Qb={};ie(Qb,{parseDiagnoseArgs:()=>Zb,runDiagnose:()=>KF});import{tmpdir as GF}from"node:os";import{join as VF}from"node:path";async function KF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${ZF()}
2182
+ `:""}`)}if(await s("README.md",qF(t)),t.sanitized)for(let d of n){let f=await WF(d.absPath);try{Id(d.bundlePath,f.toString("utf8"))}catch(m){throw await Xb(e,{recursive:!0,force:!0}),m instanceof er,m}}let i=await Bb(n),a=qb({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(Gb(t.outputPath),{recursive:!0});let l=Hb("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=Hb("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await Xb(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function qF(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2183
+ `)}var Kb=T(()=>{"use strict";ad();hs()});import{spawnSync as HF}from"node:child_process";import{stat as JF}from"node:fs/promises";async function Yb(t){try{if(!(await JF(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 XF(t);case"hq":return GF(t)}}function XF(t){let r=HF("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 GF(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 zb=T(()=>{"use strict"});var Qb={};ie(Qb,{parseDiagnoseArgs:()=>Zb,runDiagnose:()=>YF});import{tmpdir as VF}from"node:os";import{join as KF}from"node:path";async function YF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${QF()}
2158
2184
  `),0;let r=Zb(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2159
2185
  `),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
2160
2186
  `),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2161
- `),2;let n=Wb(),s=r.outputPath??zF(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await J(e,async i=>{let a=await $d({dal:i,include:r.include,dbPath:de(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Vb({ticketId:n,data:a,outputPath:s,lmctlNextVersion:rr(),sanitized:!r.noSanitize})}catch(d){if(d instanceof tr)return e.stderr.write(`sanitization failed: ${d.message}
2187
+ `),2;let n=Wb(),s=r.outputPath??ZF(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await J(e,async i=>{let a=await $d({dal:i,include:r.include,dbPath:de(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Vb({ticketId:n,data:a,outputPath:s,lmctlNextVersion:tr(),sanitized:!r.noSanitize})}catch(d){if(d instanceof er)return e.stderr.write(`sanitization failed: ${d.message}
2162
2188
  `),2;throw d}let c=await Yb({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)}
2163
2189
  `):(e.stdout.write(`ticket: ${n}
2164
2190
  `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2165
2191
  `),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2166
2192
  `)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
2167
- `),1}}function Zb(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(!YF(o))return`unknown section: ${o} (expected one of ${hs.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 YF(t){return hs.includes(t)}function zF(t){return VF(GF(),`lmctl-diag-${t}.tar.gz`)}function ZF(){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(`
2168
- `)}var eT=T(()=>{"use strict";gs();Kb();ad();_s();zb();qe();Se()});var aT={};ie(aT,{ATTENTION_STATES:()=>dd,DAEMON_INTERVAL_FAST_MS:()=>ud,REQUIRED_TEAM_ALIASES:()=>rT,chooseDiagnoses:()=>oT,collectEvidence:()=>sT,diagnose:()=>nT,renderReport:()=>iT,runDiagnosePrompt:()=>tU});function nT(t,e){let r=sT(t,e),n=oT(r);return iT(r,n)}function sT(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:Kn(),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=eU(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=rT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function oT(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>ud&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${ud}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 iT(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: ${QF(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(`
2193
+ `),1}}function Zb(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(!zF(o))return`unknown section: ${o} (expected one of ${gs.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function zF(t){return gs.includes(t)}function ZF(t){return KF(VF(),`lmctl-diag-${t}.tar.gz`)}function QF(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
2194
+ `)}var eT=T(()=>{"use strict";ws();Kb();ad();hs();zb();qe();Se()});var aT={};ie(aT,{ATTENTION_STATES:()=>dd,DAEMON_INTERVAL_FAST_MS:()=>ud,REQUIRED_TEAM_ALIASES:()=>rT,chooseDiagnoses:()=>oT,collectEvidence:()=>sT,diagnose:()=>nT,renderReport:()=>iT,runDiagnosePrompt:()=>rU});function nT(t,e){let r=sT(t,e),n=oT(r);return iT(r,n)}function sT(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:Kn(),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=tU(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=rT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function oT(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>ud&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${ud}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 iT(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: ${eU(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(`
2169
2195
  `)+`
2170
- `}function QF(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 eU(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function tU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${tT()}
2196
+ `}function eU(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 tU(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function rU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${tT()}
2171
2197
  `),0;let r=t.filter(s=>!s.startsWith("--"));if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2172
2198
  `),e.stderr.write(`${tT()}
2173
2199
  `),2;let n=r[0];try{return await J(e,s=>(e.stdout.write(nT(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2174
2200
  `),1}}function tT(){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(`
2175
- `)}var rT,ud,dd,lT=T(()=>{"use strict";Gc();Se();rT=["Coder","Reviewer1","Polisher"],ud=3e4,dd=new Set(["attention_needed","paused","escalation"])});var fT={};ie(fT,{appendIntent:()=>dT,resolveIntentLogPath:()=>uT,runStatus:()=>uU});import{appendFileSync as rU,mkdirSync as nU}from"node:fs";import{homedir as sU}from"node:os";import{dirname as oU,join as iU}from"node:path";function uT(){return process.env.LMCTL_INTENT_LOG??iU(sU(),".lmctl","recent-intents.log")}function dT(t){try{let e=uT();nU(oU(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});rU(e,`${r}
2176
- `)}catch{}}async function uU(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(cU),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=D(r,"--web"),s=x(r,"--project"),o=D(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):J(e,i=>{let a=dU(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2201
+ `)}var rT,ud,dd,lT=T(()=>{"use strict";Gc();Se();rT=["Coder","Reviewer1","Polisher"],ud=3e4,dd=new Set(["attention_needed","paused","escalation"])});var fT={};ie(fT,{appendIntent:()=>dT,resolveIntentLogPath:()=>uT,runStatus:()=>dU});import{appendFileSync as nU,mkdirSync as sU}from"node:fs";import{homedir as oU}from"node:os";import{dirname as iU,join as aU}from"node:path";function uT(){return process.env.LMCTL_INTENT_LOG??aU(oU(),".lmctl","recent-intents.log")}function dT(t){try{let e=uT();sU(iU(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});nU(e,`${r}
2202
+ `)}catch{}}async function dU(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(uU),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=D(r,"--web"),s=x(r,"--project"),o=D(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):J(e,i=>{let a=fU(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.
2177
2203
  `),1;if(a.kind==="no-web-focus")return e.stderr.write(`no active webui focus; run lmctl status --web after navigating webui to a project, or omit --web.
2178
- `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=fU(i,l,a.source);return o?W(e,c):e.stdout.write(wU(c)),dT({verb:"status",args:t}),0})}function dU(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=Xu(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function fU(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=mU(t,e.id,lU),a=pU(t,e.id),l=_U(t,e.id,aU),c=hU(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:gU(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 mU(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 pU(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 _U(t,e,r){return t.db.prepare(`
2204
+ `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=mU(i,l,a.source);return o?W(e,c):e.stdout.write(yU(c)),dT({verb:"status",args:t}),0})}function fU(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=Xu(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function mU(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=pU(t,e.id,cU),a=_U(t,e.id),l=hU(t,e.id,lU),c=gU(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:wU(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 pU(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 _U(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 hU(t,e,r){return t.db.prepare(`
2179
2205
  SELECT r.*, w.name AS workflow_name
2180
2206
  FROM run r
2181
2207
  JOIN job j ON j.id = r.job_id
@@ -2183,14 +2209,14 @@ per-project workflow bindings and routing conditions.
2183
2209
  WHERE j.project_id = ?
2184
2210
  ORDER BY r.id DESC
2185
2211
  LIMIT ?
2186
- `).all(e,r)}function hU(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 gU(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 cT(o,100)}}}catch{}return cT(t,100)}function cT(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function wU(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(`
2187
- `)}var aU,lU,cU,mT=T(()=>{"use strict";Se();Gu();aU=5,lU=10,cU=`usage: lmctl status [--project NAME|--web] [--json]
2212
+ `).all(e,r)}function gU(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 wU(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 cT(o,100)}}}catch{}return cT(t,100)}function cT(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function yU(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(`
2213
+ `)}var lU,cU,uU,mT=T(()=>{"use strict";Se();Gu();lU=5,cU=10,uU=`usage: lmctl status [--project NAME|--web] [--json]
2188
2214
 
2189
2215
  Show the current project context, active run, unacked attentions, recent runs,
2190
2216
  and active providers. Defaults to resolving the project from the current
2191
2217
  working directory; --project selects a project by name, and --web uses the
2192
2218
  web UI focus.
2193
- `});var gT="Failed to find Response internal state key",wT="SQLite is an experimental feature and might change at any time",_d=Symbol.for("lmctl.suppressThirdpartyNoise.installed"),hd=globalThis;if(hd[_d]!==!0){hd[_d]=!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]===gT||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===wT))return e(r,...n)}}qe();gs();import{pathToFileURL as yU}from"node:url";var pd=`usage: lmctl [--db PATH] [--workspace NAME] <command> [args]
2219
+ `});var gT="Failed to find Response internal state key",wT="SQLite is an experimental feature and might change at any time",_d=Symbol.for("lmctl.suppressThirdpartyNoise.installed"),hd=globalThis;if(hd[_d]!==!0){hd[_d]=!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]===gT||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===wT))return e(r,...n)}}qe();ws();import{pathToFileURL as EU}from"node:url";var pd=`usage: lmctl [--db PATH] [--workspace NAME] <command> [args]
2194
2220
  `,fd=`${pd}
2195
2221
  Setup & status:
2196
2222
  init Detect provider CLIs, verify auth, and persist active providers.
@@ -2214,7 +2240,7 @@ Teams & sessions:
2214
2240
  ls List provider sessions or recent runs.
2215
2241
  lint Validate an lmctl teamfile.
2216
2242
  seed Seed missing session ids in an lmctl teamfile.
2217
- connect Append a _CONNECT_ edge from one teamfile to a target alias.
2243
+ connect Append a _CONNECT_ edge from one teamfile to a target member.
2218
2244
  clone Copy a teamfile template and strip session ids.
2219
2245
 
2220
2246
  Workflows & projects:
@@ -2229,15 +2255,15 @@ Maintenance:
2229
2255
  db Database utilities, including the documented downgrade stub.
2230
2256
 
2231
2257
  Run 'lmctl help <command>' for command-specific help.
2232
- `,EU=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 md(t,e){return t.stderr.write(`error: ${e}
2258
+ `,bU=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 md(t,e){return t.stderr.write(`error: ${e}
2233
2259
  ${pd}Run 'lmctl help' for usage.
2234
2260
  `),2}function _T(t,e){return t.stderr.write(`error: unknown command: ${e}
2235
2261
  ${pd}Run 'lmctl help' for usage.
2236
- `),1}async function bU(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 md(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 md(e,"missing value for --workspace");if(!Pe(l))return md(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 ${rr()}
2237
- `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(fd),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(fd),0):EU.has(i)?pT(i,[...a,"--help"],e):_T(e,i)}Ed(de(),e.stderr),Td(e.stderr);let[s,...o]=r;return s===void 0?(e.stdout.write(fd),0):pT(s,o,e)}async function pT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(hl(),qm));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Cl(),wp));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(xy(),jy));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(Ry(),Ay));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(zy(),Yy));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(nE(),rE));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(dE(),uE));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(mE(),fE));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(hE(),_E));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(TE(),bE));return n(e,r)}case"info":{let{runInfo:n}=await Promise.resolve().then(()=>(kE(),SE));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(NE(),IE));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Uu(),Fu));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Uu(),Fu));return n(e,r)}case"connect":{let{runConnect:n}=await Promise.resolve().then(()=>(zE(),YE));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(rb(),tb));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(ib(),ob));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(ub(),cb));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Ib(),vb));return n(e,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(Mb(),Lb));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(Ub(),Fb));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(eT(),Qb));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(lT(),aT));return n(e,r)}case"init":{let{runInit:n}=await Promise.resolve().then(()=>(rd(),$b));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(mT(),fT));return n(e,r)}case"db":return TU(e,r);default:return _T(r,t)}}function TU(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2262
+ `),1}async function TU(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 md(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 md(e,"missing value for --workspace");if(!Pe(l))return md(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 ${tr()}
2263
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(fd),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(fd),0):bU.has(i)?pT(i,[...a,"--help"],e):_T(e,i)}Ed(de(),e.stderr),Td(e.stderr);let[s,...o]=r;return s===void 0?(e.stdout.write(fd),0):pT(s,o,e)}async function pT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(hl(),qm));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Cl(),wp));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(xy(),jy));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(Ry(),Ay));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(zy(),Yy));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(nE(),rE));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(dE(),uE));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(mE(),fE));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(hE(),_E));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(TE(),bE));return n(e,r)}case"info":{let{runInfo:n}=await Promise.resolve().then(()=>(kE(),SE));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(NE(),IE));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Uu(),Fu));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Uu(),Fu));return n(e,r)}case"connect":{let{runConnect:n}=await Promise.resolve().then(()=>(zE(),YE));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(rb(),tb));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(ib(),ob));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(ub(),cb));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Ib(),vb));return n(e,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(Mb(),Lb));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(Ub(),Fb));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(eT(),Qb));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(lT(),aT));return n(e,r)}case"init":{let{runInit:n}=await Promise.resolve().then(()=>(rd(),$b));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(mT(),fT));return n(e,r)}case"db":return SU(e,r);default:return _T(r,t)}}function SU(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2238
2264
 
2239
2265
  Database utilities. The downgrade command is currently a documented stub;
2240
2266
  restore from backup for rollback and use normal migrations for forward changes.
2241
2267
  `),0):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
2242
2268
  `),1):(e.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
2243
- `),1)}if(process.argv[1]!==void 0&&import.meta.url===yU(process.argv[1]).href){let t=await bU(process.argv.slice(2));process.exitCode=t}export{bU as runCli};
2269
+ `),1)}if(process.argv[1]!==void 0&&import.meta.url===EU(process.argv[1]).href){let t=await TU(process.argv.slice(2));process.exitCode=t}export{TU as runCli};